当前位置: 代码迷 >> 综合 >> STUN Server的NAT穿透
  详细解决方案

STUN Server的NAT穿透

热度:46   发布时间:2023-12-18 15:33:10.0

一、在虚拟加粗样式机中配置STUN服务器
【这里的eth0不同的电脑网卡名可能不一样,可通过ifconfig命令查看】
(1)分配一个虚拟网卡eth0:1 【也可以命名为eth0:0、eth0:2,这个随意,只要是没有被占用的IP即可;但是要注意,这个虚拟网卡是临时分配的,每次重启虚拟机都要重新分配】
分配指令:sudo ifconfig eth0:1 192.168.128.159 up
解除指令:sudo ifconfig eth0:1 192.168.125.159 down

(2)开启STUN服务
模板:./stunserver -mode full -primaryinterface [eth0-IP] -altinterface [eth0:1-IP]
示例:./stunserver -mode full -primaryinterface 192.168.128.115 -altinterface 192.168.128.159

二、分析抓包数据

(1)测试环境搭建:
话机Web端的配置:
帐号-》帐号x-》基本设置-》网络设置-》NAT检测 :STUN
电话设置—》基本设置-》STUN服务器,配置一个工作环境中的服务器

连接方式:
1)从工作环境中连接一根网线连接路由器Wan口
2)待测话机、电脑通过HUB连接在路由器的LAN口
3)辅助话机就处于工作环境中

(2)抓包分析:
在分析抓包之前请明确NAT四种类型的分类,
且明确:完全圆锥型、受限圆锥型、端口受限圆锥型、对称型,
这四种类型的限制,后一种是在前一种的基础上,越来越大的

step1. 检测主机是否位于NAT后

DUT ----------------------------------------> eth0:3478 【Binging Request 】

DUT <---------------------------------------- eth0:3478 【Binging Response】

①为了检测IP地址是不是公网地址,DUT首先发送任意一个UDP数据包给服务器S 的SOURCE-ADDRESS(192.168.128.180:3478)

②S收到包之后,用SOURCE-ADDRESS(192.168.128.180:3478)将接收到数据包头的IP地址和端口打成一个UDP反馈包发送给DUT。DUT在收到反馈包之后,比较自身的 IP 和反馈包中的MAPPED-ADDRESS属性中的 IP、Port:
Attribute: MAPPED-ADDRESS
Attribute Type: MAPPED-ADDRESS (0x0001)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 17115
IP: 192.168.128.168

结果判断
1.1 如果一样则说明DUT没有经过NAT穿透

1.2 否则,就是位于NAT之后。这里的192.168.128.168实际为路由器的WAN口的公网IP,而DUT的IP为路由器的LAN口地址192.168.1.100

同时记住服务器 S返回的以下两个属性,两个IP恰对应STUN服务器设置的eth0 eth1
Attribute: SOURCE-ADDRESS
Attribute Type: SOURCE-ADDRESS (0x0004)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 3478
IP: 192.168.128.180

Attribute: CHANGED-ADDRESS
Attribute Type: CHANGED-ADDRESS (0x0005)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 3479
IP: 192.168.128.123

eth0:3478 ——> SOURCE-ADDRESS(192.168.128.180:3478)
eth1:3479 ——> CHANGED-ADDRESS(192.168.128.123:3479)

这里并不能判断NAT的具体属于哪一种类型,而仅仅是判断是否有NAT存在,下一步才开始判断NAT的类型

step2. 检测NAT是否是完全锥型

DUT ----------------------------------------> eth0:3478 【Binging Request 】

DUT <---------------------------------------- eth1:3479 【Binging Response】

③为了检测所处的NAT是否是完全锥型的,DUT向服务器S 采用 SOURCE-ADDRESS(192.168.128.180:3478)发送UDP数据包后,携带如下属性
Attribute: CHANGE-REQUEST
Attribute Type: CHANGE-REQUEST (0x0003)
Attribute Length: 4
… … … .1… = Change IP: Set
… … … …1. = Change Port: Set

即希望服务器S 换一个IP:Port (即 eth1:3479)返回我的响应

④这时服务器 S 采用CHANGED-ADDRESS(192.168.128.123:3479) 将接收到数据包头的IP地址和端口打成一个UDP反馈包发送给DUT。

另外,DUT在发送UDP数据包后,立即开始端口监听,设定一个等待时间上限,防止无限堵塞(因为接收是一个While循环)。——暂未研究

结果判断
2.1 在这整个过程中只要收到一次服务的包,也就是有 ④ 返回,就说明DUT所处的NAT类型是完全限制型的。
此时查看服务器返回的响应,会发现SOURCE-ADDRESS、 CHANGED-ADDRESS的IP、Port均替换成了192.168.128.123:3479
Attribute: SOURCE-ADDRESS
Attribute Type: SOURCE-ADDRESS (0x0004)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 3479
IP: 192.168.128.123
Attribute: CHANGED-ADDRESS
Attribute Type: CHANGED-ADDRESS (0x0005)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 3479
IP: 192.168.128.123

确定为Full cone NAT 之后,DUT采用新的端口(如SIP注册帐号1的默认端口5060)向服务器发送UDP包,能接收到回复说明端口正常,就可以正常进行SIP注册流程,抓包见附件。

个人理解:SIP注册包中内网192.168.1.100:5060 映射到 192.168.128.168:5060 向 192.168.125.254 发起注册

