pwnat——一种无需第三方服务器就能完成NAT点对点P2P穿透的基于UDP打洞技术的新方法

  • 简介
    • 传统的udp打洞
    • UDP 打洞原理及过程
    • pwnat技术,无需第三方服务器!
    • pwnat用法
    • pwnat工作原理

前段原文:https://zhuanlan.zhihu.com/p/40816201
后端pwnat原文:https://github.com/samyk/pwnat
Photo 1,2 by Thomas Kvistholt on Unsplash
Photo 3 from *Autonomous NAT Traversal * http://samy.pl/pwnat/pwnat.pdf

本人只是组合和翻译一下大佬们的话而已。。。
注:ICMP包就是平常经常使用的命令ping所发出的数据包,常用来检测网络是否连通。

简介

P2P 通信最大的障碍就是 NAT(网络地址转换),NAT 使得局域网内的设备也可以与公网进行通讯,但是不同 NAT 下的设备之间通讯将会变得很困难。UDP 打洞就是用来使得设备间绕过 NAT 进行通讯的一种技术。传统的udp打洞需要第三方服务器介入,而如今github上的开源项目 pwnat使得无需借助第三方完成p2p穿透技术。

传统的udp打洞

先从介绍NAT开始,(英语:Network Address Translation,缩写:NAT),网络地址转换又称网络掩蔽、IP掩蔽,在计算机网络中是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问因特网的私有网络中。它是一个方便且得到了广泛应用的技术。当然,NAT也让主机之间的通信变得复杂,导致了通信效率的降低。
NAT 的工作原理如下:

首先,NAT A 网下的设备 1(192.168.1.101)想与某公网 IP 通讯,设备 1 将包发给 NAT A,然后 NAT A 对源 IP 进行转换发给 NAT B(中间可能还会经过多重 NAT)。

这样做的目的是,NAT B 并不知晓 NAT A 下的各个设备,他只能与 NAT A 本身通讯,因此发送给 NAT B 的包源 IP 必须是 NAT A 的公网 IP,不然 NAT B 没有办法进行回复。

接下来 NAT B 将回复包再发回 NAT A,此时就是 NAT 发挥作用的时候了,NAT A 现在要做的就是将包再分发回之前的设备,如何确定要发给谁呢?NAT 中记录了一张表,之前 192.168.1.101 通过 2333 端口与 42.120.241.46 端口 443 通讯了,并且 NAT A 是用 60001 的端口转发出去的,那么这次接受到发往该 NAT 60001 端口的包时就应该再通过 2333 端口转发给 192.168.1.101。经过这样的过程,NAT A 下的设备都可以连接到互联网了!

UDP 打洞原理及过程

如上图所示,由于 NAT 的存在,当 NAT A 的设备 1 想与 NAT B 下的设备通讯时,必然要将目标 IP 设置为 NAT B 的公网地址,而 NAT B 转发表中并没有记录过 NAT A 与自身网络下设备的通讯记录,因此 NAT B 会将包丢掉。

下面我们来看看 UDP 打洞是怎么解决这个问题的。


为了能够进行 UDP 打洞,我们需要一台公网的服务器作为中转站,它是 NAT A 与 NAT B 之间的信使。

(为了方便起见,我们把地址为 192.168.1.101 的设备称为设备 1,把地址为 192.168.1.2 的设备称为设备 2,信使服务器称为 S)

首先,设备 1 和设备 2 都向 S 注册自己,S 中能记录各个设备此时使用的公网 IP 地址和端口号,例如设备 1 是 123.122.53.20:31000,设备 2 是 42.120.241.46:41000。

然后设备 1 与设备 2 都向 S 获取对方的公网 IP 与之前预留的端口号,就像这样:

然后就是最关键的一步,打洞。

设备 1 向 42.120.241.46:41000 发一个包,NAT B 自然能接收到这个包,然而它不知道来自 NAT A 的包应该发给谁,因此 NAT B 将这个包舍弃。但是由于设备 1 向 42.120.241.46:41000 发过包,NAT A 会记录:以后来自 42.120.241.46:41000 的包都发给设备1

