P2P网络NAT穿透原理(打洞方案)

news2024/9/22 4:01:49

1.关于NAT

NAT技术(Network Address Translation,网络地址转换)是一种把内部网络(简称为内网)私有IP地址转换为外部网络(简称为外网)公共IP地址的技术,它使得一定范围内的多台主机只利用一个公共IP地址连接到外网,可以在很大程度上缓解了公网IP地址紧缺的问题,同时也能防止外网攻击保障内网安全。如下图:

NAT主要的通过对数据包头的地址替换来完成内网计算机访问外网服务器的。当内部机器要访问外部网络时,NAT设备把内网机器的IP与端口号(网络层地址与传输层地址,如:192.168.1.100:666),转换成 NAT 的外部 IP与端口号(如:100.10.10.10:1666),发送给外网服务器;数据返回时,再把目的IP和端口端口号(100.10.10.10:1666)的数据包替换为内网机器的IP地址和端口号(192.168.1.100:666),发给内网机器。若通讯协议的内容中有IP地址的传递,如FTP协议,NAT在转换时还要把数据包内涉及协议地址交互的地方替换,否则协议就会出现地址混乱。在 NAT设备中维护了这个要替换地址的映射表,并根据内部计算机的通讯需求维护该表。外部网络来数据包能否进入内网,主要是看是否已经有可转换的映射表项,若没有就会丢弃。

下图的例子是内网Client A和Client B访问外网Server,Server回复Client A 和Client B请求,NAT转换IP过程中,通过映射不同端口号区分不用内网主机。

NAT的外网地址可以是一个IP,也可以是一个IP段,形成地址池。NAT 还可以把某个外网地址直接影射给内网的某个服务器,让外网的用户可以直接访问到这台服务器。NAT的工作隐藏了内网的机器,但允许内网主动打开到外网的通讯 “通道”,也就是建立映射表项。

NAT的内外网通讯双方不是平等的,允许内网机器主动发起连接访问外网,当NAT没有对应的地址转换映射表项时,会建立一个映射表项,数据包经过NAT地址转换后发送给外网的服务器,连接建立以后可双向传送数据,但却禁止反方向的主动访问:在没有对应地址映射表项情况下,不允许外网主动访问内网主机,因为没有对应的地址映射表项用于转换地址,外网发送的数据包会被丢弃。而地址映射表项的建立往往是因为内网主动访问外网或NAT静态设置。

2.NAT类型

NAT分为两大类,基本NAT(Basic Network Address Translator)和NAPT(Network Address/Port Translator)。

基本NAT,它仅将内网主机的私有IP地址转换成公网IP地址,但并不将TCP/UDP端口信息进行转换,有动态与静态之区分。静态NAT:私有地址与公有地址进行一对一的映射,这种一对一映射无法缓解可用公有地址短缺的问题。动态NAT:私有地址与公有地址进行一对多的映射,先建立公有地址池,当私有地址向外通信时,会从公有地址池中选择非在用的公有地址进行映射,当通信结束时,释放映射关系,公有地址重新恢复到地址池中待用。

NAPT(Network Address/Port Translator),从名称上我们也可以看得出,NAPT不但会转换经过的数据包的IP地址,还会转换数据包的TCP/UDP端口。由于现在大部分都属于NAPT,故这里不详细讨论基础NAT,下文的NAT指NAPT。

NAT有4种类型:完全锥形NAT(Full Clone NAT)、限制性锥形NAT(Restricted Clone NAT)、端口限制性锥形NAT( Port Restricted Clone NAT)、对称式NAT(Symmetric NAT),前面3种是锥形NAT(Clone NAT)。

2.1.完全锥形NAT(Full Clone NAT)

完全锥形NAT(Full Clone NAT):所有从同一个内网主机的IP和端口发送出来的请求都会被映射到同一个NAT的外网IP和端口,且任何一个外网主机均可通过此映射表项发送数据包到对应的内网主机。外网主机可以主动连接内网主机,有点类似于静态NAT。

2.2.限制性锥形NAT(Restricted Clone NAT)

限制性锥形NAT(Restricted Clone NAT):所有从同一个内网主机的IP(标为Src_IP)和端口(标记Src_IP)发送出来的外网请求都会被映射到同一个NAT的外网IP和端口,但增加了一个限制:只有被内网主机(Src_IP:Src_IP)请求过的外网主机IP才能被使用(此外网主机可使用任意端口),否则外网发送的数据包会被丢弃。限制性锥形NAT也被称为IP限制性锥形NAT或地址限制性锥形NAT。

2.3.端口限制性锥形NAT( Port Restricted Clone NAT)

