NAT与NAPT技术详解

article/2025/10/4 0:47:01

一、定义

NAT: Network Address Transfer 网络地址转换。虚拟机。

NAPT: Network Address Port Transfer 网络地址端口转换。也叫PAT。内网路由器或FW。

NAT和NAPT的功能是完成内部私有地址和全局网络地址的转换,让计算机能与外界网络通信。其属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。

两者的区别:

NAT:一个全局IP对应一个私有IP(即一台计算机)(或者有一个IP地址池,里面有很多外部IP地址,当有内部IP地址要出去的时候,就随机选一IP地址作为其出口IP)。一对一,一个内部地址转换成一个外部地址进行通信。

NAPT:一个全局IP+不同的端口号对应多个私有IP(即多台计算机),需要一个全局IP对应多台计算时,比如局域网内部计算机访问外界网络时,就得用NAPT。一对多,多个内部地址使用同一地址不同端口转换成外部地址进行通信。缺点在于其通信仅限于TCP或UDP

好处:

  • NAT不仅完美地解决了lP地址不足的问题。
  • 能够有效地避免来自网络外部的攻击。
  • 隐藏并保护网络内部的计算机。
  • 实现TCP流量的负载均衡。

NAT不仅实现了一般的地址转换功能,同时提供了完善的地址转换ALG (Application Layer Gateway,应用级网关)机制,使其可以支持一些特殊的应用协议,而不需要对NAT平台进行任何的修改,具有良好的可扩充性。这些特殊协议的报文载荷里携带了地址或端口信息,该信息也可能需要进行地址转换。这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。

可支持的特殊协议包括:FTP(File Transfer Protocol,文件传输协议)、ICMP(Internet Control Message Protocol,因特网控制消息协议)、DNS(Domain Name System,域名系统)、ILS(Internet Locator Service,Internet定位服务)、H.323、SIP(Session Initiation Protocol,会话发起协议)、NetMeeting 3.01、NBT(NetBIOS over TCP/IP,基于TCP/IP的网络基本输入输出系统)等。

NAT地址转换表

  • 不管本地主机的IP是什么,一律转换为外部全球IP。
  • 不管本地主机的TCP端口是什么,一律转换为互不相同的全新端口。

内网地址

  • 10.0.0.0~10.255.255.255          1个A类
  • 172.16.0.0~172.31.255.255      16个B类
  • 192.168.0.0~192.168.255.255  256个C类

穿透方法:

目前常用的针对UDP的NAT 穿透(NAT Traversal)方法主要有:STUNTURNICEuPnP等。其中ICE方式由于其结合了STUN和TURN的特点,所以使用最为广泛。针对TCP的NAT穿透技术目前仍为难点。实用的技术仍然不多。

二、工作原理

2.1 NAT

NAT是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程。在实际应用中,NAT 主要用于实现私有网络访问公共网络的功能。这种通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用IP 地址空间的枯竭。

NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。NAT网关有2个网络端口,其中公共网络端口的IP地址是统一分配的公共IP,为202.204.65.2;私有网络端口的IP地址是保留地址,为192.168.1.1。私有网中的主机 192.168.1.2向公共网中的主机166.111.80.200发送了1个IP包(Des=166.111.80.200,Src=192.168.1.2)。当IP包经过NAT网关时,NAT会将IP包的源IP转换为NAT的公共IP并转发到公共网,此时IP包(Des=166.111.80.200,Src=202.204.65.2)中已经不含任何私有网IP的信息。由于IP包的源IP已经被转换成NAT的公共IP,响应的IP包(Des=202.204.65.2,Src=166.111.80.200)将被发送到NAT。 这时,NAT会将IP包的目的IP转换成私有网中主机的IP,然后将IP包(Des=192.168.1.2,Src=166.111.80.200)转发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。

2.2 NAPT