设备 2 也做相同的操作,让 NAT B 也知道:以后来自 123.122.53.20:31000 的包都发给设备 2

至此,NAT A 与 NAT B 都互相为对方保留了端口,就可以愉快地通讯了。

当然了,大致原理是很简单的,实际操作起来情况可能会更复杂,会涉及到丢包、多重 NAT 等问题的处理,本文仅起到一个科普解释的作用。

pwnat技术,无需第三方服务器!

pwnat是目前唯一可以在防火墙/ NAT上打孔的工具,使用新开发的技术,利用NAT转换表的属性,能够在不需要proxy代理、第三方服务器、upnp、DMZ、sproofing、dns转换的情况下实现NAT中的P2P通信。

相关技术可以查看EEE P2P’10会议报告:http://samy.pl/pwnat/pwnat.pdf

pwnat用法

usage: ./pwnat <-s | -c> <args>-c    client mode<args>: [local ip] <local port> <proxy host> [proxy port (def:2222)] <remote host> <remote port>-s    server mode<args>: [local ip] [proxy port (def:2222)] [[allowed host]:[allowed port] ...]-6    use IPv6-v    show debug output (up to 2)-h    show this help and exit

例子:

其中一台NAT后的主机输入指令作为服务端:

  ./pwnat -s

例如其中一台NAT后的主机作为客户端想访问google

  ./pwnat -c 8000 <pwnat.server.com> google.com 80

之后打开http://localhost:8000 就可以访问google了!

pwnat工作原理

我穿透NAT的方法是双重的,我将在下面描述。

(注:作者这里把两台NAT之后的主机其中一台作为服务端。其中一台作为客户端)
为了建立完整的隧道,客户端需要知道服务器的公共IP地址,服务器需要知道客户端的公共IP地址。 但是,在真正的客户端 - 服务器模型中,服务器直到客户端连接才会知道客户端的IP,而NAT主机则通常会丢弃未知的传入数据包。 在pwnat中,服务器不需要知道客户端IP地址也能完成点对点通信。

以下是pwnat服务器如何获知客户端的IP地址:

通过让客户端“假装”成为一个互联网上任意的iCMP跳跃点( a random hop on the Internet)来解决这个问题。traceroute命令使用相同的技术用于检测Internet上的跳跃点,但我现在正在反过来使用这个技术以便穿透NAT。

具体来说,当服务器启动时,它开始向固定地址3.3.3.3发送固定的 ICMP回应请求包(ICMP echo request packets)。显然,我们无法从3.3.3.3收到返回的ICMP回应数据包(ICMP echo packets)。然而,3.3.3.3 并不是我们可以访问的主机,我们也不是想伪装成它来发“ICMP回应”数据包。相反,pwnat技术的实现原理在于,当我们的客户端想要连接服务端时,客户端(知道服务器IP地址)会向服务器发送”ICMP超时数据包“(ICMP Time Exceeded packet)。 这个ICMP数据包里面包含了服务器发送到3.3.3.3的“原始”固定ICMP回应请求数据包。

为什么要这样做呢?好吧,我们假装是互联网上的一个ICMP跳越点,礼貌地告诉服务器它原来的“ICMP回应请求”数据包无法传递到3.3.3.3。而你的NAT是一个聪明的设备,它会注意到”ICMP超时数据包“内的数据包与服务器主权发出“ICMP回应请求”数据包相匹配。然后它将”ICMP超时数据包“转发回NAT后面的服务器,包括来自客户端的完整IP数据包头,从而让服务器知道客户端IP地址是什么!(如下图所示)

服务器(1.2.3.4):ICMP回应请求数据包- > 3.3.3.3

服务器(1.2.3.4):ICMP回应请求数据包 - > 3.3.3.3

服务器(1.2.3.4):ICMP回应请求数据包 - > 3.3.3.3

客户端(6.7.8.9):ICMP回应请求超时数据包(包括服务器发送到到3.3.3.3的ICMP回应请求数据包) - > 1.2.3.4
服务器的NAT:检查来自客户端的ICMP回应请求超时数据包中是否含有服务器的ICMP回应请求数据包,如果包含,则将整个数据包发送到服务器。