端口限制性锥形NAT( Port Restricted Clone NAT):所有从同一个内网主机的IP(标为Src_IP)和端口(标记Src_IP)发送出来的外网请求都会被映射到同一个NAT的外网IP和端口,但限制:只有被内网主机(Src_IP:Src_IP)请求过的外网主机IP和端口才能被使用,否则外网发送的数据包会被丢弃。即在IP受限锥形NAT基础上增加了端口的限制。

2.4.对称式NAT(Symmetric NAT)

对称式NAT(Symmetric NAT):所有从同一个内网主机的IP(标为Src_IP)和端口(标记Src_IP)发送到同一个外网主机(IP地址标为目的Des_IP,端口标记为Des_Port)的请求都会被映射到同一个NAT的外网IP和端口。即此映射表项只能被**外网主机(Des_IP:Des_Port)**所用。

看一个例子,假设有如下网络,Client使用666端口访问了Server1的1999端口、1988端口和Server2的1888端口。

根据NAT类型,可能产生如下映射表,↔符号左表示内网主机IP和端口,↔符号右表示NAT的外网IP和端口,@符号右表示限制条件:外网主机地址IP和端口。

实际上大部运营商提供的光猫上网服务都是锥形NAT的,而3G、4G网络、公共WiFi等因为安全因素都是对称式NAT。(我们通常在云上购买的服务器就可以理解为是完全锥型NAT)

3.NAT穿透

NAT技术虽然在一定程度上在解决IPv4地址、构建防火墙、保证网络安全方面都发挥了一定的作用,因不允许外网主机访问内网主机,却破坏了端到端的网络通信。为了让跨越NAT的主机之间有效的P2P通信,需要用到NAT穿透,或者叫做NAT打洞。

STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序,IETF RFC 3489)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。

3.1.检测NAT类型

第一步 对称式NAT、锥形NAT检测:

①Client首先使用相同的端口分别连接Server1和Server2,Server1获取到NAT映射的IP1:Port1,Server2获取到NAT映射的IP2:Port2;

②Server2把IP2:Port2发给Server1,Server1对比IP1:Port1和IP2:Port2,若不相等,NAT是对称式;否则就是锥形NAT。

第二步 限制锥形NAT、完全锥形NAT检测:

①Client首先向Server2发送消息Mesg,Server2获取到NAT映射的IP2:Port2和Mesg;

②Server2把IP2:Port2和Mesg发给Server1;

③Server1向IP2:Port2发送消息Mesg,Client如果收到Mesg,NAT完全锥形,否则就是限制性锥形。

第三步 IP限制锥形NAT、端口限制锥形NAT检测:

①Client首先向Server1发送消息Mesg,Server1使用端口Port_S1接收Mesg,并获取到NAT映射的IP1:Port1;

②Server1另取一闲置端口Port_Sx(Port_Sx≠Port_S1),Server1使用Port_Sx发送Mesg到IP1:Port1,若Client收到Mesg,NAT是IP限制锥形,否则是端口限制锥形。

3.2.NAT穿透原理与能力

NAT穿透原理如下图可以简要分为6步:

①Client1和Client2分别与Server连接,Server由此获取两者在NAT1和NAT2上的外网映射IP1:Port1和IP2:Port2;

②Server把IP1:Port1发给Client2并告之连接Client1;

③Client2发送请求IP1:Port1,NAT1接收到数据包由于没有对应的映射表项,NAT1把数据包丢弃,但在NAT2上留下IP1:Port1映射表项;

④Client2向Server发送消息:请求Server转告Client1连接Client2,Server发送IP2:Port2给Client1并告知连接IP2:Port2;

⑤Client1连接IP2:Port2;

⑥Client2接收到Client1连接,穿透成功;接收不到则穿透失败。

检测到需要穿越NAT的类型后,根据NAT类型特性,实施穿透策略。我们可以得出以下结论:

序号NAT类型穿越
1完全锥形NAT完全锥形NAT
2完全锥形NATIP限制性锥形NAT
3完全锥形NAT端口限制性锥形NAT
4完全锥形NAT对称式NAT
5IP限制性锥形NATIP限制性锥形NAT
6IP限制性锥形NAT端口限制性锥形NAT
7IP限制性锥形NAT对称式NAT
8端口限制性锥形NAT端口限制性锥形NAT
9端口限制性锥形NAT对称式NAT
10对称式NAT对称式NAT

3.3.两种特殊的P2P场景

3.3.1.TCP通信双方只有一方在NAT内网

这是所有P2P场景中最简单的,它使用一种被称为“反向链接技术”。

由于Client2拥有外网IP地址,所以Client1可以直接发起TCP连接到Client2,但如果Client2尝试发起TCP连接到Client1进行P2P通信则会失败。这时Client2不是直接向Client1发起TCP连接,而是通过Server给Client1发送一个请求:反过来请求Client1连接到Client2(即进行反向链接),Client1在收到从Server转发过来的请求后,会主动向Client2发起一个TCP的连接请求,这样在NAT设备上就会建立起映射表项,Client1和Client2之间能够正常TCP连接。

