这篇先讲整体方案。后面几篇分别拆 FreePBX、三汇/申瓯类 GSM 语音网关、Telegram Bot 和 Python 短信桥接服务。
适用场景
出国或长期异地时,国内手机号还要接验证码、接电话、偶尔拨电话,但实体 SIM 卡不方便带在身边。这套方案的思路是:
- SIM 卡插在国内的 GSM/VoLTE/GOIP 语音网关里。
- 语音网关通过 SIP 注册到内网的 FreePBX。
- 手机、电脑或平板使用 SIP 软电话注册到 FreePBX。
- 来电从语音网关进入 FreePBX,再分配到你的 SIP 分机。
- 拨号时 SIP 分机呼叫 FreePBX,FreePBX 再把呼叫送到语音网关,由国内 SIM 卡呼出。
- 短信不强行走 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 UDP | UDP | 5060 |
| PJSIP TCP | TCP | 5060 |
| chan_sip | UDP | 5160 |
| RTP 语音流 | UDP | 10000-20000 |
| Web 管理 | TCP | 80 / 443 |
实际端口以 FreePBX 的 Asterisk SIP Settings 为准。网关和 FreePBX 如果在同一个内网,配置会简单很多;如果跨公网,NAT、RTP 端口映射和安全风险都会明显增加。
实现顺序
建议按下面顺序做,不要一上来就把所有东西混在一起排错:
- 安装 FreePBX,固定 IP,确认 Web 管理能打开。
- 建一个 PJSIP 分机,用软电话在内网注册成功。
- 两个 SIP 分机互拨,确认 FreePBX 基础功能正常。
- 创建给语音网关使用的 chan_sip 中继。
- 让语音网关整机注册到 FreePBX。
- 配置出站路由,用 SIP 分机拨手机号测试呼出。
- 配置入站路由,用外部手机拨 SIM 卡号码测试呼入。
- 创建 Telegram Bot。
- 部署 Python 短信桥接服务。
- 最后再做远程接入、VPN、备份和防火墙。
每一步只验证一个目标。比如“分机能注册”和“网关能呼出”不要混在一起排错,否则日志会非常乱。
网络建议
FreePBX 和语音网关最好放在同一个二层或同一个可信内网,IP 固定。例如:
| 设备 | 示例 IP |
|---|---|
| FreePBX | 10.20.20.60 |
| 语音网关 / SMG4004 | 10.20.20.74 |
| 短信 Bot VM | 10.20.20.75 |
| 网关/路由器 | 10.20.20.1 |
DNS 建议先用国内可直连 DNS,例如 114.114.114.114 或本地路由器。FreePBX 初次配置时如果 DNS 走代理,容易让外部地址识别和 NAT 诊断变复杂。
安全边界
这类系统最怕两件事:
- SIP 暴露到公网后被撞库,产生高额话费;
- Telegram Bot Token 泄漏后被外人发短信或读短信。
基本原则:
- FreePBX 管理后台不要裸露公网。
- SIP 注册优先通过 VPN 回家。
- 分机密码使用 32 位以上随机密码。
- Telegram Bot Token 只放在服务器环境变量或 root 可读配置里。
- 网关后台只允许内网访问。
- 定期备份 FreePBX 配置和 Python 脚本。
文章拆分
这一组文章按模块拆开:
出国自建 VoIP(二):FreePBX 16 基础配置出国自建 VoIP(三):三汇 SMG4004 网关对接 FreePBX出国自建 VoIP(四):创建 Telegram Bot 并规划短信桥接出国自建 VoIP(五):Python 短信 Bot 与 systemd 自启动
先把语音链路跑通,再补短信链路。电话和短信的技术路径不同,拆开处理会清爽很多。