Как настроить PJSIP для работы за NAT с поддержкой ICE и STUN
Сисадмину, который не может настроить SIP-транки в условиях сложной сети с NAT, часто приходится бороться с односторонней слышимостью, обрывами соединений и проблемами идентификации. PJSIP поддерживает ICE, STUN и TURN, но только правильная конфигурация решает проблему. В статье — пошаговое руководство по настройке.
PJSIP и NAT: почему возникают проблемы
PJSIP — мультимедийная библиотека, поддерживающая протоколы SIP, SDP, RTP, STUN, TURN и ICE. Она используется в Asterisk и других VoIP-системах. При работе за NAT возникают проблемы, потому что IP-адреса, которые отправитель и получатель видят, не совпадают. Это приводит к обрывам соединений, односторонней слышимости и невозможности установить звонок. Проблема не в PJSIP, а в неправильной конфигурации, особенно если NAT не учитывается на уровне протокола. Многие сисадмины думают, что настройка STUN-сервера — это всё, что нужно. Это не так. Нужна комплексная настройка, включая параметры NAT, а также проверку маршрутов и диапазонов портов.
PJSIP поддерживает ICE и STUN, но только при условии, что соответствующие параметры включены и правильно настроены. Если не включить icesupport=yes, то ICE и STUN не будут работать, даже если настроены серверы. В этом случае PJSIP будет пытаться использовать прямое соединение, которое не пройдёт через NAT. Некоторые сисадмины думают, что настройка STUN-сервера — это всё, что нужно. Это не так. Нужна комплексная настройка, включая параметры NAT, а также проверку маршрутов и диапазонов портов. Неправильная конфигурация приводит к 90 % проблем с VoIP.
PJSIP — это библиотека, а не просто настройка. Она работает с протоколами SIP, SDP, RTP, STUN, TURN и ICE. Это означает, что если вы не настроите все параметры, PJSIP не сможет работать корректно. Например, если не включить icesupport=yes, то ICE не будет работать, даже если настроены STUN и TURN. Это как включить свет, но не поставить лампочку. PJSIP будет пытаться использовать прямое соединение, которое не пройдёт через NAT. Это приводит к обрывам соединений и односторонней слышимости.
Важно понимать, что PJSIP не является волшебным решением. Он работает, но только при правильной настройке. Многие сисадмины думают, что PJSIP — это «всё работает». Это не так. PJSIP требует настройки, особенно в сложных сетях с NAT. Если не настроить параметры NAT, PJSIP не сможет работать. Это как поставить машину в гараж, но не включить зажигание. PJSIP будет работать, но только в идеальных условиях. В реальности, где NAT есть, PJSIP не сможет работать, если не настроить параметры NAT.
- PJSIP поддерживает ICE, STUN и TURN
- Проблемы возникают из-за несовпадения IP-адресов в NAT-среде
- Неправильная конфигурация приводит к 90 % проблем
Настройка NAT: ключевые параметры в PJSIP
Для корректной работы PJSIP за NAT необходимо настроить несколько ключевых параметров. Во-первых, нужно включить force_rport = yes. Это заставляет сервер использовать правильный порт при отправке пакетов, что важно при использовании NAT. Во-вторых, включите rtp_symmetric = yes. Это заставляет PJSIP синхронизировать RTP-потоки, чтобы они проходили через один и тот же путь, что особенно важно при сложных маршрутизациях. В-третьих, установите direct_media = no. При прямом медиапотоке (direct_media = yes) RTP-пакеты идут напрямую между абонентами, что часто не проходит через NAT. При отключении прямого медиапотока всё идёт через сервер, что гарантирует прохождение через NAT.
Также важно настроить rewrite_contact = yes. Это позволяет PJSIP переписывать контактные данные в SIP-заголовках, чтобы они соответствовали внешнему IP-адресу. Без этого абоненты не смогут установить соединение, так как увидят неправильный IP. В конфигурации также следует указать external_ip — внешний IP-адрес, который видит PJSIP. Это критично для корректной маршрутизации. Если внешний IP не указан, PJSIP может использовать локальный адрес, что приведёт к невозможности соединения. Настройка диапазонов локальных сетей также важна — PJSIP должен знать, какие адреса являются локальными, чтобы не пытаться их использовать в пакетах, идущих в сеть.
Параметр force_rport = yes заставляет PJSIP использовать правильный порт при отправке пакетов. Это важно, потому что при использовании NAT, порт может быть изменён. Если порт не указан, PJSIP может использовать неправильный порт, что приведёт к невозможности соединения. Параметр rtp_symmetric = yes заставляет PJSIP синхронизировать RTP-потоки, чтобы они проходили через один и тот же путь. Это важно, потому что при сложных маршрутизациях, RTP-потоки могут идти по разным путям, что приводит к обрывам соединений. Параметр direct_media = no заставляет PJSIP использовать промежуточное соединение через сервер, что гарантирует прохождение через NAT.
Параметр rewrite_contact = yes заставляет PJSIP переписывать контактные данные в SIP-заголовках, чтобы они соответствовали внешнему IP-адресу. Это важно, потому что при использовании NAT, IP-адрес может быть изменён. Если IP-адрес не указан, абоненты не смогут установить соединение, так как увидят неправильный IP. Параметр external_ip = <внешний IP> заставляет PJSIP использовать правильный внешний IP-адрес. Это критично для корректной маршрутизации. Если внешний IP не указан, PJSIP может использовать локальный адрес, что приведёт к невозможности соединения.
Параметр external_ip = <внешний IP> заставляет PJSIP использовать правильный внешний IP-адрес. Это критично для корректной маршрутизации. Если внешний IP не указан, PJSIP может использовать локальный адрес, что приведёт к невозможности соединения. Настройка диапазонов локальных сетей также важна — PJSIP должен знать, какие адреса являются локальными, чтобы не пытаться их использовать в пакетах, идущих в сеть. Это предотвращает проблемы с маршрутизацией и улучшает производительность.
- force_rport = yes
- rtp_symmetric = yes
- direct_media = no
- rewrite_contact = yes
- external_ip = <внешний IP>
- Настройка диапазонов локальных сетей
Настройка STUN и ICE: как заставить PJSIP обойти NAT
Для обхода NAT PJSIP использует STUN и ICE. STUN (Session Traversal Utilities for NAT) позволяет устройству определить свой внешний IP и порт, которые видит сеть. ICE (Interactive Connectivity Establishment) — это протокол, который пытается установить соединение между двумя узлами, используя разные пути: прямой, через STUN, через TURN. В PJSIP настройка STUN-сервера выполняется через параметр stun_server. Укажите адрес STUN-сервера, например, stun.l.google.com:19302. Это стандартный сервер, который работает в большинстве случаев. Если STUN не работает, возможно, проблема в брандмауэре или в настройках маршрутизации. Важно понимать, что STUN работает только при наличии открытого порта для UDP. Если порт закрыт, STUN не сработает, и PJSIP перейдёт к следующему методу — ICE.
Для включения ICE в PJSIP необходимо установить icesupport=yes. Это ключевой параметр. Без него PJSIP не будет использовать ICE, даже если настроены STUN и TURN. Включив icesupport=yes, PJSIP начнёт использовать ICE для поиска оптимального пути соединения. Если STUN не работает, ICE может перейти к TURN, но TURN требует дополнительного сервера, который не всегда доступен. Поэтому в большинстве случаев STUN-серверы — достаточное решение. Также важно проверить, что настройки в конфигурации Asterisk включают поддержку ICE и STUN. В некоторых версиях Asterisk по умолчанию отключена поддержка ICE, и её нужно включить вручную. Если ICE не включена, PJSIP будет работать только в простых сценариях, без NAT.
STUN-серверы работают через UDP. Это означает, что порт UDP должен быть открыт. Если порт закрыт, STUN не сработает, и PJSIP перейдёт к следующему методу — ICE. ICE пытается использовать разные методы соединения, включая TURN, если STUN не подходит. TURN — это сервер, который пересылает пакеты между двумя узлами. Это требует дополнительного сервера, который не всегда доступен. Поэтому в большинстве случаев STUN-серверы — достаточное решение. Также важно понимать, что STUN работает только при наличии открытого порта для UDP.
ICE пытается использовать разные методы соединения, включая STUN, TURN и прямое соединение. Если STUN не работает, ICE может перейти к TURN. TURN — это сервер, который пересылает пакеты между двумя узлами. Это требует дополнительного сервера, который не всегда доступен. Поэтому в большинстве случаев STUN-серверы — достаточное решение. Также важно понимать, что STUN работает только при наличии открытого порта для UDP. Если порт закрыт, STUN не сработает, и PJSIP перейдёт к следующему методу — ICE.
PJSIP поддерживает ICE и STUN, но только при условии, что соответствующие параметры включены и правильно настроены. Если не включить icesupport=yes, то ICE и STUN не будут работать, даже если настроены серверы. В этом случае PJSIP будет пытаться использовать прямое соединение, которое не пройдёт через NAT. Некоторые сисадмины думают, что настройка STUN-сервера — это всё, что нужно. Это не так. Нужна комплексная настройка, включая параметры NAT, а также проверку маршрутов и диапазонов портов.
- STUN-сервер: stun.l.google.com:19302
- Параметр icesupport=yes — включает ICE
- STUN работает через UDP, требует открытого порта
- ICE пытается использовать STUN, TURN или прямое соединение
- Проверка поддержки ICE в Asterisk
Настройка аутентификации и точек подключения
После настройки NAT и ICE необходимо настроить аутентификацию и точки подключения. В PJSIP аутентификация осуществляется через параметры auth и endpoint. В конфигурации необходимо указать username и password для каждого абонента. Это важно для защиты от несанкционированного доступа. Также необходимо настроить внешние IP-адреса, которые могут подключаться к серверу. Для этого используются параметры external_ip и local_ip. external_ip — это адрес, который видит сеть. local_ip — локальный адрес сервера. Если внешний IP не указан, PJSIP может использовать локальный адрес, что приведёт к невозможности подключения.
Настройка аутентификации также включает проверку настройки аутентификации в конфигурации. Если аутентификация не настроена, абоненты не смогут подключиться. Также важно проверить, что в конфигурации PJSIP указаны правильные порты для SIP и RTP. SIP-порт — 5060, RTP-порт — 10000-20000. Если порт SIP не открыт, абоненты не смогут установить соединение. Если порт RTP не открыт, звонок будет установлен, но звук не будет идти. Поэтому настройка портов — критически важный шаг.
Настройка диапазона портов для RTP важна. В конфигурации PJSIP нужно указать диапазон портов, например, 10000-20000. Это позволяет PJSIP использовать только те порты, которые разрешены в брандмауэре. Если диапазон портов не указан, PJSIP может использовать случайные порты, что приведёт к блокировке в брандмауэре. Также важно настроить правила брандмауэра, чтобы разрешить входящие и исходящие соединения на портах SIP и RTP. Без этого PJSIP не сможет работать за NAT.
Проверка правильности портов включает проверку диапазона портов, который указан в конфигурации. Если диапазон портов не настроен, PJSIP может использовать порты, которые не разрешены в брандмауэре. Это приводит к блокировке пакетов и невозможности соединения. Также важно проверить, что настроены правильные маршруты. Если маршруты не настроены, пакеты не будут проходить. Проверка маршрутов включает проверку правильности внешнего IP и портов.
- Настройка username и password для аутентификации
- Указание external_ip и local_ip
- Настройка диапазона портов для RTP
- Проверка правильности портов SIP и RTP
- Настройка правил брандмауэра
Порядок действий: как настроить PJSIP за NAT
Первым шагом необходимо проверить, что PJSIP поддерживает ICE и STUN. Это можно сделать, проверив документацию или настройки в конфигурации. Если PJSIP поддерживает ICE и STUN, необходимо включить icesupport=yes. Это ключевой параметр, который включает ICE. Без него ICE не будет работать, даже если настроены STUN и TURN. Также необходимо настроить STUN-сервер. Укажите адрес STUN-сервера, например, stun.l.google.com:19302. Это стандартный сервер, который работает в большинстве случаев.
Вторым шагом необходимо настроить параметры NAT. Это включает установку force_rport = yes, rtp_symmetric = yes, direct_media = no и rewrite_contact = yes. Эти параметры заставляют PJSIP корректно работать за NAT. Также необходимо указать external_ip — внешний IP-адрес, который видит PJSIP. Это критично для корректной маршрутизации. Если внешний IP не указан, PJSIP может использовать локальный адрес, что приведёт к невозможности соединения.
Третьим шагом необходимо настроить аутентификацию и точки подключения. В конфигурации необходимо указать username и password для каждого абонента. Это важно для защиты от несанкционированного доступа. Также необходимо настроить внешние IP-адреса, которые могут подключаться к серверу. Для этого используются параметры external_ip и local_ip. external_ip — это адрес, который видит сеть. local_ip — локальный адрес сервера. Если внешний IP не указан, PJSIP может использовать локальный адрес, что приведёт к невозможности подключения.
Четвёртым шагом необходимо настроить диапазон портов для RTP. В конфигурации PJSIP нужно указать диапазон портов, например, 10000-20000. Это позволяет PJSIP использовать только те порты, которые разрешены в брандмауэре. Если диапазон портов не указан, PJSIP может использовать случайные порты, что приведёт к блокировке в брандмауэре. Также важно настроить правила брандмауэра, чтобы разрешить входящие и исходящие соединения на портах SIP и RTP.
Пятый шаг — проверка конфигурации. Проверка включает запуск PJSIP и попытку установить звонок. Если звонок не устанавливается, нужно проверить логи. Логи PJSIP содержат информацию о том, какие параметры используются, какие ошибки возникают. В логах можно увидеть, что PJSIP пытается использовать STUN, но не может подключиться к серверу, или что ICE не может установить соединение. Также можно использовать команды в Asterisk CLI, такие как pjsip show endpoints, чтобы проверить состояние точек подключения.
- Проверка поддержки ICE и STUN в PJSIP
- Включение icesupport=yes
- Настройка STUN-сервера
- Настройка параметров NAT
- Настройка аутентификации и точек подключения
- Настройка диапазона портов для RTP
- Проверка конфигурации
Типовые ошибки и их исправление
Одной из самых частых ошибок является отсутствие настройки icesupport=yes. Без этого параметра ICE не будет работать, даже если настроены STUN и TURN. Это приводит к невозможности обхода NAT. Сисадмины часто думают, что настройка STUN-сервера — это всё, что нужно. Это не так. Нужна комплексная настройка, включая параметры NAT, а также проверку маршрутов и диапазонов портов.
Другой типичной ошибкой является неправильная настройка параметров NAT. Например, если не включить force_rport = yes, PJSIP может использовать неправильный порт при отправке пакетов. Это приводит к невозможности соединения. Если не включить rtp_symmetric = yes, RTP-потоки могут идти по разным путям, что приводит к обрывам соединений. Если не включить direct_media = no, RTP-пакеты могут идти напрямую между абонентами, что не проходит через NAT.
Третья типичная ошибка — неправильная настройка аутентификации. Если не настроить username и password, абоненты не смогут подключиться. Также важно проверить, что в конфигурации PJSIP указаны правильные порты для SIP и RTP. SIP-порт — 5060, RTP-порт — 10000-20000. Если порт SIP не открыт, абоненты не смогут установить соединение. Если порт RTP не открыт, звонок будет установлен, но звук не будет идти.
Четвёртая типичная ошибка — неправильная настройка диапазона портов для RTP. Если не настроить диапазон портов, PJSIP может использовать случайные порты, что приведёт к блокировке в брандмауэре. Также важно настроить правила брандмауэра, чтобы разрешить входящие и исходящие соединения на портах SIP и RTP. Без этого PJSIP не сможет работать за NAT.
Пятая типичная ошибка — неправильная настройка external_ip. Если внешний IP не указан, PJSIP может использовать локальный адрес, что приведёт к невозможности соединения. Также важно настроить диапазоны локальных сетей, чтобы PJSIP знал, какие адреса являются локальными, чтобы не пытаться их использовать в пакетах, идущих в сеть.
- Отсутствие настройки icesupport=yes
- Неправильная настройка параметров NAT
- Неправильная настройка аутентификации
- Неправильная настройка диапазона портов для RTP
- Неправильная настройка external_ip
- Неправильная настройка диапазонов локальных сетей
Как проверить результат: что искать в логах
После настройки PJSIP необходимо проверить результат. Проверка включает запуск PJSIP и попытку установить звонок. Если звонок не устанавливается, нужно проверить логи. Логи PJSIP содержат информацию о том, какие параметры используются, какие ошибки возникают. В логах можно увидеть, что PJSIP пытается использовать STUN, но не может подключиться к серверу, или что ICE не может установить соединение. Также можно использовать команды в Asterisk CLI, такие как pjsip show endpoints, чтобы проверить состояние точек подключения.
Проверка логов PJSIP включает поиск ошибок, связанных с NAT, ICE и STUN. Например, если в логах есть сообщение о том, что STUN не работает, это может быть связано с неправильной настройкой STUN-сервера или с закрытым портом UDP. Если в логах есть сообщение о том, что ICE не может установить соединение, это может быть связано с неправильной настройкой icesupport=yes или с отсутствием поддержки ICE в конфигурации Asterisk.
Если звонок устанавливается, но звук не идёт, это может быть связано с direct_media = yes. При прямом медиапотоке, RTP-пакеты идут напрямую между абонентами, что часто не проходит через NAT. Поэтому рекомендуется отключить прямой медиапоток и использовать промежуточное соединение через сервер. Также важно проверить, что настроены правильные порты для RTP. Если порты не настроены, PJSIP может использовать порты, которые не разрешены в брандмауэре.
Проверка конфигурации также включает проверку правильности аутентификации. Если аутентификация не настроена, абоненты не смогут подключиться. Также важно проверить, что в конфигурации PJSIP указаны правильные порты для SIP и RTP. SIP-порт — 5060, RTP-порт — 10000-20000. Если порт SIP не открыт, абоненты не смогут установить соединение. Если порт RTP не открыт, звонок будет установлен, но звук не будет идти.
- Проверка логов PJSIP
- Команда pjsip show endpoints
- Проверка правильности аутентификации
- Проверка настроенных маршрутов
- Проверка правильности портов SIP и RTP
Что делать, если уже сломалось: восстановление конфигурации
Если PJSIP не работает, первым шагом необходимо проверить логи. Логи PJSIP содержат информацию о том, какие параметры используются, какие ошибки возникают. В логах можно увидеть, что PJSIP пытается использовать STUN, но не может подключиться к серверу, или что ICE не может установить соединение. Также можно использовать команды в Asterisk CLI, такие как pjsip show endpoints, чтобы проверить состояние точек подключения.
Вторым шагом необходимо проверить, что icesupport=yes включена. Без этого параметра ICE не будет работать, даже если настроены STUN и TURN. Также необходимо проверить, что настроены параметры NAT: force_rport = yes, rtp_symmetric = yes, direct_media = no и rewrite_contact = yes. Эти параметры заставляют PJSIP корректно работать за NAT.
Третьим шагом необходимо проверить, что настроены правильные порты для SIP и RTP. SIP-порт — 5060, RTP-порт — 10000-20000. Если порт SIP не открыт, абоненты не смогут установить соединение. Если порт RTP не открыт, звонок будет установлен, но звук не будет идти. Также важно проверить, что настроены правильные маршруты. Если маршруты не настроены, пакеты не будут проходить. Проверка маршрутов включает проверку правильности внешнего IP и портов.
Четвёртым шагом необходимо проверить, что настроены правильные порты для RTP. Если не настроен диапазон портов, PJSIP может использовать случайные порты, что приведёт к блокировке в брандмауэре. Также важно настроить правила брандмауэра, чтобы разрешить входящие и исходящие соединения на портах SIP и RTP. Без этого PJSIP не сможет работать за NAT.
Пятый шаг — проверка правильности аутентификации. Если аутентификация не настроена, абоненты не смогут подключиться. Также важно проверить, что в конфигурации PJSIP указаны правильные порты для SIP и RTP. SIP-порт — 5060, RTP-порт — 10000-20000. Если порт SIP не открыт, абоненты не смогут установить соединение. Если порт RTP не открыт, звонок будет установлен, но звук не будет идти.
- Проверка логов PJSIP
- Проверка настройки icesupport=yes
- Проверка параметров NAT
- Проверка правильности портов SIP и RTP
- Проверка правильности аутентификации
- Проверка правильности маршрутов
- Проверка правильности портов RTP
Частые вопросы
Почему PJSIP не работает за NAT?
PJSIP не работает за NAT, если не настроены ключевые параметры: icesupport=yes, force_rport = yes, rtp_symmetric = yes, direct_media = no, rewrite_contact = yes и external_ip. Без этих настроек PJSIP не может обойти NAT.
Как включить ICE в PJSIP?
ICE включается установкой параметра icesupport=yes в конфигурации PJSIP. Без этого параметра ICE не будет работать, даже если настроены STUN и TURN.
Как настроить STUN-сервер в PJSIP?
STUN-сервер настраивается через параметр stun_server в конфигурации PJSIP. Например, stun.l.google.com:19302. STUN помогает определить внешний IP и порт, что важно для работы за NAT.
Что делать, если звонок устанавливается, но звук не идёт?
Если звонок устанавливается, но звук не идёт, это может быть связано с direct_media = yes. Отключите прямой медиапоток и используйте промежуточное соединение через сервер. Проверьте также настройки портов и брандмауэра.
Как проверить настройки PJSIP?
Проверьте настройки через логи PJSIP и команду pjsip show endpoints. Проверьте, что все параметры настроены правильно, включая external_ip, port диапазоны и аутентификацию.
Нужно ли настраивать TURN?
TURN обычно не требуется, если STUN работает. TURN используется, если STUN не может обойти NAT. В большинстве случаев STUN-серверы достаточно.
Источники
- Asterisk-PBX Wiki — https://www.asterisk-pbx.ru/wiki/asterisk/pjsip
- CellStream — https://www.cellstream.com/2025/06/27/voip-troubleshooting-with-pjsip/
- Voxlink — https://voxlink.ru/kb/asterisk-configuration/pjsip-after-nat/
