FreeSwitch的配置文件【acl,amqp,amr,amrwb,features】

这是 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/8172.16.0.0/12192.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= 属性。

关键点总结

  1. ACL 的作用

    • 控制哪些 IP 地址或 IP 段可以访问 FreeSWITCH 的服务。
    • 用于增强安全性,防止未经授权的访问。
  2. 默认 ACL

    • FreeSWITCH 会自动创建一些默认 ACL,如 rfc1918.autonat.auto 等。
  3. 自定义 ACL

    • 可以通过 <list><node> 定义自定义 ACL 规则。
    • 支持 allow(允许)和 deny(拒绝)两种操作。
    • 可以使用 cidr= 指定 IP 段,或 domain= 指定域名。
  4. 优先级

    • ACL 规则的优先级从上到下依次匹配,匹配到第一条规则后停止。

示例场景

  1. 限制特定 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>
    
  2. 允许特定域名的用户

    • 允许域名为 example.com 的用户访问。
    <list name="allow-domain" default="deny">
      <node type="allow" domain="example.com"/>
    </list>
    
  3. 结合 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 功能。

  1. 编辑 modules.conf.xml 文件
    找到 FreeSWITCH 的配置文件目录(通常位于 /usr/local/freeswitch/conf/autoload_configs/),打开 modules.conf.xml 文件。

  2. 注释或删除 mod_acl 模块
    找到以下行并注释或删除它:

    <load module="mod_acl"/>
    

    修改后:

    <!-- <load module="mod_acl"/> -->
    
  3. 重启 FreeSWITCH
    重启 FreeSWITCH 以使更改生效:

    freeswitch -stop
    freeswitch -nc
    

方法 2:清空 ACL 配置

如果你不想完全禁用 ACL 模块,但希望关闭所有 ACL 规则,可以清空 acl.conf 文件。

  1. 编辑 acl.conf 文件
    找到 acl.conf 文件(通常位于 /usr/local/freeswitch/conf/autoload_configs/),将其内容清空或保留为默认配置。

  2. 清空内容
    acl.conf 文件内容修改为:

    <configuration name="acl.conf" description="Network Lists">
      <network-lists>
        <!-- 清空所有 ACL 规则 -->
      </network-lists>
    </configuration>
    
  3. 重启 FreeSWITCH
    重启 FreeSWITCH 以使更改生效:

    freeswitch -stop
    freeswitch -nc
    

方法 3:设置默认允许所有访问

如果你希望保留 ACL 功能,但允许所有 IP 地址访问,可以将默认行为设置为 allow

  1. 编辑 acl.conf 文件
    打开 acl.conf 文件,修改默认行为。

  2. 设置默认允许
    将所有 <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>
    
  3. 重启 FreeSWITCH
    重启 FreeSWITCH 以使更改生效:

    freeswitch -stop
    freeswitch -nc
    

方法 4:临时关闭 ACL

如果你只想临时关闭 ACL,可以通过 FreeSWITCH 控制台执行命令。

  1. 进入 FreeSWITCH 控制台
    运行以下命令进入 FreeSWITCH 控制台:

    fs_cli
    
  2. 禁用 ACL
    执行以下命令临时禁用 ACL:

    acl reload
    acl del all
    
  3. 验证
    检查 ACL 是否已禁用:

    acl list
    

注意事项

  • 安全性:关闭 ACL 后,所有 IP 地址都可以访问 FreeSWITCH 的服务,可能会带来安全风险。建议在生产环境中谨慎操作。
  • 备份配置:在修改配置文件之前,建议备份原始文件,以便需要时恢复。

总结

关闭 FreeSWITCH 的 ACL 配置可以通过以下方式实现:

  1. 禁用 mod_acl 模块。
  2. 清空 acl.conf 文件。
  3. 设置默认允许所有访问。
  4. 临时通过控制台命令禁用 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. 典型应用场景

  1. 事件驱动架构:将通话事件(如振铃、挂断)发送到消息队列,触发外部系统处理(如记录通话日志、触发 CRM 操作)。
  2. 远程命令执行:通过 AMQP 接收命令,实现动态呼叫控制(如外呼、转接)。
  3. 集中式日志管理:将日志发送到 ELK(Elasticsearch, Logstash, Kibana)等平台分析。

