Asterisk: res_pjsip_nat.c NAT detected without external signaling address configured
- Предупреждение:
WARNING: res_pjsip_nat.c: NAT detected without external signaling address configured. - Asterisk отправляет во внешних SIP пакетах (Contact, SDP) свой серый локальный IP-адрес (например
192.168.1.15или10.0.0.5). - Внешние абоненты и SIP-транки не могут дозвониться до АТС или слышат тишину из-за неверной маршрутизации ответов.
- Сбои входящей регистрации на серверах облачных операторов связи.
1. Определение публичного IP-адреса и топологии сети
Узнайте текущий внешний IP-адрес сервера:
curl -4 icanhazip.com2. Настройка секции Transport в /etc/asterisk/pjsip.conf
Отредактируйте транспорт pjsip.conf, указав локальные подсети и внешний IP-адрес:
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0:5060
; Обязательное перечисление ВСЕХ локальных серых сетей компании
local_net = 127.0.0.1/32
local_net = 192.168.0.0/16
local_net = 10.0.0.0/8
local_net = 172.16.0.0/12
; Публичный IP-адрес сервера (или внешний FQDN)
external_signaling_address = 203.0.113.50
external_media_address = 203.0.113.50
; Для динамических публичных IP адресов (DDNS):
; external_signaling_address = mypbx.dyndns.org
; external_media_address = mypbx.dyndns.org3. Проверка настроек для WebRTC/WSS транспорта (при наличии)
[transport-wss]
type = transport
protocol = wss
bind = 0.0.0.0:8089
local_net = 192.168.0.0/16
external_signaling_address = 203.0.113.50
external_media_address = 203.0.113.504. Применение настроек транспорта
Изменения параметров сетевых транспортов требуют перезагрузки PJSIP или рестарта Asterisk:
asterisk -rx "pjsip reload" Частые вопросы (FAQ)
Почему Asterisk подставляет локальный IP вместо публичного?
Если в секции transport не заданы external_signaling_address и local_net, Asterisk не знает, находится ли он за NAT, и вставляет в заголовки Via, Contact и SDP c= адрес локального сетевого интерфейса ОС.
Что произойдет, если забыть прописать офисную подсеть в local_net?
Asterisk посчитает локальные офисные телефоны внешними клиентами и начнет отправлять им в заголовках свой публичный IP, что приведет к разрыву связи внутри локальной сети.
Можно ли указывать доменное имя (FQDN) вместо IP в external_media_address?
Да, PJSIP поддерживает FQDN и периодически обновляет IP через DNS-запросы, что удобно при использовании серверов с динамическим белым IP (Dynamic DNS).
В чем разница между external_signaling_address и external_media_address?
external_signaling_address подставляется в сигнальные заголовки SIP (Contact, Via), а external_media_address — в параметры дескриптора медиа-потоков SDP (c=IN IP4).