3.3.2.UDP通信双方在同一个NAT内网

假设有内网主机Client1和Client2,他们对应的NAT为NAT1和NAT2,有一个外网服务器Server,我们可以把Client1和Client2之间的UDP通信NAT穿透方案优化为:

①Client1和Client2向Server发送自己内网IP和端口,Server分别记为IP_C1:Port_C1和IP_C2:Port_C2;同时Server记下Client1、Client2实际与自己通信所使用的外网IP地址和端口号(即对应NAT映射表项外网IP地址和端口),分别记为IP1:Port1和IP2:Port2;

②Client1请求Server帮助建立与Client2的UDP连接;

③Server将Client1的{IP_C1:Port_C1, IP1:Port1}发给Client2,同时,Server将Client2的{IP_C2:Port_C2, IP2:Port2}也发给Client1;

④当Client2收到{IP_C1:Port_C1, IP1:Port1}后,开始向IP_C1:Port_C1和IP1:Port1分别发送UDP数据包,并且Client2会自动锁定第一个给出响应的IP地址和端口号。同理,当Client1收到{IP_C2:Port_C2, IP2:Port2}后,也会开始向IP_C2:Port_C2和IP2:Port2分别发送UDP数据包,并且自动锁定第一个得到Client2回应的IP地址和端口号。由于Client1与Client2互相向对方发送UDP数据包的操作是异步的,所以Client1和Client2发送数据包的时间先后并没有时序要求。

当Client1、Client2在同一个NAT内网时,NAT1=NAT2,如上图,正常情况下,Client1、Client2分别向对方内网IP端口发送的数据包因为不需要路由先到达,因而一般采用内网直联P2P通信。而Client1、Client2分别向对方外网IP端口发送的数据包能否收到取决于NAT是否支持不同端口之间的UDP数据包传输(即Hairpin转换特性)。

:Hairpin又被称为Hairpin NAT、Loopback NAT或Hairpin Translation,翻译“端口回流”,“回环NAT”。它能够让两台位于同一台NAT网关后面的主机,通过对方的外网地址和端口相互访问,NAT网关会根据一系列规则,将对内网主机发向其NAT外网IP地址的报文进行转换,并从内网接口发送给目标主机。

如上图, Client1和Client2进行P2P连接,最好的方式NAT1外网地址端口直联NAT2外网地址端口,但是实际上,Client1、Client2和Server都无法获取到NAT1、NAT2的外网地址和端口。Client1、Client2只能向对方在NAT3上映射的外网端口发送数据包,如果NAT3不支持Hairpin,那么Client1、Client2就不能进行P2P通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/811826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

某拍房数据采集

某拍房数据采集 某拍房数据采集声明1.逆向目标2.寻找加密位置3.分析加密参数4.python代码书写 某拍房数据采集 声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的…

yo!这里是Linux常见命令总结

目录 前言 常见命令 ls指令 pwd指令 cd指令 touch指令 tree指令 mkdir指令&&rmdir指令 rm指令 man指令 cp指令 mv指令 echo指令 cat指令&&tac指令 more指令 less指令 head指令&&tail指令 find指令 grep指令 alias指令&&u…

NAT原理(网络地址转换)

NAT原理 网络地址转换(Network Address Translation,简称NAT) 是一种网络通信协议,它是在网络层上对IP地址进行转换的技术。 NAT技术可以将内部网络中的私有IP地址转换为公共IP地址,以便内部网络中的设备能够访问互…

2023-07-30力扣每日一题

链接: 142. 环形链表 II 题意: 求链表是否有环,并给出入环的点 解: 哈希关联标记或者快慢指针 快慢指针逻辑:设入环前长度a,快慢相遇时指针在b,环长度为c,fast2*slow&#xff…

前端学习--vue2--1-基础配置

写在前面: 好久没写了,做实习每天上班都没啥时间写,1个半月前开始系统学习前端,然后做了半个月主要的前端实习了wk。也行,当复习了,后端也还是搞了点。 本文介绍vue2的一些基础和配置,配置只写…

【C++】——类和对象

目录 面向过程和面向对象的初步认识类的引入类的定义类的访问限定符及封装类的作用域类的实例化this指针类的6个默认成员函数构造函数析构函数 面向过程和面向对象的初步认识 C语言是面向过程的,关注的是过程,分析求解问题的步骤,通过函数调用…

你还不会反射吧,快来吧!!!

首先&#xff1a; 1.加载类&#xff1a; //练习获取字节码对象的3种方式 //Class<Student> studentClass Student.class; //Class<? extends Student> aClass new Student().getClass(); Class<?> clazz Class.forName("TestT.Student"); 2.获…

