NAT与NAPT

article/2025/10/4 0:41:30

一、NAT和NAPT的概念

  1. NAT(Network Address Translation,网络地址转换):NAT是将IP数据报头中的IP地址转换为另一个IP地址的过程。使用少量的公网IP地址代表较多的私网IP地址的方式,仅支持地址转换,不支持端口映射
  2. NAPT(网络地址端口转换):支持端口的映射并允许多台主机共享一个公用IP地址,这样就可以支持同时多个位于NAT后面的机器和外部进行交互了。支持端口转换的NAT又可以分为两类:源地址转换(SNAT)和目的地址转换NAT(DNAT),下面说的NAT都是指NAPT。

二、NAT转换IP过程

  1. 发报文过程:NAT设备查看报头内容,发现该报文是发往外网的,将其源IP地址字段的私网地址192.168.1.3转换成一个可在Internet上选路的公网地址20.1.1.1,并将该报文发送给外网服务器,同时在NAT设备的网络地址转换表中记录这一映射。
  2. 收报文过程:外网服务器给内网用户发送的应答报文(其初始目的IP地址为20.1.1.1)到达NAT设备后,NAT设备再次查看报头内容,然后查找当前网络地址转换表的记录,用内网私有地址192.168.1.3替换初始的目的IP地址。

三、NAPT带来的问题

NAT在缓解IPv4地址资源的紧张的同时,也带来了不少问题:

  1. NAT使IP会话的保持时效变短。
  2. NAT在实现上将多个内部主机发出的连接复用到一个IP上,这就使依赖IP进行主机跟踪的机制都失效了
  3. NAT工作机制依赖于修改IP包头的信息,这会妨碍一些安全协议的工作
  4. NAT限制了使用一些高层协议(FTP、Quake、SIP)的Peer两端的P2P通信
对于问题1,其主要原因是,NAT设备建立的内网IP、端口到外网IP、端口的映射的表项是有一个保活期的。如果在一个超时时间内,该映射上没有实际数据的传输,那么NAT会过期并回收这个映射表项给其他通信链路用(IP和端口资源有限,通信的链路是无限)。为了避免这种通信链路提前被NAT中断的情况,很多应用层协议在设计的时候就考虑了一个连接保活的机制,即在一段时间没有数据需要发送时,主动发送一个NAT能感知到而又没有实际数据的保活消息,这么做的主要目的就是重置NAT的会话定时器。
对于问题2,其主要原因是,对于NAT后面的N多主机,在外部看来都是同一个主机(NAT设备),于是来之同一个IP的数据包一定是来之同一个主机的前提判断就会不准确了,这样一下基于这个前提的机制(例如:TCP的TIME_WAIT的回收和重用)都会有问题。
对于问题3,其主要原因是,NAT篡改了IP地址、传输层端口号和校验和。
对于问题4,其主要原因是,一般情况下,NAT是不允许外部的Peer节点主动连接或发送数据包给NAT后面的主机的(这里的主动指的是,在一段时间内,首先发送数据包的一方为主动方)。NAT表现出这样的行为,主要基于下面的几点考虑:
[1] 出于安全考虑,避免来自网络外部的攻击,隐藏并保护网络内部的计算机
[2] 位于NAT后面的很多主机,对于主动进来的数据包,NAT一般不知道该路由给内部的哪个主机(NAT设备上没有相关转发表项)。

完整的P2P通信解决方案包括下面两个步骤:

[1] 首先在Server的协助下,通信两端Peer尝试相互连接,如果两端Peer在尝试互联不成功后,那么就将失败结果反馈给Server转入步骤[2]
[2] 这个步骤比较简单粗暴了,就是relay(服务器中转),简单的来讲就是Peer1将要发给Peer2的数据发给Server,然后由Server帮忙转发给Peer2,同样对于Peer2来说也一样。

四、P2P通信穿越NAT的技术、方法

目前常见的P2P通信穿越NAT的技术、方法主要有:

 a. 应用层网关b. 中间件技术c. 打洞技术(Hole Punching)d. Relay(服务器中转)技术

1. 应用层网关(ALG)

原理:利用带有ALG功能的NAT对特定应用层协议的支持和理解,在一个NAT网关检测到新的连接请求时,需要判断是否为已知的应用类型,这通常是基于连接的传输层端口信息来识别的。在识别为已知应用时,再调用相应功能对报文的深层内容进行检查,当发现任何形式表达的IP地址和端口时,将会把这些信息同步转换,并且为这个新连接创建一个附加的转换表项。这样,当报文到达公网侧的目的主机时,应用层协议中携带的信息就是NAT网关提供的地址和端口。例如:下图,对于使用主动模式的FTP协议(PORT方式),就需要AGL的支持了。

在这里插入图片描述
由于FTP协议通信需要两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。如上图,位于NAT后面的FTP client(192.168.1.2)首先发起一个TCP连接(命令链路)连上外网FTP Server(8.8.8.1),然后发送PORT报文(192.168.1.2,1084)说自己在1084端口接收数据,然后进过ALG处理PORT报文变成(8.8.8.1,12487),同NAT建立其一条(192.168.1.2,1084 <—>8.8.8.1,12487)映射。这样FTP Server发往(8.8.8.1,12487)的数据就会被转到(192.168.1.2,1084),从而实现数据传输(如果没经过ALG处理,那么FTP Server直接连接192.168.1.2,1084是无法连接上的)。

