FreeSwitch呼入和呼出冲突的问题。

本文介绍了一种在Default.xml中通过配置Local_Extension来实现特定IP地址呼入时的路由处理方法。当指定IP(例如111.111.111.111)呼入时,会应用特定的条件来处理呼叫,并且记录相关信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

呼入的时候,如果Default.xml里Local_Extension配置(\d+),则呼出的时候,也会走这个。所以在前面加上呼入的时候的IP,这样就可以只走呼入。

    <extension name="Local_Extension">
      <condition field="network_addr" expression="^111\.111\.111\.111$"/>
      <condition field="destination_number" expression="^(\d+)$">
    <action application="log" data="info1111111111 destination_number:${$1}" />
<action application="export" data="dialed_extension=$1"/>
在外呼接听电话的过程中,如果发现协商的 RTP IP 为内网 IP 地址而非外网 IP 地址,这通常会导致语音流无法正常传输。因为内网 IP 在公网环境中是不可达的,远端设备无法通过这个地址发送或接收 RTP 数据包。 以下是针对这个问题的原因分析以及解决办法: --- ### 原因分析 1. **SIP 配置未正确指定外网 IP** 在 FreeSWITCH 的 SIP 配置文件中(如 `sip_profiles/external.xml`),如果没有正确设置 `ext-rtp-ip` `ext-sip-ip` 参数,FreeSWITCH 会默认使用本地内网 IP 来生成 SDP 协商信息,导致远端设备无法与之建立有效的 RTP 连接。 2. **NAT 穿透问题** 当你的系统处于 NAT 后面时,默认情况下 FreeSWITCH 发送的 SIP 消息中的媒体描述符 (SDP) 中包含的是内网 IP 地址,而这对于公网来说并不可达。因此需要明确告知 FreeSWITCH 使用哪一对外网 IP 地址来进行 RTP 流量交互。 3. **STUN 或 TURN 服务缺失** 对于复杂 NAT 网络环境,单纯依赖手动配置外网 IP 可能不足以解决问题,特别是面对对称 NAT 时更需引入 STUN 或 TURN 技术来辅助完成媒体流传递。 4. **防火墙规则未开放 RTP 端口范围** 若即便配置了正确的外网 IP,但由于防火墙未允许特定 RTP 端口号区间的数据进出,同样会造成 RTP 包丢失进而引发无声现象。 --- ### 解决方案 #### 方案一:修改 SIP 配置文件 编辑对应 profile 下的 XML 文件,添加或修正 `ext-rtp-ip` `ext-sip-ip` 字段值: ```xml <profile name="external"> <param name="ext-rtp-ip" value="YOUR_PUBLIC_IP"/> <param name="ext-sip-ip" value="YOUR_PUBLIC_IP"/> </profile> ``` 将 `YOUR_PUBLIC_IP` 替换为实际可用的公共 IP 地址。之后记得重启 FreeSWITCH 让改动生效。 #### 方案二:启用 NAT 自动检测功能 如果你不确定自己的公网 IP 或者经常变化,可以尝试让 FreeSWITCH 根据 STUN 查询自动填充相关信息。首先安装并启用 stun 模块: ```bash load mod_stun_lookup ``` 然后调整 sip_profile 设置如下所示: ```xml <param name="stun-enabled" value="true"/> <param name="stun-server" value="stun.l.google.com"/> <param name="stun-port" value="3478"/> ``` #### 方案三:部署 TURN Server 对于高度受限的网络条件比如对称 NAT,建议架设一个 TURN relay server 来转发音频视频流量。推荐使用 [coturn](https://github.com/coturn/coturn),按照官方文档指南搭建好 service 后,在 FS 内部引用它: ```xml <param name="turn-password" value="yourpassword"/> <param name="turn-url" value="turn:hostname?transport=udp;username=user&credential=pwd"/> ``` #### 方案四:检查并优化防火墙策略 确保所有必要的端口均已被打开并且没有任何冲突阻碍情况发生。一般地, - SIP 端口 (TCP/UDP 5060) - RTP 端口区段(典型示例 10000~20000) 运行类似以下命令解锁上述区域限制(基于 Ubuntu 平台举例说明): ```bash sudo ufw allow 5060/udp sudo ufw allow 5060/tcp sudo ufw allow 10000:20000/udp ``` --- ### 最佳实践总结 为了避免将来再次遭遇此类状况,请始终铭记以下要点: - 明确区分内外网络边界并在相关组件里填入恰当参数; - 定期检验网络安全防护措施是否妨碍正常使用体验; - 考虑到特殊情形下运用高级工具例如 STUN/TURN 提升适应力; 希望这篇解答有助于您快速定位根源所在,并采取针对性行动消除故障!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值