Message Header
Via: SIP/2.0/UDP 192.168.128.168:5060;branch=z9hG4bK513312772;rport
From: sip:334101@192.168.125.254;tag=1374544619
To: sip:334101@192.168.125.254
Call-ID: 979948616-5060-1@BJC.BGI.BCI.BGI
CSeq: 2000 REGISTER
Contact: sip:334101@192.168.1.100:5060;expires=0
Max-Forwards: 70
User-Agent: Grandstream GXV3370 20.18.8.31
Allow: INVITE, ACK, OPTIONS, CANCEL, BYE, SUBSCRIBE, NOTIFY, INFO, REFER, UPDATE, MESSAGE

Content-Length: 0

2.2 若DUT每次都没有收到数据包 即没有④,说明DUT所处的NAT类型不是完全锥型的,则继续step 3;

以下更换一个NAT 为 Port Restricted cone NAT 的路由器测试

抓包见附件

eth0:3478 ——> SOURCE-ADDRESS(192.168.128.252:3478)
eth1:3479 ——> CHANGED-ADDRESS(192.168.128.123:3479)

step3. 检测NAT是否是对称型

DUT ----------------------------------------> eth0:3478 【Binging Request 】

DUT <---------------------------------------- eth0:3478 【Binging Response】

DUT ----------------------------------------> eth0:3478 【Binging Request

DUT ----------------------------------------> eth0:3478 【Binging Request

DUT ----------------------------------------> eth0:3478 【Binging Request

DUT ----------------------------------------> eth0:3478 【Binging Request

DUT ----------------------------------------> eth1:3479 【Binging Request 】

DUT <---------------------------------------- eth1:3479 【Binging Response】

① 判断是否处于NAT之后

② 服务器返回的UDP中的属性值Attributes如下
Attribute: MAPPED-ADDRESS
Attribute Type: MAPPED-ADDRESS (0x0001)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 6014
IP: 192.168.128.173
Attribute: SOURCE-ADDRESS
Attribute Type: SOURCE-ADDRESS (0x0004)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 3478
IP: 192.168.128.252
Attribute: CHANGED-ADDRESS
Attribute Type: CHANGED-ADDRESS (0x0005)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 3479
IP: 192.168.128.123
Attribute: XOR_MAPPED_ADDRESS
Attribute Type: XOR_MAPPED_ADDRESS (0x8020)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port (XOR-d): 38923
[Port: 6014]
IP (XOR-d): 79.221.29.6
[IP: 192.168.128.173]

③ DUT 向 eth0:3478请求 eth0:3479(192.168.128.252:3479)发送请求服务器换另一个 IP:Port(eth1:3479)返回响应,重发3次,均未收到响应,说明NAT不是完全圆锥型

⑤ DUT 直接向 eth1:3479(192.168.128.123:3479)发送UDP数据包

⑥ 服务器返回对应的UDP响应。

结果判断
依据:Symmetric Nat只有来自同一主机,同一端口发送到同一目的主机、端口,映射的公网IP和端口才会一致,否则生成新的映射关系

查看⑥返回的UDP中携带的属性数据中的MAPPED-ADDRESS
Attributes
Attribute: MAPPED-ADDRESS
Attribute Type: MAPPED-ADDRESS (0x0001)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 6014
IP: 192.168.128.173
Attribute: SOURCE-ADDRESS
Attribute Type: SOURCE-ADDRESS (0x0004)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 3479
IP: 192.168.128.123
Attribute: CHANGED-ADDRESS
Attribute Type: CHANGED-ADDRESS (0x0005)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port: 3478
IP: 192.168.128.252
Attribute: XOR_MAPPED_ADDRESS
Attribute Type: XOR_MAPPED_ADDRESS (0x8020)
Attribute Length: 8
Protocol Family: IPv4 (0x0001)
Port (XOR-d): 59266
[Port: 6014]
IP (XOR-d): 48.84.97.56
[IP: 192.168.128.173]

3.1 如果⑥中携带的的映射到公网的IP、Port 和 ②中的映射不一致,依旧对称型的特性,说明NAT是对称型,不需要继续step4。

3.2 如果⑥的映射地址和②中的映射地址一致,则说明不是对称型,继续step4。

step4. 检测NAT是受限圆锥型的还是端口受限圆锥型

DUT ----------------------------------------> eth1:3478 【Binging Request

DUT ----------------------------------------> eth1:3478 【Binging Request

DUT ----------------------------------------> eth1:3478 【Binging Request

DUT ----------------------------------------> eth1:3478 【Binging Request

DUT <---------------------------------------- eth1:3479 【Binging Request

⑦为了检测NAT是受限圆锥型还是端口受限圆锥型,DUT向 eth1(192.168.128.123) 的另一个端口3478发送UDP数据包,请求服务器S 不切换IP,切换端口来响应这个请求,即采用eth1:3479(192.168.128.123:3479)(⑤-⑥已和192.168.128.123:3479建立过通信)
Attribute: CHANGE-REQUEST
Attribute Type: CHANGE-REQUEST (0x0003)
Attribute Length: 4
… … … .0… = Change IP: Not set
… … … …1. = Change Port: Set

⑧ 服务器采用eth1:3479响应

结果判断
4.1 如果 DUT正常接收到⑧ 则说明服务器的端口不受限,NAT类型是 受限型
4.2 如果DUT重发3次 ⑦ 依旧未为收到服务器S的响应,则说明,NAT是 端口受限型

参考文档:NAT类型的检测

总结:

第一步检测是不是有NAT

第二步检测是不是全锥型(Full Cone NAT)

第三步检测是不是完全对称型(Symmetric NAT)

第四步确认是端口受限圆锥型(Port Restricted NAT)还会受限圆锥型(Restricted NAT)

  相关解决方案