由于NAT实现是私有IP和NAT的公共IP之间的转换,那么,私有网中同时与公共网进行通信的主机数量就受到NAT的公共IP地址数量的限制。为了克服这种限制,NAT被进一步扩展到在进行IP地址转换的同时进行Port的转换,这就是网络地址端口转换NAPT(Network Address Port Translation)技术。NAPT也被称为“多对一”的NAT,或者叫PAT(Port Address Translations,端口地址转换)、地址超载(address overloading)。

NAPT与NAT的区别在于,NAPT不仅转换IP包中的IP地址,还对IP包中TCP和UDP的Port进行转换。这使得多台私有网主机利用1个NAT公共IP就可以同时和公共网进行通信。(NAPT多了对TCP和UDP的端口号的转换)

私有网主机192.168.1.2要访问公共网中的 Http服务器166.111.80.200。首先,要建立TCP连接,假设分配的TCP Port是1010,发送了1个IP包(Des=166.111.80.200:80,Src=192.168.1.2:1010),当IP包经过NAT 网关时,NAT会将IP包的源IP转换为NAT的公共IP,同时将源Port转换为NAT动态分配的1个Port。然后,转发到公共网,此时IP包 (Des=166.111.80.200:80,Src=202.204.65.2:2010)已经不含任何私有网IP和Port的信息。由于IP包的源 IP和Port已经被转换成NAT的公共IP和Port,响应的IP包 (Des=202.204.65.2:,Src=2010166.111.80.200:80)将被发送到NAT。这时NAT会将IP包的目的IP转换成私有网主机的IP,同时将目的Port转换为私有网主机的Port,然后将IP包 (Des=192.168.1.2:1010,Src=166.111.80.200:80)转发到私网。对于通信双方而言,这种IP地址和Port的转换是完全透明的。

2.3 实现方法

NAT的实现方式有三种,即静态转换Static Nat动态转换Dynamic Nat端口多路复用OverLoad

静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。

建立内部本地地址和全局地址的一对一永久映射。

动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。

建立内部本地地址和全局地址池的临时映射关系,过一段时间没有用就会删除映射关系。

端口多路复用(Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation)。采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。

ALG(Application Level Gateway),即应用程序级网关技术:传统的NAT技术只对IP层和传输层头部进行转换处理,但是一些应用层协议,在协议数据报文中包含了地址信息。为了使得这些应用也能透明地完成NAT转换,NAT使用一种称作ALG的技术,它能对这些应用程序在通信时所包含的地址信息也进行相应的NAT转换。例如:对于FTP协议的PORT/PASV命令、DNS协议的 "A" 和 "PTR" queries命令和部分ICMP消息类型等都需要相应的ALG来支持。

如果协议数据报文中不包含地址信息,则很容易利用传统的NAT技术来完成透明的地址转换功能,通常我们使用的如下应用就可以直接利用传统的NAT技术:HTTP、TELNET、FINGER、NTP、NFS、ARCHIE、RLOGIN、RSH、RCP等。

三、示例

 1. 私有ip为192.168.0.2的计算机想和外界网络通信,如果地址未经转换,网络方因为只识别全局IP,不识别私有IP,将无法回信。

 

 2. 通过NAT把私有IP转换成全局IP就可以和外界顺畅通信了


3. 假设这个局域网内还有一台私有IP为192.168.0.3的计算机也要外界网络通信。此时用同一个全局IP的话,网络将不知道回复给哪个私有IP。NAT到这儿就不灵了。

 

 

4. 如果在地址转换的时候,加上端口号来区分是哪个私有IP,就可以解决上面的多台内部计算机和外界通信的问题了。这就是NAPT。

 

 

四、easy IP

Easy IP 方式的实现原理与上节介绍的地址池NAPT转换原理类似,可以算是NAPT的一种特例,不同的是Easy IP 方式可以实现自动根据路由器上WAN接口的公网IP地址实现与私网IP地址之间的映射(无需创建公网地址池)。

Easy IP 主要应用于将路由器WAN 接口IP 地址作为要被映射的公网IP 地址的情形,特别适合小型局域网接入Internet 的情况。这里的小型局域网主要指中小型网吧、小型办公室等环境,一般具有以下特点:内部主机较少、出接口通过拨号方式获得临时(或固定)公网IP 地址以供内部主机访问Internet。

