跳到正文

软电话 WebRTC ICE/TURN 指南

本文描述 FreeSWITCH 迁移到 aliyun 后的生产拓扑。旧的“FRPS/FRPC 转发 SIP WebSocket 和 30000-30199/UDP RTP 到 debian12-show”拓扑已停用,不得再按旧方式增加代理。

1. 当前拓扑

组件地址或端口说明
浏览器 WSSwss://fs.wangijun.comNginx TLS 终止后重新加密到本机 FreeSWITCH 172.21.38.245:7443
SIP realmfs.wangijun.comFreeSWITCH 注册域
FreeSWITCH RTP123.57.205.60:30000-30199/UDP公网主机直接收发,不经过 FRP
TURN control123.57.205.60:3478/TCP+UDPcoturn 与 FreeSWITCH 同机
TURN relay123.57.205.60:31000-31040/UDP不经过 FRP,与 RTP 范围隔离
Apps/ONNX 上游127.0.0.1:12005-12013FRPS 仅绑定回环

浏览器从 callflow/callout 后端取得 TURN REST 短期凭据,向 coturn 创建 allocation。FreeSWITCH 只允许 softphone-turn-relay ACL 中的 123.57.205.60/32 candidate,避免选择移动网络 srflx 后 DTLS 长时间停在 HANDSHAKE

2. 必须一致的配置

  • vars.xmldomain=fs.wangijun.comdefault_password=myfs213(软电话 SIP 分机 1000~1019 密码),本机 SIP/RTP 绑定私网地址,external_sip_ip / external_rtp_ip 广告 123.57.205.60
  • switch.conf.xml:RTP 范围为 30000-30199
  • sip_profiles/internal.xmllocal-network-acl=noneapply-candidate-acl=softphone-turn-relay,WSS 监听 74435066/WS 只用于本机诊断。
  • acl.conf.xmldomains 允许同机 Nginx 私网源 172.21.38.245/32softphone-turn-relay 只允许 123.57.205.60/32callflow-esl-inbound 允许回环与 WSL/开发机公网出口网段。
  • coturn:external-ip=123.57.205.60/172.21.38.245,relay 为 31000-31040static-auth-secret 与 callflow/callout 私有配置完全一致。
  • Nginx:fs.wangijun.com 必须传递 Upgrade / ConnectionX-Real-IP / X-Forwarded-*,上游为 https://172.21.38.245:7443,配置 proxy_ssl_verify off。不能把浏览器 WSS 降级代理到 5066/WS;JsSIP 的 Via: WSS 与 Sofia 实际传输不一致时,REGISTER 不会收到认证响应。
  • 业务号码映射:callflow.call_business_number_mappings 必须全量预置 5000~50205090,Dialplan 拦截 ^50 转入 callflow-esl
  • 前端软电话:use-sip-softphone.ts 监听 icecandidate 事件并在 600ms 触发快速就绪保护,避免慢速节点探测导致 INVITE 发送延迟。

3. 端口边界

现有安全组继续使用 12000-12999/TCP+UDP16384-32768/UDP。本次不新增规则。 12015/TCP 是唯一直接开放的业务管理端口,并由 FreeSWITCH callflow-esl-inbound ACL 只允许 回环与开发/运维出口网段。FRP 的 12000-12013 通过 proxyBindAddr=127.0.0.1 仅供 阿里云本机进程访问。

4. 验收与拨打指南

  1. 软电话注册
    • 地址:https://callflow.wangijun.com/softphonehttps://callout.wangijun.com/softphone
    • SIP WebSocket:wss://fs.wangijun.com
    • Realm:fs.wangijun.com
    • 分机 / 用户名:1000
    • SIP 密码:myfs213
    • 点击注册,状态变为绿色 已在线
  2. 业务呼叫测试
    • 拨打 5001(默认语音回显)、5010(大模型实时对话)、5000(平台能力演示)、5020(软电话坐席辅助)。
  3. 媒体与信令核验
    • 从外网分别完成 TURN UDP 与 TCP authenticated allocation,relay 地址落在 123.57.205.60:31000-31040
    • 新建呼叫,浏览器 getStats() 中 selected candidate pair 使用 relay;FreeSWITCH 日志选择同一 relay candidate。
    • DTLS 完成,双方 RTP 收发计数持续增长,双向有声,A-leg 说话时 ASR partial/final、TTS 播放与录音落盘正常。

服务端检查:

bash
systemctl is-active freeswitch callflow-esl coturn nginx frps
ss -lntup | grep -E ':(3478|5066|7443|9911|9912|12015)\b'
ss -lunp | grep -E ':(300[0-9]{2}|301[0-9]{2}|310[0-4][0-9])\b'
journalctl -u freeswitch -u coturn --since '-10 minutes' --no-pager

文档与代码在同一仓库维护,现有 Markdown 是唯一内容源。