Траблшутинг прохождения SIP-трафика через NAT: STUN, TURN, ICE и rport
- Абонент успешно регистрируется на АТС, но входящие вызовы не доходят (сигнальный таймаут).
- Односторонняя слышимость: инициатор звонка слышит собеседника, а в обратную сторону идет тишина.
- SIP-ответы от АТС (200 OK, 180 Ringing) отправляются на серый локальный IP клиента вместо публичного IP маршрутизатора.
- Разрыв соединения ровно через 30-32 секунды из-за отсутствия подтверждения ACK.
1. Проверка работы параметра rport (RFC 3581)
Убедитесь, что клиент отправляет параметр rport в заголовке Via. Ответ сервера должен содержать публичный IP и порт:
Via: SIP/2.0/UDP 192.168.1.50:5060;branch=z9hG4bK-abc123;rport=45123;received=203.0.113.102. Конфигурация NAT в FreeSWITCH / Asterisk
Для Asterisk (pjsip.conf):
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
local_net=192.168.0.0/16
local_net=10.0.0.0/8
external_media_address=203.0.113.1
external_signaling_address=203.0.113.1
[endpoint-template](!)
type=endpoint
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
direct_media=no3. Настройка STUN/TURN на стороне SIP-клиента
Если IP-телефон находится за Symmetric NAT, укажите публичный STUN-сервер (например, stun.l.google.com:19302) или разверните Coturn для TURN-релеинга:
turnserver -a -o -v -u user:password -r realm.domain.com --listen-port=34784. Сокращение интервала Keep-Alive и регистрации
Для предотвращения закрытия NAT-сессий межсетевыми экранами установите QualifyFrequency = 25 и интервал регистрации Register Expiration = 120 секунд.
Частые вопросы (FAQ)
Зачем нужен заголовок rport в SIP?
Без rport сервер отвечает на порт, указанный в теле Via (обычно стандартный 5060 клиента), который закрыт со стороны NAT. Параметр rport заставляет сервер слать ответ на реальный исходящий порт трансляции NAT.
В каких случаях STUN не помогает пройти NAT?
STUN не работает за Symmetric NAT (симметричной трансляцией), так как NAT выделяет разные внешние порты для разных целевых хостов. В этом случае требуется TURN-реле или режим rtp_symmetric на SBC/PBX.
Почему вызов сбрасывается ровно через 30 секунд?
Из-за NAT пакет ACK на 200 OK не доходит до сервера. Сервер считает транзакцию неподтвержденной, повторяет 200 OK несколько раз и отправляет BYE по истечении таймера T1/B (32 секунды).
Что делает опция rewrite_contact в Asterisk PJSIP?
Она заменяет адрес в заголовке Contact на фактический адрес источника пакета (IP:port), с которого пришел запрос, игнорируя локальный IP внутри тела SIP-сообщения.