Featured image of post opensips的topology_hiding巧用

opensips的topology_hiding巧用

背景

最近在使用opensips作为sbc对接电信运营商时,运营商要求发出去的sip请求都不能带私网ip

对于正常的sip协议来说,发出请求的INVITE信令中的From,To,Contact头字段是可以包含私网ip的。 正常的设备不会对其校验。但是这个运营商有这块的要求,所以从opensips出去的sip信令要做更改。

本次使用的opensips版本为: 3.3.10

问题

使用的场景

外呼场景是:freeswitch—>opensips—>运营商

原始INVITE信令

sip

这是opensips发送到运营商INVITE信令, 要点:

  1. Record-RouteVia:是opensips新增自己的外网ip端口
  2. From要改成:opensips外网ip端口
  3. To要改成:运营商外网ip端口
  4. Contact要改成:opensips外网ip端口

解决

  1. 基础

From, To, Contact这些字段可以在t_relay之前,先删除再追加,示例:

1
2
3
remove_hf("From");
$var(from_hr) = "From: " + $var(from) + "\r\n";
append_hf("$var(from_hr)", "From");

Via没法通过这种方式来处理,所以要使用进阶方式。

  1. 进阶

topology_hiding的官网文档为:topology_hiding

这个模块可以隐藏和存储Via,Record-RouteRoute

我在create_dialog之后使用topology_hiding, 示例:

1
2
3
4
5
if (!create_dialog("B")) {
    send_reply(500,"Internal Server Error");
    exit;
}
topology_hiding();

得到了INVITE的消息为:

sip

可以看到确实把freeswitchVia隐藏了。

另外还会在运营商给出200Okfreeswitch,freeswitch返回ACK时,opensips转发ACK时带上自己的外网ipRoute

总结

topology_hiding的使用时机很重要,要在create_dialog之后,record_route_preset之前。

  1. 如果是在create_dialog之前,会导致接通之后,200OkACK或者BYE里带freeswitchVia,这是不符合要求的。
  2. 如果是在record_route_preset之后,会导致opensips自己的Record-Route也被隐藏,这会导致运营商无法正确路由到opensips
本博客已稳定运行
发表了80篇文章 · 总计133.78k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计