图示为Easy IP 方式的实现原理,具体过程如下:



① 假设私网中的Host A 主机要访问公网的Server,首先要向Router 发送一个请求报文(即Outbound 方向),此时报文中的源地址是10.1.1.100,端口号1540。
② Router 在收到请求报文后自动利用公网侧WAN 接口临时或者固定的“公网IP地址:端口号”(162.10.2.8:5480),建立与内网侧报文“源IP 地址:源端口号”间的Easy IP转换表项(也包括正、反两个方向),并依据正向Easy IP 表项的查找结果将报文转换后向公网侧发送。此时,转换后的报文源地址和源端口号由原来的(10.1.1.100:1540)转换成了(162.10.2.8:5480)。
③ Server 在收到请求报文后需要向Router 发送响应报文(即Inbound 方向),此时只须将收到的请求报文中的源IP 地址、源端口号和目的IP 地址、目的端口号对调即可,即此时的响应报文中的目的IP 地址、目的端口号为162.10.2.8:5480。
④ Router 在收到公网侧Server 的回应报文后,根据其“目的IP 地址:目的端口号”查找反向Easy IP 表项,并依据查找结果将报文转换后向内网侧发送。即转换后的报文中的目的IP地址为10.1.1.100,目的端口号为1540,与Host A 发送请求报文中的源IP地址和源端口完全一样。
如果私网中的Host B 也要访问公网,则它所利用的公网IP 地址与Host A 一样,都是路由器WAN 口的公网IP地址,但转换时所用的端口号一定要与Host A 转换时所用的端口不一样。 

Easy IP功能是指进行地址转换时,直接使用接口的外网IP地址作为转换后的源地址,能够最大程度的节省IP地址资源,不需要公网IP地址池。它也可以利用访问控制列表控制哪些内部地址可以进行地址转换。
 


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

相关文章

Queue与Deque的区别

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

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

前言 deque被称为双端队列,它的出现主要是为了结合vector和list的优点并减小它们的缺点,实际上deque确实结合了vector和list的优点减小了它们的缺点,但是它的结合也让它自己的优点没有原始的vector和list那么极致,导致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”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速。而在中间插入元素则会比较费时,因为必须移动中间其他的元素。双端队列是一种随机访问的数据类型,提供了在序列两端快速…

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 容器也可以在头尾两端插入元…

deque用法详解

“无意中发现了一个巨牛的人工智能教程&#xff0c;忍不住分享一下给大家。教程不仅是零基础&#xff0c;通俗易懂&#xff0c;而且非常风趣幽默&#xff0c;像看小说一样&#xff01;觉得太牛了&#xff0c;所以分享给大家。点这里可以跳转到教程。” deque函数&#xff1a; …

deque容器详解

文章目录 1. deque容器基本概念2. deque构造函数3. deque赋值操作4. deque大小操作5. deque插入和删除6. deque数据存取7. deque排序 1. deque容器基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector区别&#xff1a; vector对于头部…

双端队列(Deque)

一、简介 deque&#xff0c;即双端队列(double ended queue)&#xff0c;是一种可以在两端扩展或收缩的序列化容器。 deque是C 标准模板库的一部分&#xff0c;想要使用deque&#xff0c;需要在程序中包含头文件deque。 #include<deque>二、定义和初始化 1.格式&#x…

关于Deque的详解

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

deque用法深度解析,一篇文章弄懂deque容器各种操作

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2022/01/11&#x1f4c5; 最近更新时间&#xff1a;2022/01/11&#x1f935; 此马非凡马&#xff0c;房星本是星。向前…

未禁用nouveau导致Ubuntu安装Cuda的runfile安装方法出错:[ERROR]: Install of 455.32.00 failed, quitting

很多朋友在给Ubuntu&#xff08;Linux&#xff09;安装Cuda时&#xff0c;参考官方安装步骤导致安装出错&#xff1a; wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run sudo sh cuda_11.1.1_455.32.00_lin…