在对接运营商IMS 系统的过程中,通常会提供多个信令地址以实现高可用性。本文档描述了如何在 FreeSWITCH 中配置两个 SIP 网关地址,实现以下功能:
可以COPY一份external.xml的sip profile,定义为新名称:
cd /usr/local/freeswitch/conf/sip_profiles/
cp external.xml telecom.xml
将 telecom.xml 文件中原网关部署的配置“external/*.xml
”修改为对接运营商 IMS 的 telecomsip/*.xml
网关文件。
⚠️ 注意:路径相对于 sip_profiles 目录,确保后续创建的目录名称一致。
mkdir -p /usr/local/freeswitch/conf/sip_profiles/telecomsip
cd /usr/local/freeswitch/conf/sip_profiles/telecomsip
proxy 是运营商提供的二个 SIP 对接地址,以下配置是 sip 直接对接方式,未使用 sip 注册方式。
<include>
<gateway name="gw1">
<param name="proxy" value="100.20.30.8:5060"/>
<param name="ping" value="20"/>
<param name="register" value="false"/>
gateway>
<gateway name="gw2">
<param name="proxy" value="100.20.30.9:5060"/>
<param name="ping" value="20"/>
<param name="register" value="false"/>
gateway>
include>
proxy:对应对端的信令 IP 和端口。
ping
:用于探活的心跳周期(单位:秒),与现有电信网关配置保持一致。register
:设置为 false
,表示该网关不进行注册,仅用于发起呼叫。FreeSWITCH 提供了 distributor
模块用于多网关分发。此处我们定义一个网关列表 gw
,并设置权重均为 1,实现简单轮询。
确认 mod_distributor 模块已加载(modules.conf.xml
决定加载哪些模块),此处不详述加载模块加载方法。
在/usr/local/freeswitch/conf/autoload_configs/mod_distributor.conf.xml 增加如下定义:
<list name="gw" total-weight="2">
<node name="gw1" weight="1"/>
<node name="gw2" weight="1"/>
list>
在外呼 dialplan 中使用如下 bridge
语句,实现基于探活状态的智能路由:
参数说明:
distributor gw ...
:从 gw
网关列表中剔除 down 状态网关后,进行负载分发。$1
:占位符,表示被叫号码。使用实际号码进行多次外呼,观察 SIP INVITE 请求是否轮询发送到两个网关。
在不进行外呼的情况下,通过控制台验证当前探活状态和轮询结果:
fs_cli -x "expand distributor gw ${sofia profile telecom gwlist down}"
该命令会返回当前处于 up 状态、可以参与路由的网关名称,确保自动剔除已 down 的节点。
通过以上配置,FreeSWITCH 能够实现与 IMS 的高可用对接,在多个网关之间进行轮询,并具备探活能力,自动跳过不可用地址,从而提高系统的稳定性与呼叫成功率。
代码在键上,故事在江湖。
分享云原生、后端架构与运维实践,记录技术成长路上的每一个脚印。
更多原创内容、技术干货,欢迎关注微信公众号 「键上江湖」,与你一键相逢!。