我在静态配置的 NAT 后面使用带有 asterisk 13.1.0 的 SIP。服务器 private_ip 与 public_ip 不同,我可以访问它。我已经在文件中设置了这些选项sip.conf
。
externaddr=public_ip:5060
media_address=public_ip
localnet=private_ip/24
如果我现在尝试发起呼叫,消息可能会一直有效,直到服务器将消息发送OK
到客户端。在此消息中,星号将Contact
标头设置为其私有 IP,而不是公共 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
...
ACK
由于 Contact 标头,UA 现在将以下内容发送到 PRIVATE_IP。
我的配置有什么问题?这是 Asterisk 的一个错误吗?
答案1
如果将 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.)
重要的是要知道绑定地址=::不绑定 IPv4 通配符。它绑定 IPv4 映射的 IPv6 地址!