6. 配置优化建议

  • 安全性:生产环境中避免使用默认账号 guest/guest,应配置专用账号和权限。
  • 高可用:配置多个 AMQP 节点(如 RabbitMQ 集群),并在 <connections> 中定义主备连接。
  • 性能调优
    • 调整 send_queue_size(发送队列大小)防止消息堆积。
    • 设置合理的 circuit_breaker_ms(熔断时间)避免网络故障导致阻塞。

若需进一步调整事件类型或路由规则,可参考 FreeSWITCH 官方文档


以下是针对 FreeSWITCHamr.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 协商降级到双方支持的比特率。
  • 典型场景:
    • 国际长途/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 工作流程

  1. 模块加载:
    FreeSWITCH 启动时加载 mod_amr,读取 amr.conf 配置。
  2. 编码协商:
    • 通话建立时,FreeSWITCH 根据 default-bitrate 生成 SDP Offer。
    • 若对端响应中包含支持的 AMR 模式,选择双方最高交集模式。
  3. 动态调整:
    • 启用 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 协商过程。


以下是针对 FreeSWITCHamrwb.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
      ...(依此类推)
      
    • 需修正注释以避免混淆。
2.2 volte
  • 1(启用)
  • 作用
    生成符合 VoLTE 标准的 FMTP 参数(如 mode-set=8octet-align=1)。
  • FreeSWITCH 行为
    • 在 SDP 中添加 a=fmtp 行:a=fmtp:98 octet-align=1; mode-set=8(假设 payload 类型为 98)。
    • 强制使用 Octet-Aligned 封包格式,确保与 IMS 核心网兼容。
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=8mode-set-overwrite=0 → 实际使用模式 8。
    • 若对端仅支持模式 [6,5],FreeSWITCH 将自动降级到模式 6(需 adjust-bitrate=1 支持)。

3. FreeSWITCH 中的 AMR-WB 工作流程

  1. SDP 协商阶段
    • FreeSWITCH 发送 Offer:a=rtpmap:98 AMR-WB/16000/1 + a=fmtp:98 octet-align=1; mode-set=8volte=1 时)。
    • 对端返回 Answer 中携带支持的模式集(如 mode-set=8,7,6)。
  2. 编码模式选择
    • mode-set-overwrite=0,选择双方支持的最高模式(如模式 8)。
    • mode-set-overwrite=1,强制使用 default-bitrate 模式(即使对端不支持,可能导致协商失败)。
  3. 封包格式
    • volte=1force-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_transferexecute_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>
  • 流程
    1. 用户拨打 dx → 接通后播放提示音(350+440Hz 复合音)。
    2. 使用 read 应用收集 DTMF 号码:
      • 最少 11 位,最多 11 位(实际应为更合理值,可能是配置笔误)。
      • 超时 5 秒,以 # 结束。
    3. 执行 is_transfer 扩展进行转接。
  • 问题
    • read11 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>
  • 流程
    1. 用户拨打 att_xfer → 收集 3-4 位 DTMF(30 秒超时)。
    2. 设置 origination_cancel_key=#(允许按 # 取消转接)。
    3. 使用 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位开始(如 100101,组合成 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>
  • 流程
    1. 拨打 10xx(如1001)→ 设置回铃音为等待音乐(${hold_music})。
    2. 播放提示音 “正在为您转接,请稍等…”。
    3. 转接到目标分机($110xx)。
  • 用途:适用于呼叫中心将来电转接至坐席,期间播放品牌宣传音乐。
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)。
  • 行为
    • 安全通话:播放 “通话已加密” 提示音。
    • 不安全通话:执行 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 强大的呼叫控制能力,可灵活适配客服系统、安全通信、会议协作等场景。实际部署时需结合网络拓扑和安全策略进行调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值