(42条消息) 对称型NAT穿透 基于端口猜测且双方都位于Symmetric NAT后的打洞尝试_l807575的博客-CSDN博客_nat symmetric 打洞

NAT穿透相关介绍
NAT(Network Address Translation,网络地址转换)技术在Ipv4地址枯竭的今天大规模应用,导致大量用户使用同一个公网IP地址,由此造成计算机无法对等访问,BT等P2P下载工具失效等。
而NAT具体又分为4种类型,两类(对称型,锥型),其中锥形NAT容易穿透,讲解打洞方法的文章也多,这里不作分析。
NAT穿透可行的几种类型 里面提到了若双方都处于对称型NAT后,无法穿透,现在有一种新思路。

对称型NAT端口映射类型
经过大量观察,常见的映射方式有

出口公网IP相同,而规律递增(递减)
出口公网IP相同,而端口随机
出口公网IP可能不同,端口随机
其中1 2在三大运营商(尤其 1 在移动家用宽带常见),3 在手机数据上网以及小宽带运营商(次级运营商,如广电网,长城宽带等)常见
对于1可用端口猜测的方法穿透,2虽然也能猜测但是无规律需要猜测的次数多,成功几率低,且发送大量UDP包时可能会被误认为DoS攻击导致用于猜测的数据包被运营商丢弃,3无法穿透因为出口的公网IP未知

映射方法检测
需要多台服务器
客户端绑定一个端口,分别向多台服务器发送UDP包,服务器返回用户的公网IP地址以及公网端口,基于规律进行判断。
服务器:

import socket as so
s=so.socket(so.AF_INET,so.SOCK_DGRAM)
s.bind(('0.0.0.0',2345))
while 1:
data=s.recvfrom(1024)
s.sendto(str(data[1]).encode(),data[1])

1
2
3
4
5
6
7
客户端:

import socket as so
import threading as th
import time
import random
p=random.randint(1025,65500)
s=so.socket(so.AF_INET,so.SOCK_DGRAM)
s.bind(("",p))
def rec():
while 1:
print("接收启动")
data=s.recvfrom(1024)
print("接收成功",data)
recv=th.Thread(target=rec)
recv.start()
#分别发给3个(或更多)不同的服务器
s.sendto("NAT穿透测试 发给服务器1".encode(),("xxx.xxx.xxx.xxx",2345))
time.sleep(1)
s.sendto("NAT穿透测试 发给服务器2".encode(),("xxx.xxx.xxx.xxx",2345))
time.sleep(1)
s.sendto("NAT穿透测试 发给服务器3".encode(),("xxx.xxx.xxx.xxx",2345))
time.sleep(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
举例
若尝试结果为

说明是连续型
而结果为

是公网IP可能不同,端口随机的类型3,不可打洞

连续型NAT尝试打洞
需要一台有公网IP的服务器
可以在打洞前加入检测模块,这里假设已检测到双方都是对称NAT的递增型,其它类型类似
打洞具体方法(以递增型NAT举例)
1.客户端A B 均绑定好本地端口,并且设置多线程,一个用于发送,一个接收
2.客户端A发一个包给服务器C,C获取当前A的公网IP以及端口
3.客户端B向服务器C发包询问A的地址和端口,同时B也从C返回的包得知自己的公网信息
4. 客户端B向A的端口(从C获知)递增发送多个UDP包,且记录发包数量
(例如:B知道了客户端A对于服务器C的端口是5000,则B向A的5000~5100端口发送多个UDP包,可循环发送)
注意控制发包范围和速度,否则运营商可能会认为是攻击产生丢包

5.B把步骤3得到的B公网端口以及步骤4需要的端口数量整合,得到打洞的范围,把范围以及B的公网IP通过C传给A
6.A根据打洞范围,大量发包给B,若B收到了A,A也收到B的包则打洞成功

效果
为方便截图,在一台设备上操作,远程主机A用IPv6连接,两台主机在IPv4上都是递增型对称NAT
本机(Windows)为B,远程为A(Linux),相互打洞:

可见打洞成功,由于发送的端口是有范围限制的,大大提升了成功几率。

不成功的情况
发包过多/过快,导致被运营商UDP ban,过一会再试试。
端口预测策略有问题。
最后
NAT打洞只是对IPv4的缝缝补补,且不一定能成功,要从根本上改变,还是得靠IPv6的普及。
另外,对称NAT穿透的一种新方法 讲述的方法也可作参考,由于同一个公网IP有很多人在用,其他人可能也建立了UDP连接,导致只预测单一端口成功几率不算大,因此最好向一个范围发包打洞。
————————————————
版权声明:本文为CSDN博主「l807575」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/l807575/article/details/104382094

发表评论

邮箱地址不会被公开。 必填项已用*标注