不相信我?只需使用traceroute命令跟踪NAT后面的任何主机。您会注意到路由器预先完全不知道会从哪个IP地址返回ICMP回应请求超时数据包。您的路由器只知道根据ICMP超时数据包中的数据将这些数据发送给您。现在,服务器仅仅只知道了客户端IP地址,我们还没有发送任何其他数据的方法。对于完整的通信,我们使用我以前的软件chownat中使用的相同方法(注:就是上文提到的UDP打洞)来穿透两个NAT。

NAT后面的客户端与不在NAT后面的机器通信的示例(注:传统CS架构):
机器A - > NAT A - > net - > quake服务器
机器A将UDP数据包发送到服务器,打开“会话”(session)。
NAT A看到了这一点并说:
”如果任何UDP数据包从相同的主机和端口返回,我将其路由到机器A.”
服务器发回UDP数据包,到达NAT A,NAT A看到正确的主机和端口,将其发送到机器A.机器A和服务器现在能够毫无问题地进行通信。

而现在则是是pwnat如何在客户端和服务器知道彼此IP的情况下完成通信。
目标是实现这一个通信:机器A(ssh客户端) - > NAT A - > net - > NAT B - >机器B(ssh服务器)
当你在机器B上启动pwnat服务器时,它会不断发送 UDP数据包到机器A.当然,NAT A不会接收这些数据包,所以它会丢弃它们中的每一个。而机器B不会停止发送数据包。 一旦你启动计算机A上的pwnat客户端,它开始发送UDP数据包到机器B.注意:pwnat默认源端口和目的端口都是2222。而任何未经授权的用户都可以设置UDP源端口和目标端口。通常,机器A发送到NAT B的UDP数据包将被丢弃。 但是,由于机器B曾经发送类似的数据包从相同的端口出去,NAT B假设这些是先前发出去的数据包的响应并让它们重新进入。一旦机器B看到这些数据包,它就会将握手数据包发送回机器A.这些数据包不会被NAT A丢弃,因为同样的原因:NAT A曾经看到相同的数据包从相同的端口出去,因此返回NAT的数据包看起来就像对出去的数据包的响应。

最后,双方都通过UDP进行完全通信,从而允许基于TCP的一些协议进行隧道传输。

注意:pwnat服务器和客户端上有一个保持活动(keepalive)的过程,它始终保持UDP“会话”处于活动状态。 它发送的数据包具有0字节的有效负载,仅在客户端不发送数据时发送。 否则,它可能发送保持活跃数据包的最快速度是每5秒一个数据包。 如果任何其他类型的数据通过隧道传输,则不会传输保持活动的数据包。

原作者: Samy Kamkar

pwnat 基于Daniel Meekins的udptunnel 制作
http://code.google.com/p/udptunnel/

