FreeSWITCH 如何通过 rport 实现回传,而客户端是内网 IP(如 192.168.x.x)?为什么还能成功?
🔍 一、什么是 rport(RFC 3581 定义)
rport 是 SIP 协议中的 NAT 穿透机制,由 RFC 3581 引入。
在 SIP 报文中,Via 头用于标明客户端希望响应回到哪里,例如:
注意 rport 是个标志位,表示:
👉 “不要回复我 Via 里声明的 IP:Port(192.168.1.5:5060),请用你看到的我的实际来源地址和端口”进行回应”。
🧠 二、技术原理:为什么能成功“回源”?
1. 客户端从 NAT 网络发起 SIP 请求
比如 MicroSIP 在局域网 192.168.1.5:5060,它向 FreeSWITCH(公网)发起:
2. NAT 自动创建端口映射
当这个 UDP 包发出时,NAT 会动态分配一个公网映射:
| 内网地址 | 映射后公网 |
|---|---|
| 192.168.1.5:5060 | 203.0.113.5:54321(例如) |
这个映射使得外部设备可以在 短时间内 发 UDP 包给 203.0.113.5:54321,NAT 会转发给 192.168.1.5:5060。
3. FreeSWITCH 收到请求,看到 rport,请“回源地址+端口”
FreeSWITCH 看到:
Via里有rport,它知道不能相信 192.168.1.5:5060它查看实际收到包的源 IP:Port(就是 NAT 的公网映射)
例如:
203.0.113.5:54321
于是它把 200 OK 注册成功 的响应包,发回这个公网地址
这个 received 和 rport 字段就告诉客户端,“我响应你了,是按你的实际地址发的”。
4. NAT 端口映射保持有效,响应成功送达
由于请求刚刚发出,NAT 设备上这个端口映射还未超时,响应包可以顺利返回。
于是,即使客户端是内网 IP,响应依然能回达 —— 这就是 rport 技术的精妙之处。
🔐 三、为什么不能只信 Via 的 IP 和端口?
因为:
Via头中是客户端自填的 IP(通常是内网地址)如果服务器直接用它发响应,会发给 192.168.x.x,根本无法路由
✅ 所以 rport 就像一个旗帜,告诉服务器:“请信你看到的源地址,不要信我写在包里的地址”
🧪 四、rport 的常见搭配机制
| 机制 | 作用 |
|---|---|
rport | 回源响应 SIP 请求,适用于 UDP |
received= | 标注实际源 IP,用于日志/调试 |
Contact: 携带公网地址 | 客户端通过 ALG 或 STUN 预填公网 IP/端口 |
keepalive | 保持 NAT 映射存活(REGISTER/OPTIONS/ping) |
🧠 五、一个完整过程图示(简化版):
✅ 总结
| 项目 | 内容 |
|---|---|
rport 是 | SIP 中 NAT 回源响应的技术,由客户端请求启用 |
| 为什么能通信 | 因为 NAT 会建立临时的 UDP 映射,FreeSWITCH 回源发响应 |
| 何时失效 | 如果 NAT 映射过期(比如长时间没通信),回源就会失败,需 keepalive |
| 是否万能 | 不是,遇到对称 NAT 或防火墙阻断 RTP 时,仍需 STUN/TURN 辅助 |
一、NAT 到底是谁实现的?
NAT(网络地址转换)不是你手动配置的,而是:
✅ 由你所用的 路由器、光猫、公司网关、防火墙设备 自动实现的。
✅ 现实情况:
| 设备 | 是否自动做NAT | 说明 |
|---|---|---|
| 家用路由器(TPLINK、小米等) | ✅ 是 | 默认自动把内网 192.168.x.x 转成公网 IP |
| 公司防火墙/网关 | ✅ 是 | 透明做 NAT |
| 光猫(宽带终端) | ✅ 是 | 很多带路由功能的光猫也做 NAT |
你没有配置,是因为这些设备出厂就默认启用了 NAT。
📦 二、为什么 NAT 是默认存在的?
现代 IPv4 网络已经地址不够用了,几乎所有家庭/企业都使用私网 IP(如 192.168.x.x),要连接公网,就必须:
这个 NAT 设备就是你的路由器或防火墙。
🔍 三、你可以怎么验证你 NAT 存在?
本机 IP 是不是像
192.168.x.x、10.x.x.x、172.16.x.x这种私网 IP?👉 说明你在 NAT 后面。
打开这个网站:https://whatismyipaddress.com/
显示的是你当前公网 IP
对比你电脑的
ipconfig(Windows)或ifconfig(Linux/macOS)输出:显示的如果是
192.168.1.xxx,那你就不是公网地址,有 NAT 存在
🧠 四、FreeSWITCH 能收到请求,是 NAT 映射帮你做的
举个例子:
你的电脑:192.168.1.100:5060(内网)
向 FreeSWITCH 发送 SIP 包(UDP)
路由器 NAT:给你创建了一个 临时映射
192.168.1.100:5060 ⇒ 222.66.88.5:54321(公网IP:端口)
FreeSWITCH 就是回应这个地址
这个 NAT 映射不需要你配置,是自动生成的,只要你从内网“发起”连接。


评论