联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话: QQ:3810899917

FreeSWITCH 如何通过 rport 实现回传,而客户端是内网 IP(如 192.168.x.x)?为什么还能成功?

FreeSWITCH 如何通过 rport 实现回传,而客户端是内网 IP(如 192.168.x.x)?为什么还能成功?

🔍 一、什么是 rport(RFC 3581 定义)

 

rportSIP 协议中的 NAT 穿透机制,由 RFC 3581 引入。

在 SIP 报文中,Via 头用于标明客户端希望响应回到哪里,例如:

makefile复制编辑Via: SIP/2.0/UDP 192.168.1.5:5060;branch=z9hG4bK...;rport

注意 rport 是个标志位,表示:

👉 “不要回复我 Via 里声明的 IP:Port(192.168.1.5:5060),请用你看到的我的实际来源地址和端口”进行回应”。

 


🧠 二、技术原理:为什么能成功“回源”?

 

1. 客户端从 NAT 网络发起 SIP 请求

 

比如 MicroSIP 在局域网 192.168.1.5:5060,它向 FreeSWITCH(公网)发起:

bash复制编辑REGISTER sip:sip.example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.5:5060;branch=...;rport

 


2. NAT 自动创建端口映射

 

当这个 UDP 包发出时,NAT 会动态分配一个公网映射:

 

内网地址映射后公网
192.168.1.5:5060203.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 注册成功 的响应包,发回这个公网地址

 

bash复制编辑SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.5:5060;received=203.0.113.5;rport=54321

这个 receivedrport 字段就告诉客户端,“我响应你了,是按你的实际地址发的”。

 


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)

 


🧠 五、一个完整过程图示(简化版):

 

text复制编辑MicroSIP(192.168.1.5:5060) ---[NAT]---> FreeSWITCH
        \                          /
         ---- NAT 转换成 -----> (203.0.113.5:54321)

FreeSWITCH 回复 REGISTER OK
         <---- SIP/2.0 200 OK ----
          to 203.0.113.5:54321

NAT 把回应 转发回 MicroSIP 内网地址

 


✅ 总结

 

项目内容
rportSIP 中 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),要连接公网,就必须:

csharp复制编辑[192.168.1.5] 内网设备

[NAT设备] 把你转换成一个公网地址

[FreeSWITCH 服务器公网 IP]

这个 NAT 设备就是你的路由器或防火墙。

 


🔍 三、你可以怎么验证你 NAT 存在?

 

  1. 本机 IP 是不是像 192.168.x.x10.x.x.x172.16.x.x 这种私网 IP?

    • 👉 说明你在 NAT 后面

  2. 打开这个网站:https://whatismyipaddress.com/

    • 显示的是你当前公网 IP

  3. 对比你电脑的 ipconfig(Windows)或 ifconfig(Linux/macOS)输出:

    	bash复制编辑ip a

    • 显示的如果是 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 映射不需要你配置,是自动生成的,只要你从内网“发起”连接。

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册