2. 中间件技术:是一种通过开发通用方法解决NAT穿越问题的努力。与前者不同之处是,AGL技术中NAT网关是这一解决方案的唯一参与者,而中间件技术中客户端会参与网关公网映射信息的维护。UPnP就是这样一种方法,UPnP中文全称为通用即插即用,是一个通用的网络终端与网关的通信协议,具备信息发布和管理控制的能力。

原理:NAT只要理解客户端的请求并按照要求去分配响应的映射转换表,不需要自己去分析客户端的应用层数据。网关映射请求可以为客户动态添加映射表项。此时,NAT不再需要理解应用层携带的信息,只转换IP地址和端口信息。而客户端通过控制消息或信令发到公网侧的信息中,直接携带公网映射的IP地址和端口,接收端可以按照此信息建立数据连接。NAT网关在收到数据或连接请求时,按照UPnP建立的表项只转换地址和端口信息,不关心内容,再将数据转发到内网。

限制:这种方案需要网关、内部主机和应用程序都支持UPnP技术,且组网允许内部主机和NAT网关之间可以直接交换UPnP信令才能实施。

3. 打洞技术(Hole Punching)

Hole Punching技术是工作在运输层的技术,可以屏蔽上层应用层的差异,并且不需要NAT网关特定的支持,因此其通用性比较强,应用性也比较广。

原理:打洞技术的原理比较简单,就是NAT内网的节点需要在NAT上建立自己的一条转发映射关系(这就是所谓的在NAT上打下一个洞),然后外网的节点就通过这个”洞”来进行通信。为描述方便,我们将一对IP地址和端口信息的组合称之为一个Endpoint,打洞原理可以简化为下面三个过程:

[1] 首先位于NAT后的Peer1节点需要向外发送数据包,以便让NAT建立起内网Endpoint1(IP1、PORT1)和外网Endpoint2(IP2、PORT2)的映射关系;
[2] 然后通过某种方式将映射后的外网Endpoint2通知给对端节点Peer2;
[3] 最后Peer2往收到的外网Endpoint2发送数据包,然后该数据包就会被NAT转发给内网的Peer1

NAT是怎么回事
浅析 P2P 穿越 NAT 的原理、技术、方法 (上)
视频聊天功能如何穿透NAT


http://chatgpt.dhexx.cn/article/GpKBZ9hn.shtml

相关文章

华为eNSP:静态NAT、动态NAT、端口NAT的配置(NAPT)-网络地址转换

静态NAT的配置 一、拓扑图 二、路由器的配置 1、配置端口IP AP1: [Huawei]interface gigabitether 0/0/1 [Huawei-GigabitEthernet0/0/1]ip address 1.1.1.1 24 [Huawei-GigabitEthernet0/0/1]interface gigabitether 0/0/2 [Huawei-GigabitEthernet0/0/2]ip address 192.1…

NAT基础:NAT技术原理,静态NAT、动态NAT、NAPT、Easy IP、NAT Server的原理,以及各NAT的配置方法和转换示例。

目录 NAT 技术原理&#xff1a; 静态NAT原理&#xff1a; 静态NAT&#xff08;土豪用法&#xff09;&#xff1a; NAT转换示例&#xff1a; 静态NAT配置方法介绍&#xff1a; 1、方式一&#xff1a; 2、方式二&#xff1a; 静态NAT的配置实例&#xff1a; 动态NAT原理&…

NAT、Napt(地址转换技术)详解

NAT的由来 IPv4即网际网协议第4版——Internet Protocol Version 4的缩写。IPv4定义一个跨越异种网络互连的超级网&#xff0c;它为每个网际网的节点分配全球唯一IP地址。如果我们把Internet比作一个邮政系统&#xff0c;那么IP地址的作用就等同于包含城市、街区、门牌编号在内…

静态NAT、NAT server、NAPT区别

NAT NAT&#xff08;Network Address Translation网络地址转换&#xff09;是将IP数据报文头中的IP地址转换为另一个IP地址的过程。 NAPT&#xff08;Network Address Port Translation网络地址端口转换&#xff09;可以实现并发的地址转换。 它允许多个内部地址映射到同一个…

IP协议与NAT/NAPT技术

文章目录 IP协议一、什么是IP协议1、IPv4协议报文格式关于分片 2、IP地址3、子网划分与CIDR4、特殊的IP地址5、公网IP和私网IP6、IP地址的分配(DHCP) 二、NAT/NAPT技术1、接口与IP的关系2、路由器的LAN口与WAN口3、NAPT的基本工作原理 三、IPv4与IPv6四、ICMP协议1、关于ping命…

NAT与NAPT技术详解

