对称型NAT穿透 基于端口猜测且双方都位于Symmetric NAT后的打洞尝试

您所在的位置:网站首页 打孔类型 对称型NAT穿透 基于端口猜测且双方都位于Symmetric NAT后的打洞尝试

对称型NAT穿透 基于端口猜测且双方都位于Symmetric NAT后的打洞尝试

2024-07-17 21:59| 来源: 网络整理| 查看: 265

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])

客户端:

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) 举例

若尝试结果为 返回端口连续 说明是连续型 而结果为 在这里插入图片描述 是公网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连接,导致只预测单一端口成功几率不算大,因此最好向一个范围发包打洞。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3