1. 安装 FreeSWITCH
Ubuntu/Debian 安装
# 添加 FreeSWITCH 仓库
wget -O - https://files.freeswitch.org/repo/deb/debian-release/fsstretch-archive-keyring.asc | apt-key add -
echo "deb http://files.freeswitch.org/repo/deb/debian-release/ `lsb_release -sc` main" > /etc/apt/sources.list.d/freeswitch.list
apt-get update
# 安装 FreeSWITCH
apt-get install -y freeswitch-meta-all
CentOS/RHEL 安装
yum install -y https://files.freeswitch.org/repo/yum/centos-release/freeswitch-release-repo-0-1.noarch.rpm
yum install -y freeswitch-config-vanilla
2. 配置 SIP Gateway(以菜鸟语音为例)
创建 Gateway 配置文件:
<!-- /etc/freeswitch/sip_profiles/external/cainiao.xml -->
<include>
<gateway name="cainiao-voice">
<!-- SIP 服务器地址 -->
<param name="realm" value="sip.cainiaovoice.com"/>
<param name="username" value="your_account"/>
<param name="password" value="your_password"/>
<!-- 注册设置 -->
<param name="register" value="true"/>
<param name="register-transport" value="udp"/>
<param name="retry-seconds" value="30"/>
<param name="ping-interval" value="30"/>
<!-- 主叫号码设置 -->
<param name="caller-id-in-from" value="true"/>
<param name="extension" value="your_did_number"/>
</gateway>
</include>
如果是 IP 白名单模式(无需注册),使用以下配置:
<include>
<gateway name="cainiao-ipauth">
<param name="realm" value="sip.cainiaovoice.com"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/>
</gateway>
</include>
3. 编解码器配置
编辑 SIP Profile 的编解码器设置:
<!-- /etc/freeswitch/vars.xml -->
<X-PRE-PROCESS cmd="set" data="global_codec_prefs=G722,PCMU,PCMA,G729"/>
<X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=PCMU,PCMA,G729"/>
4. Dialplan 配置(外呼路由)
<!-- /etc/freeswitch/dialplan/default.xml -->
<extension name="international-outbound">
<condition field="destination_number" expression="^(011\d+|00\d+|\+\d+)$">
<!-- 设置主叫号码 -->
<action application="set" data="effective_caller_id_number=your_did_number"/>
<action application="set" data="effective_caller_id_name=YourCompany"/>
<!-- 通过菜鸟语音网关呼出 -->
<action application="bridge" data="sofia/gateway/cainiao-voice/$1"/>
</condition>
</extension>
<!-- 按国家路由 -->
<extension name="route-us">
<condition field="destination_number" expression="^(\+1\d{10})$">
<action application="set" data="effective_caller_id_number=1XXXXXXXXXX"/>
<action application="bridge" data="sofia/gateway/cainiao-voice/$1"/>
</condition>
</extension>
5. NAT 穿越
如果 FreeSWITCH 在 NAT 后面(常见于云服务器),需要配置:
<!-- /etc/freeswitch/autoload_configs/switch.conf.xml -->
<param name="rtp-ip" value="YOUR_PUBLIC_IP"/>
<param name="sip-ip" value="YOUR_PUBLIC_IP"/>
<param name="ext-rtp-ip" value="YOUR_PUBLIC_IP"/>
<param name="ext-sip-ip" value="YOUR_PUBLIC_IP"/>
<param name="rtp-timeout-sec" value="300"/>
<param name="rtp-hold-timeout-sec" value="1800"/>
6. 安全加固
- ACL 限制:只允许 SIP 中继服务商的 IP 地址
- 强密码:网关密码至少16位随机字符
- 防火墙:只开放 5060/5061(SIP)和 RTP 端口范围
- fail2ban:自动封禁异常 IP
- 关闭不必要的服务:禁用不必要的 SIP Profile
7. 监控和运维
- fs_cli:FreeSWITCH 命令行控制台
- ESL(Event Socket Library):程序化监控和操控
- CDR:配置 CDR 输出到数据库或文件
- show channels:查看当前通话状态
- sofia status:查看 Gateway 注册状态
# 常用运维命令
fs_cli -x "sofia status profile external" # 查看 SIP Profile 状态
fs_cli -x "sofia status gateway cainiao-voice" # 查看网关注册状态
fs_cli -x "show channels count" # 查看当前并发数
fs_cli -x "reloadxml" # 重载配置(不中断通话)
8. 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| Gateway 注册失败 | 账号密码错误/网络不通 | 检查 credentials,ping SIP 服务器 |
| 单向语音 | NAT 问题/RTP 端口未开放 | 配置 ext-rtp-ip,开放 RTP 端口 |
| 通话中断 | 超时/编解码器不匹配 | 检查 session timeout,统一编解码器 |
| 通话质量差 | 带宽不足/网络抖动 | 检查带宽,启用 jitterbuffer |
菜鸟语音技术支持:菜鸟语音提供 7x24 中英文技术支持,从 FreeSWITCH/Asterisk 配置调试到线路上线的全流程协助。遇到 SIP 对接问题可以直接联系我们的技术团队。