You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动