一、定义 NAT: Network Address Transfer 网络地址转换。虚拟机。 NAPT: Network Address Port Transfer 网络地址端口转换。也叫PAT。内网路由器或FW。 NAT和NAPT的功能是完成内部私有地址和全局网络地址的转换&#xff0c;让计算机能与外界网络通信。其属接入广域网(WAN)技…

Queue与Deque的区别

前言 ​ 在研究java集合源码的时候&#xff0c;发现了一个很少用但是很有趣的点&#xff1a;Queue以及Deque&#xff0c;平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用&#xff0c;但是一直都不知道Queue的作用&#xff0c;于是就直接官方文档好了。 正文…

【C++】deque的实现原理简单介绍

前言 deque被称为双端队列&#xff0c;它的出现主要是为了结合vector和list的优点并减小它们的缺点&#xff0c;实际上deque确实结合了vector和list的优点减小了它们的缺点&#xff0c;但是它的结合也让它自己的优点没有原始的vector和list那么极致&#xff0c;导致deque变得很…

C++容器deque的用法

目录 1.deque容器概念 2.deque对象的构造 2.1deque对象的默认构造 2.2deque对象的带参数构造 3.deque头部和末尾的添加移除操作 4.deque的数据存取 5.deque与迭代器 6.deque的赋值 7.deque的大小 8.deque的插入 9.deque的删除 1.deque容器概念 deque容器概念 deque是…

C++ deque

C deque 简介 所谓的deque是”double ended queue”的缩写&#xff0c;双端队列不论在尾部或头部插入元素&#xff0c;都十分迅速。而在中间插入元素则会比较费时&#xff0c;因为必须移动中间其他的元素。双端队列是一种随机访问的数据类型&#xff0c;提供了在序列两端快速…

C++ queue 和 deque的区别

从使用的角度来讲主要差别就是&#xff1a; deque支持push_front、pop_front、push_back、pop_back。 queue支持push_back、pop_front。 ---------------------------------------------------------------------------- deque是双端队列 #include<deque>template&l…

C++——deque

文章目录 Deque 与 vector 的异同点构造操作非更易型操作更易型操作使用例子 容器 deque (发音为“deck”)和 vector 非常相似。它也采用dynamic array来管理元素&#xff0c;提供随机访问&#xff0c;并有着和 vector 几乎一模一样的接口。不同的是 deque 的 dynamic array 头…

C++中deque用法详解

deque函数&#xff1a; deque容器为一个给定类型的元素进行线性处理&#xff0c;像向量一样&#xff0c;它能够快速地随机访问任一个元素&#xff0c;并且能够高效地插入和删除容器的尾部元素。但它又与vector不同&#xff0c;deque支持高效插入和删除容器的头部元素&#xff0…

python中的deque模块(collections的deque模块)

目录 1. deque是python的collections中的一个类 2.deque的简单使用以及它的方法 2.1 创建deque的方法 2.2 创建deque时&#xff0c;并指定大小maxlen&#xff0c;即能装几个元素&#xff0c; 以及deque添加元素append()方法 2.3 deque的 appendleft()方法 2.4 deque的 clear()…

C++中deque的用法(超详细,入门必看)

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 如果本文对你有所帮助的话&#xff0c;希望可以点赞&#x1f44d;收藏&#x1f4c2;支持一下哦&#xff01; 期待…

Java数据结构之Deque

Java数据结构之Deque 引题Deque接口分析Deque的注释与Queue的联系还在使用Stack&#xff1f;你OUT啦&#xff01;peek方法更方便与List的不同与null说goodbye 子类ArrayDeque.class分析基本结构官方的代码图解数据存储过程 简单思考 1部分代码的分析关于初始容量关于扩容代码中…

java关于Deque的使用

定义 双向队列&#xff1a;支持插入删除元素的线性集合。 java官方文档推荐用deque实现栈&#xff08;stack&#xff09;。 和Queue的区别 Deque是double ended queue&#xff0c;将其理解成双端结束的队列&#xff0c;双端队列&#xff0c;可以在首尾插入或删除元素。 Queue的…

【C++】deque的用法

目录 一、容器适配器二、deque的介绍三、deque的使用及缺陷1、deque的构造函数2、deque的元素访问接口3、deque的 iterator的使用4、deque的增删查改4、deque的缺陷5、为什么选择deque作为stack和queue的底层默认容器 一、容器适配器 在了解deque前&#xff0c;我们先讲一讲什…

Python deque的用法介绍

Python deque的用法介绍 deque 是Python标准库 collections 中的一个类&#xff0c;实现了两端都可以操作的队列&#xff0c;相当于双端队列&#xff0c;与Python的基本数据类型列表很相似。 Python实现双端队列参考&#xff1a;https://blog.csdn.net/weixin_43790276/artic…

C++ deque的用法与示例

C deque的用法与示例 deque容器的介绍 Vector 容器是单向开口的连续内存空间&#xff0c;deque 则是一种双向开口的连续线性空间。所谓的双向开口&#xff0c;意思是可以在头尾两端分别做元素的插入和删除操作&#xff0c;当然&#xff0c;vector 容器也可以在头尾两端插入元…