FreeSWITCH注册Contact头缺失用户1000问题求助
FreeSWITCH SIP.js注册后Contact头显示(null)导致无法呼叫的问题
问题描述
我有一台FreeSWITCH服务器,使用external配置文件通过SIP.js注册分机1000,连接和认证环节均正常,但注册后的Contact头存在异常——用户部分显示为(null),怀疑此问题导致后续无法呼叫分机1000。
注册状态信息如下:
sofia status profile external reg Registrations: ================================================================================================= Call-ID: <call-id> User: 1000@<public-ip> Contact: "" <sip:(null)@<public-ip>;fs_nat=yes;fs_path=sip%3A(null)%403.7.130.46%3A57899> Agent: JsSIP 3.9.1 Status: Registered(WS-NAT)(unknown) EXP(2022-09-28 20:04:55) EXPSECS(631) Ping-Status: Reachable Ping-Time: 0.00 Host: <host> IP: <client ip> Port: 57899 Auth-User: 1000 Auth-Realm: <public-ip> MWI-Account: 1000@<public-ip>
其中异常的Contact头:
Contact: "" <sip:(null)@<public-ip>;fs_nat=yes;fs_path=sip%3A(null)%403.7.130.46%3A57899>
搜索到线索指向公网身份的SIP URI无效,但对此理解不清晰,寻求解决方案。
可能原因与解决步骤
1. 检查FreeSWITCH external profile配置
打开conf/sip_profiles/external.xml,确认以下参数设置:
- force-register-domain:设置为你的公网IP或域名,确保FreeSWITCH处理注册时用正确域名生成Contact URI
<param name="force-register-domain" value="<public-ip>"/> - rewrite-contact:设为
true,让FreeSWITCH自动重写Contact头,修正NAT场景下的URI问题<param name="rewrite-contact" value="true"/> - contact-scheme:如果用WebSocket注册,确保设置为
ws或wss(与客户端一致)<param name="contact-scheme" value="ws"/>
修改后重启external profile:
sofia profile external restart
2. 验证SIP.js注册配置
确保SIP.js的注册参数中,uri是完整格式:
const registration = new JsSIP.UA({ uri: 'sip:1000@<public-ip>', // 其他配置项... });
避免出现缺失用户部分的URI,保证客户端发送的注册请求中Contact头包含正确的用户标识。
3. 排查NAT相关配置
若服务器部署在NAT环境下,确认external.xml中的NAT参数配置正确:
<param name="ext-rtp-ip" value="<public-ip>"/> <param name="ext-sip-ip" value="<public-ip>"/> <param name="nat-map" value="true"/>
这些参数确保FreeSWITCH处理NAT客户端时,生成包含公网地址的正确Contact URI。
4. 测试验证
重新注册分机1000后,再次执行命令查看注册状态:
sofia status profile external reg
确认Contact头中的用户部分显示为1000而非(null),比如:
Contact: "1000" <sip:1000@<public-ip>;fs_nat=yes;fs_path=sip%3A1000%403.7.130.46%3A57899>
内容的提问来源于stack exchange,提问作者shwetank
相关产品推荐
相关产品推荐

