Asterisk 15.3与14.6版本‘200 OK’Contact字段差异问询
关于Asterisk 15.3与14.6 Contact字段IP差异的原因及配置调整方案
这个问题我刚好研究过,咱们从原因和配置方法两方面来梳理:
版本差异的核心原因
Asterisk 15系列在SIP栈的地址处理逻辑上做了默认行为调整:
- Asterisk 14.6及更早版本:默认以配置文件中
bindaddr指定的绑定IP(通常是内网IP)来生成Contact字段,除非手动配置了公网相关参数才会替换。 - Asterisk 15.3及后续版本:官方优化了NAT场景的适配逻辑,当系统检测到INVITE请求来自公网,或者存在有效的公网路由/
externip配置时,会自动优先使用公网IP填充Contact字段,目的是减少NAT环境下的通信故障。
配置调整方法
根据你的需求,分两种场景给出配置方案:
场景1:让Asterisk 15.3强制使用内网IP作为Contact地址
如果你用的是传统chan_sip驱动(sip.conf)
- 在
[general]段或对应分机的配置块中添加:# 直接指定Contact字段使用的IP contactaddr=你的内网IP # 或者明确内网网段,避免自动切换公网IP localnet=你的内网网段/子网掩码(比如192.168.1.0/255.255.255.0) # 确保externip不设置为公网IP,若已设置可注释或改为内网IP ;externip=你的公网IP
如果你用的是PJSIP驱动(pjsip.conf)
- 在对应endpoint的AOR配置中指定Contact地址:
[your_aor] type=aor contact=sip:你的内网IP:5060 - 或者在transport配置中调整外部地址为内网IP:
[your_transport] type=transport protocol=udp bind=0.0.0.0:5060 external_media_address=你的内网IP external_signaling_address=你的内网IP local_net=你的内网网段/子网掩码
场景2:让Asterisk 14.6使用公网IP作为Contact地址
传统chan_sip驱动(sip.conf)
- 在
[general]段添加:# 设置公网IP externip=你的公网IP # 明确内网网段,让Asterisk识别哪些IP需要替换为公网IP localnet=你的内网网段/子网掩码
PJSIP驱动(pjsip.conf)
- 在transport配置中设置外部地址为公网IP:
[your_transport] type=transport protocol=udp bind=0.0.0.0:5060 external_media_address=你的公网IP external_signaling_address=你的公网IP local_net=你的内网网段/子网掩码
注意事项
- 调整配置后需要重启Asterisk服务才能生效,可使用命令
asterisk -rx "core restart now"。 - 确保你的防火墙/NAT设备已正确转发SIP端口(默认5060)和媒体流端口(默认10000-20000),否则即使IP配置正确也可能出现通话故障。
- 如果你使用的是动态公网IP,可以考虑使用DDNS服务配合
externhost参数替代externip,比如externhost=your-ddns-domain.com。
内容的提问来源于stack exchange,提问作者sw007




