Debian下配置OpenSIPS+OverSIP:WebSocket与UDP跨端SIP通话故障
解决sipml5与Yate/Linphone跨端SIP通话异常问题
我来帮你梳理下这个跨端通话的问题——同端正常但跨端出问题,核心肯定是WebRTC(sipml5)和传统SIP客户端(Yate/Linphone)在协议适配、媒体处理上的差异,中间的OpenSIPS/OverSIP代理没做好转换工作。下面分几个方向排查和解决:
一、先排查SDP消息的兼容性问题
WebRTC的SDP格式和传统SIP客户端差异很大:WebRTC强制要求ICE候选、DTLS指纹,而Yate/Linphone默认可能不支持这些,代理如果没做SDP转换,直接转发就会导致协商失败。
- 检查代理的SDP处理配置:
- OverSIP:确保
webrtc模块已启用,打开config/webrtc.conf,确认enable_ice、enable_dtls设为yes,并且正确配置dtls_certificate和dtls_private_key的文件路径(需要提前生成SSL证书)。 - OpenSIPS:必须加载
rtpproxy、sdp_transform模块,在路由逻辑里针对Web和传统客户端做SDP转换:- 当sipml5的SDP转发给Yate/Linphone时,用
sdp_transform_strip_ice()移除ICE字段,sdp_transform_strip_dtls()移除DTLS相关内容; - 当传统客户端的SDP转发给sipml5时,用
sdp_transform_add_ice()添加ICE候选,sdp_transform_add_dtls()插入DTLS指纹(用代理的证书指纹)。
- 当sipml5的SDP转发给Yate/Linphone时,用
- OverSIP:确保
- 抓包分析SIP消息:
用tcpdump -i any port 5060 or port 5061 or port 5066 -w sip_cross_call.pcap抓包,然后用Wireshark打开:- 如果sipml5打Yate返回
488 Not Acceptable Here,直接就是SDP不兼容的问题; - Yate打sipml5接听后断开,看是否是ACK消息丢失,或者媒体协商失败触发了BYE。
- 如果sipml5打Yate返回
二、媒体流中转与协议适配
WebRTC依赖ICE穿透、DTLS加密,而传统SIP客户端常用裸RTP,代理必须做媒体中转和协议转换,否则媒体流根本连不通。
- 确保RTPPROXY/媒体中继正常工作:
- OpenSIPS:配置
rtpproxy模块,在INVITE处理时调用rtpproxy_offer("any"),在200 OK响应时调用rtpproxy_answer(),强制所有媒体流走代理中转; - OverSIP:打开
config/media.conf,确认enable_media_relay设为yes,并且配置了合理的媒体端口范围(比如media_ports = 10000-20000),确保端口没被防火墙挡住。
- OpenSIPS:配置
- 检查ICE候选的处理:
- sipml5发送的ICE候选要被代理替换成自己的媒体中继地址(如果传统客户端不支持ICE),或者完整转发(如果客户端支持);
- 传统客户端的SDP里的媒体IP/端口必须被代理替换成RTPPROXY的地址,这样sipml5才能通过ICE连接到代理的媒体端口。
三、处理浏览器权限触发的会话异常(Yate/Linphone打sipml5接听断开)
这个场景的问题通常是:浏览器授权媒体设备后会触发SDP重协商,但代理没处理好重新INVITE,或者媒体流没及时建立。
- 检查sipml5的会话配置:
打开浏览器控制台(F12),查看WebRTC相关日志:- 如果有
ICE connection failed或DTLS handshake failed,说明媒体协商失败; - 确认sipml5的配置里
enable_media_streaming设为true,并且权限请求完成后正确触发了会话更新。
- 如果有
- 代理的重新INVITE支持:
- OpenSIPS:在路由逻辑里判断
is_reinvite(),如果是重新INVITE,重新调用rtpproxy_offer()和rtpproxy_answer()来更新媒体路径; - OverSIP:默认支持重新INVITE,但要确认
config/sip.conf里的allow_reinvite设为yes。
- OpenSIPS:在路由逻辑里判断
四、WS/WSS与UDP/TLS的协议转换
sipml5用WebSocket(WS/WSS)连接代理,而Yate/Linphone用UDP或TLS,代理必须同时支持这些传输协议,并且正确转换消息。
- 检查代理的WS/WSS配置:
- OpenSIPS:加载
websocket模块,配置监听端口:
同时确保TLS上下文(listen=ws:0.0.0.0:5066 listen=wss:0.0.0.0:5067 tls_ctx=defaulttls_ctx)配置了正确的证书和密钥; - OverSIP:打开
config/websocket.conf,设enable_websocket = yes,配置websocket_port和websocket_tls_port,并指定TLS证书路径。
- OpenSIPS:加载
- 确认路由逻辑没有限制传输协议:
代理的路由规则要允许WS/WSS上的消息转发到UDP/TLS端口,反之亦然,不要加传输协议的过滤限制。
内容的提问来源于stack exchange,提问作者Laci K
相关产品推荐
相关产品推荐

