1. 拓扑隐藏功能
- 删除Via头
- 删除Route
- 删除Record-Route
- 修改Contact
- 可选隐藏Call-ID
如下图所示,根据SIP的Via, Route, Record-Route的头,往往可以推测服务内部的网络结构。
我们不希望别人知道的我们的内部网络结构。我们只希望只能看到C这个sip server。经过拓扑隐藏过后
- 用户看不到关于a、b的via, route, record-route头
- 用户看到的Contact头被修改成C的IP地址
- 可以选择把原始的Call-ID也修改
当然,拓扑隐藏除了可以隐藏一些信息,也有一个其他的好处:减少SIP消息包的长度。如果SIP消息用UDP传输,减少包的体积,可以大大降低UDP分片的可能性。
所以,综上所述:拓扑隐藏有以下好处
- 隐藏服务内部网络结构
- 减少SIP包的体积
2. 脚本例子
拓扑隐藏的实现并不复杂。首先要加载拓扑隐藏的模块
loadmodule "topology_hiding.so"
2.1 初始化路由的处理
在初始化路由里,只需要调用topology_hiding()
- U 表示不隐藏Contact的用户名信息
- C 表示隐藏Call-ID
# if it's an INVITE dialog, we can create the dialog now, will lead to cleaner SIP messages
if (is_method("INVITE"))
create_dialog();
# we do topology hiding, preserving the Contact Username and also hiding the Call-ID
topology_hiding("UC");
t_relay();
exit;
2.2 序列化路由的处理
在序列化请求中,只需要调用topology_hiding_match(), 后续的就可以交给OpenSIPS处理了。
if (has_totag()) {
if (topology_hiding_match()) {
xlog("Succesfully matched this request to a topology hiding dialog. \n");
xlog("Calller side callid is $ci \n");
xlog("Callee side callid is $TH_callee_callid \n");
t_relay();
exit;
} else {
if ( is_method("ACK") ) {
if ( t_check_trans() ) {
t_relay();
exit;
} else
exit;
}
sl_send_reply("404","Not here");
exit;
}
}
2.3 注意事项
如果用了拓扑隐藏,就不要用record_route()用record_route_preset(), 去设置Record-Route头了,否则SIP消息将会在sip server上一只循环发送。