背景
最近在使用opensips作为sbc对接电信运营商时,运营商要求发出去的sip请求都不能带私网ip。
对于正常的sip协议来说,发出请求的INVITE信令中的From,To,Contact头字段是可以包含私网ip的。
正常的设备不会对其校验。但是这个运营商有这块的要求,所以从opensips出去的sip信令要做更改。
本次使用的opensips版本为: 3.3.10。
问题
使用的场景
外呼场景是:freeswitch—>opensips—>运营商。
原始INVITE信令

这是opensips发送到运营商的INVITE信令, 要点:
Record-Route和Via:是opensips新增自己的外网ip和端口。From要改成:opensips的外网ip和端口。To要改成:运营商的外网ip和端口。Contact要改成:opensips的外网ip和端口。
解决
- 基础
From, To, Contact这些字段可以在t_relay之前,先删除再追加,示例:
|
|
Via没法通过这种方式来处理,所以要使用进阶方式。
- 进阶
topology_hiding的官网文档为:topology_hiding
这个模块可以隐藏和存储Via,Record-Route和Route。
我在create_dialog之后使用topology_hiding, 示例:
|
|
得到了INVITE的消息为:

可以看到确实把freeswitch的Via隐藏了。
另外还会在运营商给出200Ok到freeswitch,freeswitch返回ACK时,opensips转发ACK时带上自己的外网ip到Route。
总结
topology_hiding的使用时机很重要,要在create_dialog之后,record_route_preset之前。
- 如果是在
create_dialog之前,会导致接通之后,200Ok的ACK或者BYE里带freeswitch的Via,这是不符合要求的。 - 如果是在
record_route_preset之后,会导致opensips自己的Record-Route也被隐藏,这会导致运营商无法正确路由到opensips。