pwnat——一种无需第三方服务器就能完成NAT点对点P2P穿透的基于UDP打洞技术的新方法相关推荐

  1. AdvFlow:一种基于标准化流的黑盒攻击新方法,产生更难被发觉的对抗样本 | NeurIPS‘20

    本文提出一种新的黑盒对抗攻击方法AdvFlow,通过利用标准化流来建模对抗样本的数据分布,使得生成的对抗样本的分布和正常样本接近,从而让对抗样本更难被检测出来,打破了对抗样本和正常样本的分布大不相同的 ...

  2. 用udp实现可靠传输python_一种基于UDP协议实时可靠图像传输方案的制作方法

    本发明设计属于数据传输与通信技术领域,具体涉及一种基于UDP协议(User Datagram Protocol)实时可靠图像传输方案. 背景技术: 随着网络技术的高速发展,无线数据传输在通信.控制等领 ...

  3. 电化学沉积增材制造——金属3D打印的一种新方法,可打印微尺度纯铜

    近日,3D打印技术参考注意到,一家名为Fabric8 Labs的公司宣布完成5000万美元B轮融资,它开发了一种基于电化学增材制造的新方法用来3D打印金属零件. 笔者查询相关文献,发现国内吉林大学.长 ...

  4. 计算机提取干涉条纹原理,两种提取Fabry-Perot干涉条纹圆心的新方法

    摘要本文介绍两种提取Fabry-Perot干涉条纹圆心点坐标的新方法.首先对干涉图像依次进行二值化处理,对所得到的条纹强度曲线进行均平滤波和自适应滤波,根据条纹灰度值强度余弦函数分布的特点,对条纹灰度 ...

  5. oracle自动售票服务器,一种基于Oracle数据库客户端的业务自动处理方法与流程

    技术领域 本发明涉及计算机技术领域,具体地说是一种实用性强.基于Oracle数据库客户端的业务自动处理方法. 背景技术: 在实现预约挂号的移动应用中,由于医院业务系统处理缺失自动取消预约功能,经常需要 ...

  6. 塔式、刀片和机架:三种类型的服务器介绍

    服务器是一种为客户机提供服务的高性能计算机.旨在处理请求并为其他程序,设备或客户端提供服务和功能.通常,服务器具有比传统计算机更大的处理能力,更高的内存和更多的存储空间.使用服务器,客户端可以在整个生 ...

  7. 建站就用这个方法,无需购买服务器10分钟快速部署你的静态网页

    阿里云云开发平台重磅推出开源应用中心,聚合最热门的开源应用,让你像安装app一样快速上线一个网站.面向新人和持续活跃的开发者用户推出上线激励加油包,最高100元无门槛代金券免费送,现在体验还能够领取年 ...

  8. UE5.1 像素流送公网部署无需GPU服务器

    因为工作需要最近在做虚幻引擎5.1这方面的部署,简单记录一下最近学习的一点知识. 本文参考:虚幻引擎官网文档 UE5像素流送原理及多用户公网部署小白教程202211022220 一.像素流送介绍 像素 ...

  9. 一种高性能网络游戏服务器架构设计

    网络游戏的结构分为客户端与服务器端,客户端采用2D绘制引擎或者3D绘制引擎绘制游戏世界的实时画面,服务器端则负责响应所有客户端的连接请求和游戏逻辑处理,并控制所有客户端的游戏画面绘制.客户端与服务器通 ...

最新文章

  1. java命令行读入密码_java-在命令行上隐藏输入
  2. “轻雀会议”跨越社交的“云沟通”
  3. Jmeter JDBC执行多条SQL
  4. MATLAB新手教程
  5. linux-shell命令之chgrp(change group)【更改群组】
  6. 重载与重写(overload and override)
  7. 语音识别端点检测matlab,关于语音识别的端点检测问题
  8. Spring Tool Suite 错误: Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds.
  9. dedecms网站轮播本地显示为什么上传到服务器就不显示了,dedecms后台上传图片实现图片轮播的方法...
  10. python的软件环境是什么意思_python的虚拟环境详解
  11. Verilog中parameter(参数)与define(宏定义)的区别
  12. 常用算法之----快速排序
  13. 找到数组中两个最小的元素
  14. 错觉图片生成实验 - 闪现的绿点
  15. Win10 快速检查修复系统方法
  16. 导致 Scan VIP 和 Scan Listener(监听程序)出现故障的最常见的 5 个问题 (文档 ID 1602038.1)
  17. mysql 性能优化方向
  18. web 前端判断身份证号码是否有效
  19. 解密韦德之膝:康复因再世华佗
  20. 老油条表示真干不过,部门新来的00后测试员已把我卷崩溃,想离职了...

热门文章

  1. spark-2.2.0发行说明
  2. 光驱读盘能力差的解决方法
  3. 沭阳学爬虫10高效存储MongoDB
  4. sql 查询及格率优秀率
  5. 部署到gcp_肿瘤内科成功举办基础研究及GCP云端学术论坛
  6. c语言编程电话簿,C语言实现电话簿项目.pdf
  7. 大龄Android 开发们最担忧的事儿,太难了~
  8. python猜数游戏续_python猜数游戏续改编
  9. 记一次批量定时抓取微信公众号文章的实现
  10. rtsp 报文转发_stp技术回顾和rstp经典笔记