这是 FreeSWITCH 的 ACL(Access Control List,访问控制列表)配置文件,文件名为 acl.conf
。它的作用是定义网络访问控制规则,允许或拒绝特定 IP 地址或 IP 段的访问。以下是对该配置文件的详细解释:
配置文件结构
<configuration name="acl.conf" description="Network Lists">
<network-lists>
<!-- ACL 规则定义 -->
</network-lists>
</configuration>
<configuration>
:根元素,定义了配置文件的名称和描述。<network-lists>
:包含所有 ACL 规则的容器。
ACL 规则详解
1. 默认 ACL 规则
<!--
These ACL's are automatically created on startup.
rfc1918.auto - RFC1918 Space
nat.auto - RFC1918 Excluding your local lan.
localnet.auto - ACL for your local lan.
loopback.auto - ACL for your local lan.
-->
- FreeSWITCH 在启动时会自动创建以下默认 ACL:
rfc1918.auto
:包含 RFC1918 定义的私有 IP 地址段(10.0.0.0/8
、172.16.0.0/12
、192.168.0.0/16
)。nat.auto
:包含 RFC1918 定义的私有 IP 地址段,但排除本地局域网(LAN)。localnet.auto
:本地局域网的 ACL。loopback.auto
:本地回环地址(127.0.0.0/8
)的 ACL。
2. 自定义 ACL 规则:lan
<list name="lan" default="allow">
<node type="deny" cidr="192.168.42.0/24"/>
<node type="allow" cidr="192.168.42.42/32"/>
</list>
name="lan"
:定义了一个名为lan
的 ACL。default="allow"
:默认允许所有访问,除非明确拒绝。<node>
:定义具体的规则:type="deny" cidr="192.168.42.0/24"
:拒绝192.168.42.0/24
网段的所有 IP 地址。type="allow" cidr="192.168.42.42/32"
:允许 IP 地址192.168.42.42
的访问。
3. 自定义 ACL 规则:domains
<list name="domains" default="deny">
<!-- domain= is special it scans the domain from the directory to build the ACL -->
<node type="allow" domain="$${domain}"/>
<!-- use cidr= if you wish to allow ip ranges to this domains acl. -->
<!-- <node type="allow" cidr="192.168.0.0/24"/> -->
</list>
name="domains"
:定义了一个名为domains
的 ACL。default="deny"
:默认拒绝所有访问,除非明确允许。<node>
:定义具体的规则:type="allow" domain="$${domain}"
:允许与$${domain}
变量匹配的域名的访问。domain=
是特殊属性,会从 FreeSWITCH 的用户目录中扫描并构建 ACL。<node type="allow" cidr="192.168.0.0/24"/>
(注释):如果需要允许特定 IP 段,可以使用cidr=
属性。
关键点总结
-
ACL 的作用:
- 控制哪些 IP 地址或 IP 段可以访问 FreeSWITCH 的服务。
- 用于增强安全性,防止未经授权的访问。
-
默认 ACL:
- FreeSWITCH 会自动创建一些默认 ACL,如
rfc1918.auto
、nat.auto
等。
- FreeSWITCH 会自动创建一些默认 ACL,如
-
自定义 ACL:
- 可以通过
<list>
和<node>
定义自定义 ACL 规则。 - 支持
allow
(允许)和deny
(拒绝)两种操作。 - 可以使用
cidr=
指定 IP 段,或domain=
指定域名。
- 可以通过
-
优先级:
- ACL 规则的优先级从上到下依次匹配,匹配到第一条规则后停止。
示例场景
-
限制特定 IP 访问:
- 允许
192.168.1.100
,拒绝192.168.1.0/24
网段的其他 IP。
<list name="restrict-lan" default="deny"> <node type="allow" cidr="192.168.1.100/32"/> <node type="deny" cidr="192.168.1.0/24"/> </list>
- 允许
-
允许特定域名的用户:
- 允许域名为
example.com
的用户访问。
<list name="allow-domain" default="deny"> <node type="allow" domain="example.com"/> </list>
- 允许域名为
-
结合 IP 段和域名:
- 允许
192.168.0.0/24
网段和域名为example.com
的用户访问。
<list name="combined-acl" default="deny"> <node type="allow" cidr="192.168.0.0/24"/> <node type="allow" domain="example.com"/> </list>
- 允许
总结
acl.conf
是 FreeSWITCH 中用于定义网络访问控制规则的文件。通过配置 ACL,可以灵活地控制哪些 IP 地址或域名可以访问 FreeSWITCH 的服务,从而增强系统的安全性。
在 FreeSWITCH 中,ACL(Access Control List) 是用于控制网络访问的重要功能。如果你希望完全关闭 ACL 配置,可以通过以下方法实现:
方法 1:禁用 ACL 模块
FreeSWITCH 的 ACL 功能是通过 mod_acl
模块实现的。你可以通过禁用该模块来关闭 ACL 功能。
-
编辑
modules.conf.xml
文件:
找到 FreeSWITCH 的配置文件目录(通常位于/usr/local/freeswitch/conf/autoload_configs/
),打开modules.conf.xml
文件。 -
注释或删除
mod_acl
模块:
找到以下行并注释或删除它:<load module="mod_acl"/>
修改后:
<!-- <load module="mod_acl"/> -->
-
重启 FreeSWITCH:
重启 FreeSWITCH 以使更改生效:freeswitch -stop freeswitch -nc
方法 2:清空 ACL 配置
如果你不想完全禁用 ACL 模块,但希望关闭所有 ACL 规则,可以清空 acl.conf
文件。
-
编辑
acl.conf
文件:
找到acl.conf
文件(通常位于/usr/local/freeswitch/conf/autoload_configs/
),将其内容清空或保留为默认配置。 -
清空内容:
将acl.conf
文件内容修改为:<configuration name="acl.conf" description="Network Lists"> <network-lists> <!-- 清空所有 ACL 规则 --> </network-lists> </configuration>
-
重启 FreeSWITCH:
重启 FreeSWITCH 以使更改生效:freeswitch -stop freeswitch -nc
方法 3:设置默认允许所有访问
如果你希望保留 ACL 功能,但允许所有 IP 地址访问,可以将默认行为设置为 allow
。
-
编辑
acl.conf
文件:
打开acl.conf
文件,修改默认行为。 -
设置默认允许:
将所有<list>
的default
属性设置为allow
,例如:<configuration name="acl.conf" description="Network Lists"> <network-lists> <list name="lan" default="allow"> <!-- 无具体规则,默认允许所有访问 --> </list> <list name="domains" default="allow"> <!-- 无具体规则,默认允许所有访问 --> </list> </network-lists> </configuration>
-
重启 FreeSWITCH:
重启 FreeSWITCH 以使更改生效:freeswitch -stop freeswitch -nc
方法 4:临时关闭 ACL
如果你只想临时关闭 ACL,可以通过 FreeSWITCH 控制台执行命令。
-
进入 FreeSWITCH 控制台:
运行以下命令进入 FreeSWITCH 控制台:fs_cli
-
禁用 ACL:
执行以下命令临时禁用 ACL:acl reload acl del all
-
验证:
检查 ACL 是否已禁用:acl list
注意事项
- 安全性:关闭 ACL 后,所有 IP 地址都可以访问 FreeSWITCH 的服务,可能会带来安全风险。建议在生产环境中谨慎操作。
- 备份配置:在修改配置文件之前,建议备份原始文件,以便需要时恢复。
总结
关闭 FreeSWITCH 的 ACL 配置可以通过以下方式实现:
- 禁用
mod_acl
模块。 - 清空
acl.conf
文件。 - 设置默认允许所有访问。
- 临时通过控制台命令禁用 ACL。
根据你的需求选择合适的方法,并注意操作后的安全性影响。
这是 FreeSWITCH 中 mod_amqp
模块的配置文件,用于集成 FreeSWITCH 与 AMQP(Advanced Message Queuing Protocol)消息队列服务(如 RabbitMQ)。该文件定义了 事件发布、命令接收、日志传输 的详细规则。以下是核心配置的解释:
1. 生产者(Producers)配置
<producers>
<profile name="default">
<connections>
<!-- 主备连接配置 -->
<connection name="primary">
<param name="hostname" value="localhost"/>
<param name="port" value="5673"/>
<param name="username" value="guest"/>
<param name="password" value="guest"/>
<param name="virtualhost" value="/"/>
</connection>
<connection name="secondary">
<param name="port" value="5672"/>
<!-- 其他参数同 primary -->
</connection>
</connections>
<params>
<!-- 事件发布到 AMQP 的交换机 -->
<param name="exchange-name" value="TAP.Events"/>
<param name="exchange-type" value="topic"/>
<!-- 事件过滤:仅发送指定类型的事件 -->
<param name="event_filter" value="SWITCH_EVENT_CHANNEL_CREATE,SWITCH_EVENT_CHANNEL_DESTROY,..."/>
<!-- 路由键生成规则 -->
<param name="format_fields" value="#FreeSWITCH,FreeSWITCH-Hostname,Event-Name,Event-Subclass,Unique-ID"/>
</params>
</profile>
</producers>
- 作用:将 FreeSWITCH 事件(如通话创建、DTMF 按键)发布到 AMQP 服务器。
- 关键参数:
exchange-name
:AMQP 交换机名称,事件通过此交换机路由。exchange-type
:交换机类型为topic
,支持基于路由键的灵活消息分发。event_filter
:过滤需要发送的事件类型(如CHANNEL_CREATE
表示通话创建事件)。format_fields
:定义路由键的生成方式。例如:#FreeSWITCH
是固定值,FreeSWITCH-Hostname
是系统变量,Event-Name
是事件类型。- 最终路由键可能为
FreeSWITCH.localhost.CHANNEL_CREATE.42a1d8e8
。
enable_fallback_format_fields
:启用备用字段(如字段不存在时使用#Unknown
)。
2. 命令(Commands)配置
<commands>
<profile name="default">
<connections>
<!-- 命令接收的连接配置 -->
<connection name="primary" port="5672"/>
</connections>
<params>
<param name="exchange-name" value="TAP.Commands"/>
<param name="binding_key" value="commandBindingKey"/>
<!-- 队列属性:临时队列,自动删除 -->
<param name="queue-auto-delete" value="true"/>
</params>
</profile>
</commands>
- 作用:通过 AMQP 接收外部系统发送的命令(如发起通话、转移呼叫)。
- 关键参数:
binding_key
:队列与交换机的绑定键,用于匹配命令消息。queue-auto-delete
:队列在断开连接后自动删除,适用于临时命令处理。
3. 日志(Logging)配置
<logging>
<profile name="default">
<connections>
<!-- 日志传输的连接配置 -->
<connection name="primary" port="5672"/>
</connections>
<params>
<param name="exchange-name" value="TAP.Logging"/>
<!-- 日志级别:从 debug 到 alert -->
<param name="log-levels" value="debug,info,notice,warning,err,crit,alert"/>
</params>
</profile>
</logging>
- 作用:将 FreeSWITCH 日志发送到 AMQP 服务器,便于集中监控和分析。
- 关键参数:
log-levels
:指定传输的日志级别,例如debug
表示详细调试信息,alert
表示严重告警。
4. 连接通用参数
hostname
:AMQP 服务器地址(如localhost
表示本地服务)。port
:AMQP 端口(默认5672
,此处primary
使用5673
可能是容错配置)。heartbeat
:心跳检测间隔(0
表示禁用)。reconnect_interval_ms
:连接断开后重试间隔(1000
毫秒)。
5. 典型应用场景
- 事件驱动架构:将通话事件(如振铃、挂断)发送到消息队列,触发外部系统处理(如记录通话日志、触发 CRM 操作)。
- 远程命令执行:通过 AMQP 接收命令,实现动态呼叫控制(如外呼、转接)。
- 集中式日志管理:将日志发送到 ELK(Elasticsearch, Logstash, Kibana)等平台分析。
6. 配置优化建议
- 安全性:生产环境中避免使用默认账号
guest/guest
,应配置专用账号和权限。 - 高可用:配置多个 AMQP 节点(如 RabbitMQ 集群),并在
<connections>
中定义主备连接。 - 性能调优:
- 调整
send_queue_size
(发送队列大小)防止消息堆积。 - 设置合理的
circuit_breaker_ms
(熔断时间)避免网络故障导致阻塞。
- 调整
若需进一步调整事件类型或路由规则,可参考 FreeSWITCH 官方文档。
以下是针对 FreeSWITCH 中 amr.conf
配置文件的深度解析,结合 FreeSWITCH 的架构和实际应用场景进行扩展说明。
1. 配置文件背景
- 文件位置:
conf/autoload_configs/amr.conf
FreeSWITCH 的模块化设计会通过autoload_configs
目录自动加载核心模块的配置。 - 关联模块:
mod_amr
该配置文件由mod_amr
模块解析,需确保模块已启用(通过load_module mod_amr
加载)。
2. 核心参数详解(FreeSWITCH 视角)
2.1 default-bitrate
- 作用:
定义 AMR 编码的初始比特率(即通话建立时的首选编码模式)。
FreeSWITCH 行为:- 在 SIP/SDP 协商阶段,FreeSWITCH 会优先使用此比特率作为
fmtp
参数发送给对端设备。 - 若对端设备不支持该模式(如老旧手机),会触发
re-INVITE
协商降级到双方支持的比特率。
- 在 SIP/SDP 协商阶段,FreeSWITCH 会优先使用此比特率作为
- 典型场景:
- 国际长途/IP 漫游: 使用低比特率(如模式 0/1)节省带宽。
- 本地高质量通话: 模式 7(12.2 kbps)接近有线电话音质。
2.2 volte
- 作用:
控制是否启用 VoLTE 专用的fmtp
参数格式(如octet-align=1; mode-set=7
)。
FreeSWITCH 行为:volte=1
时,生成符合 3GPP TS 26.114 标准的 SDP 参数,确保与 IMS(IP 多媒体子系统)核心网兼容。volte=0
时,使用通用 AMR 参数格式(如mode-set=7
),兼容传统 SIP 设备。
- 典型场景:
- 运营商互联: 对接 VoLTE 网络时必须开启。
- 企业内网通话: 若终端不支持 VoLTE 可关闭。
2.3 adjust-bitrate
- 作用:
允许 FreeSWITCH 根据 RTCP 反馈(如丢包率、延迟)动态调整 AMR 比特率。
FreeSWITCH 行为:- 启用后(
adjust-bitrate=1
),FreeSWITCH 会监听 RTCP 报文中的网络质量指标。 - 若检测到网络拥塞,自动降低到更低比特率(如从模式 7→5),牺牲音质保畅通。
- 网络恢复后,逐步提升比特率(需对端支持
mode-change
信令)。
- 启用后(
- 典型场景:
- 移动网络通话: 4G/5G 网络波动时保持通话连续性。
- 跨国 VoIP 中继: 应对不可控的公网抖动。
2.4 force-oa
- 作用:
强制 FreeSWITCH 在发起呼叫时使用 Octet-Aligned (OA) 封包格式(RFC 4867)。
FreeSWITCH 行为:force-oa=1
时,在 SDP 中明确声明octet-align=1
,避免与某些设备(如早期 Android)的格式协商问题。force-oa=0
时,由 FreeSWITCH 自动选择封包格式(OA 或 Bandwidth-Efficient)。
- 典型场景:
- 兼容性问题: 若对端设备无法解析 AMR 封包,可尝试强制 OA 格式。
3. FreeSWITCH 中的 AMR 工作流程
- 模块加载:
FreeSWITCH 启动时加载mod_amr
,读取amr.conf
配置。 - 编码协商:
- 通话建立时,FreeSWITCH 根据
default-bitrate
生成 SDP Offer。 - 若对端响应中包含支持的 AMR 模式,选择双方最高交集模式。
- 通话建立时,FreeSWITCH 根据
- 动态调整:
- 启用
adjust-bitrate
后,FreeSWITCH 通过rtcp_stats
模块监控网络质量。 - 触发比特率切换时,发送
MODIFY
请求更新编码模式。
- 启用
4. 实际部署建议
4.1 网络适应性配置
<!-- 高丢包网络环境 -->
<param name="default-bitrate" value="5"/> <!-- 初始 7.95 kbps -->
<param name="adjust-bitrate" value="1"/> <!-- 启用动态降质 -->
4.2 VoLTE 对接配置
<!-- 运营商 VoLTE 对接 -->
<param name="volte" value="1"/> <!-- 启用 VoLTE 格式 -->
<param name="default-bitrate" value="7"/> <!-- 强制 12.2 kbps -->
<param name="force-oa" value="1"/> <!-- 避免封包格式冲突 -->
4.3 资源优化配置
<!-- 低资源服务器(如树莓派) -->
<param name="default-bitrate" value="3"/> <!-- 6.7 kbps 降低 CPU 负载 -->
<param name="adjust-bitrate" value="0"/> <!-- 禁用动态调整节省计算 -->
5. 调试与日志
- 查看 AMR 状态:
fs_cli> amr status
- 日志关键字:
AMR switching to mode X
(动态调整触发)AMR fmtp negotiation failed
(协商失败,检查模式兼容性)
6. 扩展知识:AMR 与 FreeSWITCH 其他模块
- 转码资源消耗:
AMR 转码(如 AMR↔G.711)需要较高 CPU,建议在媒体服务器(如mod_mediaproxy
)中集中处理。 - 录音兼容性:
AMR 录音文件(.amr)需特定播放器支持,可通过mod_shell_stream
转换为 WAV。 - DTMF 传输:
AMR 不支持带内 DTMF,需使用 RFC 2833 或 SIP INFO。
通过此配置,可以精细控制 FreeSWITCH 的 AMR 行为,平衡音质、带宽和兼容性。实际部署时建议结合 sngrep
抓包工具观察 SDP 协商过程。
以下是针对 FreeSWITCH 中 amrwb.conf
配置文件的深度解析,结合 AMR-WB(自适应多速率宽带音频编解码器) 的特性与 FreeSWITCH 的实际应用场景进行说明。
1. AMR-WB 与 AMR 的核心区别
- 频响范围:
- AMR (窄带):300–3400 Hz(传统电话音质)
- AMR-WB (宽带):50–7000 Hz(高清语音,接近人耳自然听觉)
- 应用场景:
- AMR-WB 用于 VoLTE HD Voice、视频会议等高音质需求场景。
- 代价:更高的带宽消耗(AMR-WB 最高 23.85 kbps,AMR 最高 12.2 kbps)。
2. 配置文件详解(FreeSWITCH 视角)
2.1 default-bitrate
- 值:
8
(对应 AMR-WB 23.85 kbps) - 作用:
设置初始编码模式(最高比特率),FreeSWITCH 在 SDP Offer 中优先声明此模式。 - 注意:
- 模式定义存在注释错误(模式 7 重复列出),实际应参考 3GPP TS 26.201 标准模式:
Mode 8: 23.85 kbps Mode 7: 23.05 kbps Mode 6: 19.85 kbps # 原注释中模式7的第二个条目应为模式6 ...(依此类推)
- 需修正注释以避免混淆。
- 模式定义存在注释错误(模式 7 重复列出),实际应参考 3GPP TS 26.201 标准模式:
2.2 volte
- 值:
1
(启用) - 作用:
生成符合 VoLTE 标准的 FMTP 参数(如mode-set=8
和octet-align=1
)。 - FreeSWITCH 行为:
- 在 SDP 中添加
a=fmtp
行:a=fmtp:98 octet-align=1; mode-set=8
(假设 payload 类型为 98)。 - 强制使用 Octet-Aligned 封包格式,确保与 IMS 核心网兼容。
- 在 SDP 中添加
2.3 adjust-bitrate
- 值:
0
(禁用) - 影响:
FreeSWITCH 不会根据 RTCP 反馈(如丢包率、抖动)动态调整比特率。 - 适用场景:
- 网络带宽稳定(如企业内网专线)。
- 强制保持高音质(如录音场景)。
2.4 force-oa
- 值:
0
(禁用) - 作用:
允许 FreeSWITCH 自动选择封包格式(OA 或 Bandwidth-Efficient)。 - 兼容性风险:
某些设备可能仅支持 OA 格式(如早期 VoLTE 终端),禁用后可能导致协商失败。
2.5 mode-set-overwrite
(新增关键参数)
- 值:
0
(禁用) - 作用:
0
:在 SDP Answer 中 镜像对端的模式集(取双方支持的交集)。1
:强制使用default-bitrate
定义的模式集,忽略对端支持的模式。
- 示例:
- 对端声明支持模式
[8,7,6]
,FreeSWITCH 配置为default-bitrate=8
且mode-set-overwrite=0
→ 实际使用模式 8。 - 若对端仅支持模式
[6,5]
,FreeSWITCH 将自动降级到模式 6(需adjust-bitrate=1
支持)。
- 对端声明支持模式
3. FreeSWITCH 中的 AMR-WB 工作流程
- SDP 协商阶段:
- FreeSWITCH 发送 Offer:
a=rtpmap:98 AMR-WB/16000/1
+a=fmtp:98 octet-align=1; mode-set=8
(volte=1
时)。 - 对端返回 Answer 中携带支持的模式集(如
mode-set=8,7,6
)。
- FreeSWITCH 发送 Offer:
- 编码模式选择:
- 若
mode-set-overwrite=0
,选择双方支持的最高模式(如模式 8)。 - 若
mode-set-overwrite=1
,强制使用default-bitrate
模式(即使对端不支持,可能导致协商失败)。
- 若
- 封包格式:
volte=1
或force-oa=1
时,使用 Octet-Aligned 格式;否则尝试 Bandwidth-Efficient。
4. 关键配置建议
4.1 高音质优先(企业会议系统)
<param name="default-bitrate" value="8"/>
<param name="volte" value="1"/>
<param name="mode-set-overwrite" value="1"/> <!-- 强制最高模式 -->
<param name="adjust-bitrate" value="0"/> <!-- 禁用动态降质 -->
- 风险:若对端不支持模式 8,通话可能无法建立。
4.2 兼容性优先(跨运营商互联)
<param name="default-bitrate" value="6"/> <!-- 19.85 kbps 广泛支持 -->
<param name="mode-set-overwrite" value="0"/> <!-- 允许模式协商 -->
<param name="adjust-bitrate" value="1"/> <!-- 启用动态调整 -->
4.3 VoLTE 终端适配
<param name="volte" value="1"/>
<param name="force-oa" value="1"/> <!-- 避免封包格式问题 -->
<param name="mode-set-overwrite" value="0"/> <!-- 遵守 IMS 协商规则 -->
5. 调试与故障排查
- 查看协商结果:
fs_cli> show channels # 查找对应 channel 的 codec 参数
audio read: AMR-WB@23k85 (8) # 显示当前使用的模式
- 日志关键词:
AMR-WB mode change to X
:动态调整触发(需adjust-bitrate=1
)。No common AMR-WB modes
:模式集不匹配,检查对端支持的 mode-set。
- 抓包分析:
使用sngrep
检查 SDP 中的fmtp
参数是否包含冲突的 mode-set。
6. 性能与资源管理
- CPU 消耗:
AMR-WB 编码复杂度高于 AMR,建议在媒体服务器(如mod_mediabridge
)上启用硬件加速。 - 带宽估算:
- 单个 AMR-WB 23.85 kbps 通话:约 30 kbps(包含 RTP 头部)。
- 100 路并发需至少 3 Mbps 上行带宽。
通过此配置,可优化 FreeSWITCH 在 VoLTE 或高清语音场景下的表现,需权衡音质、兼容性与网络资源消耗。建议在部署前使用 sipp
工具模拟不同模式集的协商过程。
以下是针对 FreeSWITCH 拨号计划中 features
上下文 的深度解析,该文件位于 /usr/local/freeswitch/conf/dialplan
目录下,主要用于实现高级通话功能(如呼叫转移、会议、安全检测等)。
1. 核心功能概览
扩展名 (extension) | 触发条件 | 主要功能 | 应用场景 |
---|---|---|---|
dx | 拨打 dx | 手动发起盲转(Blind Transfer) | 话机无物理转接键时使用 |
att_xfer | 拨打 att_xfer | 发起 attended transfer(协商转接) | 需要确认转接目标的场景 |
is_transfer | 由 execute_extension 触发 | 执行实际转接逻辑 | 配合 dx 扩展使用 |
cf | 拨打 cf | 将通话双方转入会议桥 | 快速创建三方会议 |
please_hold | 拨打 10xx (如1001) | 播放等待音乐并转接 | 客服系统转接队列 |
is_secure | 自动检测 | 验证通话是否加密(TLS+SRTP) | 安全合规场景(如金融行业) |
2. 逐项深度解析
2.1 dx
扩展:手动盲转
<extension name="dx">
<condition expression="^dx$">
<action application="answer"/>
<action application="read" data="11 11 'tone_stream://%(10000,0,350,440)' digits 5000 #"/>
<action application="execute_extension" data="is_transfer XML features"/>
</condition>
</extension>
- 流程:
- 用户拨打
dx
→ 接通后播放提示音(350+440Hz 复合音)。 - 使用
read
应用收集 DTMF 号码:- 最少 11 位,最多 11 位(实际应为更合理值,可能是配置笔误)。
- 超时 5 秒,以
#
结束。
- 执行
is_transfer
扩展进行转接。
- 用户拨打
- 问题:
read
的11 11
参数限制过于严格(需输入恰好 11 位),建议改为3 11
(最少3位)。- 无超时后处理逻辑(如播放错误提示)。
2.2 att_xfer
扩展:协商转接
<extension name="att_xfer">
<condition expression="^att_xfer$">
<action application="read" data="3 4 'tone_stream://%(10000,0,350,440)' digits 30000 #"/>
<action application="set" data="origination_cancel_key=#"/>
<action application="att_xfer" data="user/${digits}@$${domain}"/>
</condition>
</extension>
- 流程:
- 用户拨打
att_xfer
→ 收集 3-4 位 DTMF(30 秒超时)。 - 设置
origination_cancel_key=#
(允许按#
取消转接)。 - 使用
att_xfer
发起 attended transfer:- 转接目标为
user/号码@${domain}
(如user/1001@example.com
)。
- 转接目标为
- 用户拨打
- 关键区别:
- 盲转 (Blind):直接转接,不确认目标是否应答。
- 协商转接 (Attended):先呼叫目标,确认接通后再完成转接。
- 风险:未验证
${digits}
合法性,可能转接到无效分机。
2.3 is_transfer
扩展:转接执行
<extension name="is_transfer">
<condition expression="^is_transfer$"/>
<condition expression="^(\d+)$">
<action application="transfer" data="-bleg ${digits} XML default"/>
<anti-action application="eval" data="cancel transfer"/>
</condition>
</extension>
- 逻辑:
- 主叫方通过
dx
输入号码后,触发此扩展。 - 若输入为纯数字(
\d+
),执行transfer -bleg
(仅转接 B 腿,保留 A 腿控制权)。 - 否则执行
anti-action
取消转接。
- 主叫方通过
- 用途:适用于转接后需要保留监控权限的场景(如客服主管介入)。
2.4 cf
扩展:会议桥转接
<extension name="cf">
<condition expression="^cf$">
<action application="answer"/>
<action application="transfer" data="-both 30${dialed_extension:2} XML default"/>
</condition>
</extension>
- 示例:
用户拨打cf
→ 转接到会议室30xx
(如原始分机为1001
,则转入3001
)。 - 参数解析:
-both
:将通话双方(A+B 腿)均转入会议。${dialed_extension:2}
:截取分机号从第3位开始(如1001
→01
,组合成3001
)。
- 隐患:若
dialed_extension
长度不足,可能导致会议室号错误。
2.5 please_hold
扩展:等待转接
<extension name="please_hold">
<condition expression="^(10[01][0-9])$">
<action application="set" data="transfer_ringback=$${hold_music}"/>
<action application="answer"/>
<action application="sleep" data="1500"/>
<action application="playback" data="ivr/ivr-hold_connect_call.wav"/>
<action application="transfer" data="$1 XML default"/>
</condition>
</extension>
- 流程:
- 拨打
10xx
(如1001)→ 设置回铃音为等待音乐(${hold_music}
)。 - 播放提示音 “正在为您转接,请稍等…”。
- 转接到目标分机(
$1
即10xx
)。
- 拨打
- 用途:适用于呼叫中心将来电转接至坐席,期间播放品牌宣传音乐。
2.6 is_secure
扩展:安全通话验证
<extension name="is_secure" continue="true">
<condition field="${sip_via_protocol}" expression="tls"/>
<condition field="${rtp_secure_media_confirmed}" expression="^true$">
<action application="sleep" data="1000"/>
<action application="playback" data="misc/call_secured.wav"/>
<anti-action application="eval" data="not_secure"/>
</condition>
</extension>
- 验证条件:
- SIP 信令加密:
sip_via_protocol=tls
。 - 媒体流加密:
rtp_secure_media_confirmed=true
(SRTP/ZRTP)。
- SIP 信令加密:
- 行为:
- 安全通话:播放 “通话已加密” 提示音。
- 不安全通话:执行
anti-action
(记录日志或触发告警)。
- 注意:
continue="true"
允许继续匹配后续扩展。
3. 安全与优化建议
3.1 安全性增强
- 加密扩展改进:
<condition field="${sip_secure_media}" expression="true"/> <!-- 新增 SIP 加密检查 --> <condition field="${sip_Remote-Party-ID}" expression="\.(gov|bank)$"/> <!-- 限制域名 -->
- 防止 DTMF 注入:
在read
应用中添加正则过滤:<action application="read" data="... regex=^\d+$"/>
3.2 稳定性优化
- 添加错误处理:
<!-- 在 att_xfer 扩展中添加 --> <action application="log" data="WARNING Transfer to ${digits} failed"/> <action application="playback" data="ivr/ivr-invalid_extension.wav"/>
- 限制会议权限:
在cf
扩展中增加密码验证:<action application="transfer" data="-both 30${dialed_extension:2}@${password} XML default"/>
3.3 企业级部署建议
- 与 LDAP 集成:
在转接前查询 LDAP 验证分机有效性:<action application="curl" data="https://ldap-api/validate?ext=${digits}"/>
- CDR 记录增强:
添加自定义变量记录转接操作:<action application="set" data="xfer_operator=${caller_id_number}"/>
4. 调试命令
- 查看匹配过程:
fs_cli> sofia global capture on fs_cli> console loglevel debug
- 测试特定扩展:
fs_cli> originate user/1000 &dx # 测试 dx 扩展
- 检查安全状态:
fs_cli> uuid_dump <call-uuid> | grep secure
此配置展示了 FreeSWITCH 强大的呼叫控制能力,可灵活适配客服系统、安全通信、会议协作等场景。实际部署时需结合网络拓扑和安全策略进行调整。