[C++] 类与对象(上)

目录 1、前言 2、类的引入 3、类的定义 3.1 类的两种定义方式 4、类的访问限定符 5、类的作用域 6、类的实例化 7、类对象模型 7.1 内存对齐规则 7.1 类对象的存储方式 8、this指针 8.1 this指针的特性 8.2 this指针是否可以为空 1、前言 C语言是面向过程的&#…

网络运维基础问题及解答

前言 本篇文章是对于网络运维基础技能的一些常见问题的解答&#xff0c;希望能够为进行期末复习或者对网络运维感兴趣的同学或专业人员提供一定的帮助。 问题及解答 1. 列举 3 种常用字符编码&#xff0c;简述怎样在 str 和 bytes 之间进行编码和解码。 答&#xff1a;常用的…

Python读取多个栅格文件并提取像元的各波段时间序列数据与变化值

本文介绍基于Python语言&#xff0c;读取文件夹下大量栅格遥感影像文件&#xff0c;并基于给定的一个像元&#xff0c;提取该像元对应的全部遥感影像文件中&#xff0c;指定多个波段的数值&#xff1b;修改其中不在给定范围内的异常值&#xff0c;并计算像元数值在每一景遥感影…

【C++】-动态内存管理

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言一、C内存管理方式1.1 new/delete操作内置类型 总结 前言 今天再讲一个…

【禁用外键】为什么互联网大厂禁用外键约束?详谈外键的优缺点和使用场景

导航&#xff1a; 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式常见面试题源码 目录 一、外键介绍 1.1 概述 1.2 练习 1.2.1 数据准备 1.2.2 验证有外键时&#xff0c;删除记录要维护外键 1.2…

Python批量下载主播照片,实现人脸识别, 进行颜值评分,制作颜值排行榜

昨晚一回家&#xff0c;表弟就神神秘秘的跟我说&#xff0c;发现一个高颜值网站&#xff0c;非要拉着我研究一下她们的颜值高低。 我心想&#xff0c;这还得要我一个个慢慢看&#xff0c;太麻烦了~ 于是反手用Python给他写了一个人脸识别代码&#xff0c;把她们的照片全部爬下…

06-行向量列向量_向量的运算 加法,数乘,减法,转置

行向量和列向量 行向量是按行把向量排开&#xff08;横着来写&#xff09;&#xff0c; 列向量是按列把向量排开&#xff08;竖着来写&#xff09; 在数学中我们更多的把数据写成列向量&#xff0c;在编程语言中更多的把数据存成行向量! 如果想在编程语言中把行向量转化成列…

人力资源管理系统servlet jsp人资企业办公java源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 人力资源管理系统ervlet jsp 系统有1权限&#xff1a…

【计算机网络】408统考2014年题36

题目描述 【2014年题36】主机甲与主机乙之间使用后退N帧(GBN)协议传输数据&#xff0c;甲的发送窗口尺寸为1000&#xff0c;数据帧长为1000字节&#xff0c;信道带宽为100Mbps&#xff0c;乙每收到一个数据帧就立即利用一个短帧&#xff08;忽略其传输延迟&#xff09;进行确认…

动态sql以及常用的标签

什么是动态sql&#xff1a; 指根据不同的条件生成不同的sql 搭建环境&#xff1a; 建表&#xff1a; create table blog( id varchar(50) not null comment 博客id, title varchar(100) not null comment 博客标题, author varchar(30) not null comment 博客作者, create_ti…

基于springboot+mybatis+mysql+vue+html民宿管理平台

基于springbootmybatismysqlvuehtml民宿管理平台 一、系统介绍二、功能展示1.首页2.个人中心3.民宿信息浏览(用户)4房间信息浏览&#xff08;用户&#xff09;5.房间预订&#xff08;用户&#xff09;6.房间退订&#xff08;用户&#xff09;7.投诉反馈&#xff08;用户&#x…

如何配置保存cpolar所建立的隧道参数?

文章目录 可以利用cpolar建立一个能发布到公共互联网的网页&#xff0c;这是基于我们直接对cpolar进行即时设置&#xff0c;获得了能在公共互联网上访问本地数据的二级子域名。但如果电脑关闭重启后&#xff0c;如何让电脑自动启动cpolar&#xff0c;并记住设置好的域名参数文件…

一文搞懂自动驾驶芯片TDA4 启动流程

文章目录 TDA4架构简介TDA4启动流程DMSC ROM阶段MCU域R5 ROM阶段SBL阶段 TDA4架构简介 TDA4是德州仪器推出的一款高性能、超异构的多核SoC&#xff0c;拥有ARM Cortex-R5F、ARM Cortex-A72、C66以及C71内核&#xff0c;可以部署AUTOSAR CP系统、HLOS(Linux或QNX)、图像处理以及…