出国自建 VoIP(二):FreePBX 16 基础配置

在 Linux 虚拟机中部署 FreePBX 16,固定 IP,开启 PJSIP 与 chan_sip,并准备分机、中继、出站路由。

本文整理 FreePBX 侧配置。目标是让 SIP 软电话可以注册,并为后续语音网关接入准备中继和路由。

基础假设

示例网络如下:

项目示例值
FreePBX IP10.20.20.60
默认网关/路由器 IP10.20.20.1
SMG4004 网关 IP10.20.20.74
DNS114.114.114.114
PJSIP 端口5060
chan_sip 端口5160

FreePBX 可以直接使用官方 ISO 安装。老版本 FreePBX 16 常见底层是 CentOS/RHEL 系发行版,网络配置路径和 Debian/Ubuntu 不同。

原文中的整体架构图如下:

FreePBX 自建 VoIP 架构

固定 FreePBX IP

安装完成后,如果系统通过 DHCP 获取地址,先改为静态 IP。以 eth0 为例:

vi /etc/sysconfig/network-scripts/ifcfg-eth0

保留原文件里的其他字段,只调整关键项:

TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=10.20.20.60
NETMASK=255.255.255.0
GATEWAY=10.20.20.1
DNS1=114.114.114.114
DEFROUTE="yes"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"

重启后确认地址:

ip addr show eth0
ip route

不要在 FreePBX 初始阶段把 DNS 指向代理 DNS。PBX 的外部地址检测、NAT 判断和模块更新都可能因此变得难排查。

初始化 Web 管理

浏览器打开:

http://10.20.20.60/

初始化管理员账号后,先完成三件事:

  1. 设置系统语言、时区和区域。
  2. 更新 FreePBX 模块。
  3. 进入 Settings -> Asterisk SIP Settings 检查 SIP 监听端口。

如果界面里找不到 chan_sip 相关设置,先到高级设置里确认 chan_sip 是否启用。语音网关这类老设备经常更适合走 chan_sip 中继,而手机软电话分机建议走 PJSIP。

开启 PJSIP UDP/TCP

进入:

Settings -> Asterisk SIP Settings -> SIP Settings [chan_pjsip]

确认至少启用:

  • UDP:0.0.0.0:5060
  • TCP:按需启用 0.0.0.0:5060
  • Local Networks:填写内网网段,例如 10.20.20.0/24
  • External Address:如果只在 VPN/内网使用,可以先不填;如果跨公网,要填真实公网地址或 DDNS

RTP 端口保持默认通常即可:

10000-20000/udp

下面这几张是旧文里 Asterisk SIP Settings 的配置截图,可以对照界面位置和选项名称:

进入 Asterisk SIP Settings

PJSIP 设置页面

PJSIP UDP/TCP 监听设置

SIP 网络与 NAT 设置

启用 chan_sip 和设置地区、时间时,可以参考:

高级设置入口

启用 chan_sip

创建 PJSIP 分机

进入:

Applications -> Extensions -> Add Extension -> Add New PJSIP Extension

示例:

项目示例
User Extension1001
Display Namephone-1001
Secret32 位以上随机密码
Voicemail按需开启

生成密码可以在 Linux 上运行:

openssl rand -base64 24 | cut -c1-32

也可以使用 pwgen

apt install pwgen
pwgen -s 32 1

软电话客户端配置:

项目示例
SIP Server10.20.20.60
Username1001
Password分机 Secret
TransportUDP 或 TCP

创建两个分机互拨成功后,再继续接网关。基础分机不通时,不要急着配置中继。

分机创建界面参考:

新增 PJSIP 分机

设置分机账号与密钥

分机高级选项

创建给网关使用的 chan_sip 中继

进入:

Connectivity -> Trunks -> Add Trunk -> Add SIP (chan_sip) Trunk

Trunk Name 可以写:

smg4004

PEER Details 示例:

host=dynamic
port=5160
type=peer
secret=CHANGE_TO_A_LONG_RANDOM_PASSWORD
context=from-pstn
dtmfmode=rfc2833
insecure=no
qualify=3000

这里的 secret 要和语音网关注册到 FreePBX 时填写的密码一致。context=from-pstn 表示从网关进来的呼叫按入站线路处理。

旧文中的中继配置流程截图:

新增 chan_sip 中继

填写中继基础信息

中继 SIP 设置

中继 PEER Details

出站路由

进入:

Connectivity -> Outbound Routes

新增一条路由:

项目示例
Route Namemobile-out
Dial PatternsX.
Trunk Sequencesmg4004

X. 表示允许直接拨手机号,不额外加拨 9 之类前缀。个人自用比较直观,但一定要确保分机密码强、SIP 不裸露公网,否则风险很高。

出站路由设置参考:

新增出站路由

选择中继

设置 X. 拨号匹配

入站路由

进入:

Connectivity -> Inbound Routes

测试阶段可以先建一个 catch-all 入站路由:

项目示例
Descriptionmobile-in
DID Number留空
CallerID Number留空
DestinationExtension 1001

等呼入跑通后,再按 SIM 卡口、DID 或分机组做更细分的分配。

中文语音与功能码

如果需要中文语音提示,可以上传 FreePBX/Asterisk 中文语音包,并在声音语言里选择中文。常用功能码可在:

Admin -> Feature Codes

里查看,例如语音邮箱、会议、呼叫转移、闹铃回拨等。个人方案里不一定都用得上,但知道它们在哪里,后面排错会更从容。

中文语音包和功能码界面参考:

声音语言设置

上传中文语音文件

选择中文语言

应用中文语音

保存语音设置

功能码列表

验证清单

完成后至少检查:

  1. FreePBX 固定 IP 不会变化。
  2. PJSIP 分机可以注册。
  3. 两个分机之间可以互拨。
  4. chan_sip 中继已创建。
  5. 出站路由指向网关中继。
  6. 入站路由能把网关来电送到指定分机。

到这里,FreePBX 侧已经准备好。下一步是让三汇 SMG4004 这类语音网关注册到这个中继。