Назад | Перейти на главную страницу

Клиент Asterisk за NAT - регистрация UDP не работает

У меня есть несколько клиентов, подключенных к моему серверу Asterisk за устройством NAT. При использовании TCP все работает нормально. Если я изменю конфигурацию клиента и сервера на использование UDP (с transport=tcp к transport=udp,tcp или даже просто transport=udp) телефон больше не может регистрироваться и Asterisk отправляет SIP: SIP/2.0 401 Unauthorized клиенту.

Из того, что я прочитал, можно использовать UDP за NAT с Asterisk, однако опыт подсказывает иное. Я пропустил еще один обязательный шаг или есть еще что-то, о чем я не знаю?

Чтобы уточнить: это клиенты за устройством NAT; не сервер.

Вот соответствующие части моего sip.conf:

[general]
context=bogus
allowguest=no
allowoverlap=no
bindport=5060
bindaddr=0.0.0.0
srvlookup=no
disallow=all
allow=ulaw
alwaysauthreject=yes
videosupport=yes
canreinvite=no
nat=force_rport,comedia
session-timers=refuse
localnet=x.x.x.x/255.255.0.0     ; blanked out for serverfault
tcpenable=yes                    ; Enable server for incoming TCP connections (default is no)
tcpbindaddr=0.0.0.0:5060         ; IP address for TCP server to bind to (0.0.0.0 binds to all interfaces)
transport=udp,tcp

[my-codecs](!)                    ; a template for my preferred codecs
        disallow=all
;        allow=ilbc
;        allow=gsm
;        allow=g723
        allow=alaw
        allow=ulaw
;       allow=g722

[basic-options](!,my-codecs)                ; another template
        dtmfmode=rfc2833
        context=internal
        type=friend


[natted-phone](!,basic-options)   ; another template inheriting basic-options
        directmedia=no
        host=dynamic
        transport=tcp,udp

[101](natted-phone)
callerid="Office"
secret=12345678901234567890
context=internal
mailbox=101@main
transport=udp,tcp

ОБНОВЛЕНИЕ. В ходе расследования я обнаружил, что это влияет только на телефоны Avaya. Другие программные телефоны, подключенные к тому же серверу, похоже, не страдают этой проблемой. Вот пример регистровых и неавторизованных пакетов:

asterisk*CLI> sip set debug on
SIP Debugging enabled
<--- SIP read from UDP:x.x.x.x:1032 --->
REGISTER sip:asterisk SIP/2.0
From: sip:2003@asterisk;tag=46c2abf4589053ec5895ffc0_F2003192.168.0.174
To: sip:2003@asterisk
Call-ID: 1_5a7d0-b0875cb5895fbc0_R@192.168.0.174
CSeq: 1 REGISTER
Via: SIP/2.0/UDP 192.168.0.174;branch=z9hG4bK1_5a7d12149bcad5895ffc4_R2003
Content-Length: 0
Max-Forwards: 70
Contact: <sip:2003@192.168.0.174;avaya-sc-enabled;transport=udp>;q=1;expires=900;reg-id=1;+sip.instance="<urn:uuid:00000000-0000-1000-8000-2cf4c54ef19b>"
Allow: INVITE,CANCEL,BYE,ACK,SUBSCRIBE,NOTIFY,MESSAGE,INFO,PUBLISH,REFER,UPDATE
User-Agent: Avaya one-X Deskphone
Supported: eventlist

<------------->
--- (12 headers 0 lines) ---
Sending to x.x.x.x:1032 (NAT)
Sending to x.x.x.x:1032 (NAT)

<--- Transmitting (NAT) to x.x.x.x:1032 --->
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.0.174;branch=z9hG4bK1_5a7d12149bcad5895ffc4_R2003;received=x.x.x.x;rport=1032
From: sip:2003@asterisk;tag=46c2abf4589053ec5895ffc0_F2003192.168.0.174
To: sip:2003@asterisk;tag=as5f37e30b
Call-ID: 1_5a7d0-b0875cb5895fbc0_R@192.168.0.174
CSeq: 1 REGISTER
Server: Asterisk PBX 13.1.0~dfsg-1.1ubuntu4
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces
WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="2350c222"
Content-Length: 0

При использовании Asterisk за NAT всегда следует добавлять externip вариант вместе с nat вариант в разделе [общие] вашего sip.conf

Попробуй это

[general]
nat=force_rport,comedia
externip=<your external IP here>
... rest of your config ...

Некоторые клиенты также позволяют указывать "Прокси-адрес"поле в дополнение к Адрес SIP-сервера & SIP домен. При использовании NAT вы должны поместить туда свой внешний IP. Таким образом, такая конфигурация также должна защитить вас:

 SIP Server: 192.168.1.200 (Servers internal IP)
 SIP Proxy: 1.2.3.4  (Servers external IP)
 SIP Domain: 192.168.1.200  (Servers internal IP)

Наконец, проверьте журналы звездочки в реальном времени, запустив:

 asterisk -rvvvv

поможет много диагностировать, так как 401 Unauthorized может быть связано с проблемами ACL (например, когда IP-адрес однорангового узла не соответствует параметрам разрешения / запрета, указанным в sip.conf). В этом случае Asterisk выдаст такую ​​ошибку:

SIP Peer ACL: Rejecting '1.2.3.4' due to a failure to pass ACL '(BASELINE)'

P.S. Это может избавить вас от головной боли. Всегда не забывайте пересылать полный диапазон портов RTP, которые указаны в /etc/asterisk/rtp.conf Если у вас есть

rtpstart=50000
rtpend=60000

там, тогда вы должны безоговорочно перенаправить 50000-60000 UDP с вашего [внешнего IP-адреса] на вашу звездочку, или вы воля столкнуться с множеством странных проблем (например, невозможностью надежно передать вызов, случайными потерями / отключениями голоса и множеством других вещей, которые вам определенно не нужны) ...

Это правильное поведение - вы должны понимать, как работает NAT! NAT может отслеживать соединения только путем ведения таблицы открытых соединений (открываемых SYN ACK, закрываемых FIN ACK). Но только TCP использует соединения; UDP не требует установления соединения.

Таким образом, устройство NAT даже не пытается маршрутизировать UDP-пакеты в зависимости от состояния соединения. Если вам нужен обход NAT для пакетов UDP, вам придется создать статические правила на основе диапазона портов, IP-адреса источника и т. Д.