У меня есть несколько клиентов, подключенных к моему серверу 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-адреса источника и т. Д.