出国自建 VoIP(一):整体架构与实现路线

把手机卡留在国内,通过语音网关、FreePBX、SIP 软电话和 Telegram Bot 实现异地接打电话与短信通知。

这篇先讲整体方案。后面几篇分别拆 FreePBX、三汇/申瓯类 GSM 语音网关、Telegram Bot 和 Python 短信桥接服务。

适用场景

出国或长期异地时,国内手机号还要接验证码、接电话、偶尔拨电话,但实体 SIM 卡不方便带在身边。这套方案的思路是:

  1. SIM 卡插在国内的 GSM/VoLTE/GOIP 语音网关里。
  2. 语音网关通过 SIP 注册到内网的 FreePBX。
  3. 手机、电脑或平板使用 SIP 软电话注册到 FreePBX。
  4. 来电从语音网关进入 FreePBX,再分配到你的 SIP 分机。
  5. 拨号时 SIP 分机呼叫 FreePBX,FreePBX 再把呼叫送到语音网关,由国内 SIM 卡呼出。
  6. 短信不强行走 FreePBX,而是通过网关的 HTTP API、邮件或本地脚本桥接到 Telegram。

这不是商用呼叫中心方案,更适合作为个人学习和低频自用。使用前务必确认所在地和 SIM 卡运营商规则,别拿它做违法、骚扰、批量呼叫等事情。

推荐拓扑

国内机房 / 家中内网

SIM 卡
语音网关(SMG4004 / GOIP)
  ↓ SIP Trunk
FreePBX / Asterisk
  ↓ PJSIP Extension
SIP 软电话客户端

短信路径:
语音网关 API / Email / SMPP
Python Bot 服务
Telegram Bot / 私聊 / 群组

如果人在海外,SIP 客户端不要直接裸露访问家里的 FreePBX。更稳的做法是先用 WireGuard、Tailscale、ZeroTier 或其他 VPN 回到内网,再注册 SIP 分机。

组件分工

FreePBX 负责:

  • 管理 SIP 分机;
  • 管理中继;
  • 设置入站、出站路由;
  • 处理拨号规则、语音提示、语音邮箱等 PBX 功能。

语音网关负责:

  • 插 SIM 卡;
  • 接入移动网络;
  • 把 SIM 卡通话能力转换成 SIP 中继;
  • 提供短信收发接口。

Telegram Bot 负责:

  • 接收短信通知;
  • 接收你在 Telegram 里发出的短信发送指令;
  • 把指令交给本地脚本或网关 API。

Linux 虚拟机负责:

  • 运行 FreePBX;
  • 运行短信桥接脚本;
  • 用 systemd 管理长期服务;
  • 提供日志、备份和网络隔离。

端口与协议

FreePBX 常见端口:

用途协议默认端口
PJSIP UDPUDP5060
PJSIP TCPTCP5060
chan_sipUDP5160
RTP 语音流UDP10000-20000
Web 管理TCP80 / 443

实际端口以 FreePBX 的 Asterisk SIP Settings 为准。网关和 FreePBX 如果在同一个内网,配置会简单很多;如果跨公网,NAT、RTP 端口映射和安全风险都会明显增加。

实现顺序

建议按下面顺序做,不要一上来就把所有东西混在一起排错:

  1. 安装 FreePBX,固定 IP,确认 Web 管理能打开。
  2. 建一个 PJSIP 分机,用软电话在内网注册成功。
  3. 两个 SIP 分机互拨,确认 FreePBX 基础功能正常。
  4. 创建给语音网关使用的 chan_sip 中继。
  5. 让语音网关整机注册到 FreePBX。
  6. 配置出站路由,用 SIP 分机拨手机号测试呼出。
  7. 配置入站路由,用外部手机拨 SIM 卡号码测试呼入。
  8. 创建 Telegram Bot。
  9. 部署 Python 短信桥接服务。
  10. 最后再做远程接入、VPN、备份和防火墙。

每一步只验证一个目标。比如“分机能注册”和“网关能呼出”不要混在一起排错,否则日志会非常乱。

网络建议

FreePBX 和语音网关最好放在同一个二层或同一个可信内网,IP 固定。例如:

设备示例 IP
FreePBX10.20.20.60
语音网关 / SMG400410.20.20.74
短信 Bot VM10.20.20.75
网关/路由器10.20.20.1

DNS 建议先用国内可直连 DNS,例如 114.114.114.114 或本地路由器。FreePBX 初次配置时如果 DNS 走代理,容易让外部地址识别和 NAT 诊断变复杂。

安全边界

这类系统最怕两件事:

  • SIP 暴露到公网后被撞库,产生高额话费;
  • Telegram Bot Token 泄漏后被外人发短信或读短信。

基本原则:

  1. FreePBX 管理后台不要裸露公网。
  2. SIP 注册优先通过 VPN 回家。
  3. 分机密码使用 32 位以上随机密码。
  4. Telegram Bot Token 只放在服务器环境变量或 root 可读配置里。
  5. 网关后台只允许内网访问。
  6. 定期备份 FreePBX 配置和 Python 脚本。

文章拆分

这一组文章按模块拆开:

  • 出国自建 VoIP(二):FreePBX 16 基础配置
  • 出国自建 VoIP(三):三汇 SMG4004 网关对接 FreePBX
  • 出国自建 VoIP(四):创建 Telegram Bot 并规划短信桥接
  • 出国自建 VoIP(五):Python 短信 Bot 与 systemd 自启动

先把语音链路跑通,再补短信链路。电话和短信的技术路径不同,拆开处理会清爽很多。