Я использую SIP со звездочкой 13.1.0 за статически настроенным NAT. Сервер private_ip отличается от public_ip, где я могу его достать. Я уже установил эти параметры в sip.conf
файл.
externaddr=public_ip:5060
media_address=public_ip
localnet=private_ip/24
Если я сейчас попытаюсь начать вызов, сообщения будут работать, вероятно, до тех пор, пока сервер не отправит OK
сообщение клиенту. В этом сообщении звездочка устанавливает Contact
заголовок к его частному, а не общедоступному IP-адресу.
SIP/2.0 200 OK
From: "Test799" <sip:799@HOSTNAME>;tag=7ajcnltflq
To: <sip:62@HOSTNAME;user=phone>;tag=as08a05471
Call-ID: 54b6479ed3e3-io8z54pk25ve
CSeq: 2 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Session-Expires: 1800;refresher=uas
Contact: <sip:62@PRIVATE_IP:5060>
Content-Type: application/sdp
Require: timer
Content-Length: ...
v=0
o=root 1234 1234 IN IP4 PUBLIC_IP
c=IN IP4 PUBLIC_IP
...
UA теперь отправляет следующее ACK
в PRIVATE_IP из-за заголовка Contact.
Что не так с моей конфигурацией? Это ошибка звездочки?
Эта проблема возникает, если вы используете IPv4 externaddr в сочетании с настройкой IPv6 bindaddr.
; c) Listen on the IPv4 wildcard. Example: bindaddr=0.0.0.0
; d) Listen on the IPv4 and IPv6 wildcards. Example: bindaddr=::
...
; (Note that using bindaddr=:: will show only a single IPv6 socket in netstat.
; IPv4 is supported at the same time using IPv4-mapped IPv6 addresses.)
Важно знать, что bindaddr = :: не привязывается к подстановочному знаку IPv4. Он связывается с IPv4-адресами IPv6!