NAT / NAPT

article/2025/10/4 0:40:12

目录

一、前言

二、网络地址转换(NAT)

2.1 NAT如何解决IP冲突

2.2 SNAT / DNAT 

2.3 SNAT工作原理

2.3.1 案例1(NAT)

2.3.2 案例2(NAPT)

2.4 DNAT

三、总结


一、前言

        本人在学习Bridge/Router的过程中,发现在计算机网络中,数据报如何发送是根据目标IP地址进行路由的。若同一个网路中出现相同的IP,则会造成IP冲突,从而导致ARP表出现混乱,数据报发送到哪台主机上就会变成不确定性行为。

        但我们会发现,我们日常使用的主机的IP地址都是类似于192.168.1.10这样的IP地址,若按照文章说所说这些计算机都以家庭网络中的IP地址将数据报发送到互联网上,那么互联网上就会出现无数个相同的IP地址,这必然会造成混乱。本章节旨在向大家说明家庭网络和因特网之间的转换关系。

二、网络地址转换(NAT)

2.1 NAT如何解决IP冲突

        想要解决上述问题,我们只需要让数据报从路由器发送出去的时候,变成不同的IP地址即可,但IPv4的公网地址(全球唯一)是有限的,给每台主机分配一个公网IP地址是不切实际的。

        因此,提出了NAT转换技术,NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机。NAT技术将IP地址大致分为了私有IP和公有IP。其中,我们大部分人所接触到的都是私有IP地址,私有IP地址范围如下表所示。

A类范围10.0.0.0 - 10.255.255.255
B类范围172.16.0.0 - 172.31.255.255
C类范围192.168.0.0 - 192.168.255.255

2.2 SNAT / DNAT 

         NAT技术本质是将IP数据报中的IP地址转换为另一个IP地址的过程,实际上就是建立一张NAT映射表。它有两种模式,分为SNAT和DNAT模式。

        SNAT(Source Network Address Translation):源网络地址转换,内部地址要访问公网上的服务时,内部地址会主动发起连接,将内部地址转换为公网IP。

        DNAT(Destination Network Address Translation):目标地址转换,内部对外提供服务时,外部主动发起连接,路由器或防火墙的网络收到这个连接后,将连接转换到内部,在内部有做地址转换,主要用于内部服务对外发布。

2.3 SNAT工作原理

2.3.1 案例1(NAT)

         我们假设路由器的WAN口接入的IP地址为公网IP地址(221.8.14.91),内网计算机IP地址为192.168.1.10,网关地址为192.168.1.1,我们要访问的远端服务的IP地址为36.152.44.96。具体配置如下图所示。

         若内网中的主机(192.168.1.10)给因特网中使用全球IP地址的服务器(36.152.44.96)发送数据报,其过程如下。

        step1: 主机将数据报发送至路由器,数据报的的源地址为主机的私有IP地址,目的地址为因特网上服务器的全球地址,如下表所示。

源地址192.168.1.10
目的地址36.152.44.96

        step2: 路由器收到数据报后,执行源地址转换,将WAN口的公网IP地址修改为源IP地址,并将源地址与私有地址的关系记录在NAT转换表中。

源地址221.8.14.91
目的地址36.152.44.96
NAT转换表
内网地址外网地址
192.168.1.10221.8.14.91
............

        step3: 因特网上的服务器收到IP数据报后,给主机返回相应数据报,将请求报文的源IP地址作为目标IP地址,自身的IP地址作为源IP地址,并将数据报发送出去,如下表所示。

源地址36.152.44.96
目的地址221.8.14.91

         step4: 响应数据报发送到路由器后,路由器再次查询NAT转换表,寻找到对应的私有地址(192.168.1.10),再将数据报的目标IP地址修改为192.168.1.10,再将其发送给相应主机。

源地址36.152.44.96
目的地址192.168.1.10

         此时,通信完成。

案例1小结:

        案例中为一对一通信,若内网中两台及以上的主机都使用私有地址给因特网上同一台服务器发送数据报时,数据报在发送出去的时候不会出现问题,但响应数据报返回时却会出现问题。响应数据报的目标IP地址都是路由器WAN口的公网IP地址,无法区分该响应数据报属于哪一台主机,因此只关注IP地址是远远不够的,还需要添加其他的标记。

2.3.2 案例2(NAPT)

        由于绝大多数网络应用都是使用TCP/UDP传输数据的,因此可以利用传输层的端口号和IP地址一起进行转换。这样,一个全球IP地址就可以使多个本地主机同时和因特网上的主机进行通信,这种方法称为网络地址与端口号转换(NAPT)。

        我们假设路由器的WAN口接入的IP地址为公网IP地址(221.8.14.91),内网计算机A的IP地址为192.168.1.10,计算机B的IP地址为192.168.1.11,网关地址为192.168.1.1,我们要访问的远端服务的IP地址为36.152.44.96。具体配置如下图所示。

        案例中,若计算机A和计算机B同时访问远程服务器,则采用NAPT技术进行转换,此时SNAT不仅仅修改IP地址,而是结合端口号一起修改。假设主机A和主机B访问远程服务器时端口号均为12345,则两台主机同时访问服务器的流程如下。

        step1: 主机A和B将数据报发送至路由器,数据报的的源地址为主机的私有IP地址,目的地址为因特网上服务器的全球地址。数据报的源地址和目标地址如下所示。

主机A的数据报主机B的数据报
源地址:端口号192.168.1.10:12345192.168.1.11:12345
目的地址:端口号36.152.44.96:808036.152.44.96:8080

        step2: 路由器收到数据报后,执行源地址转换,将WAN口的公网IP地址修改为源IP地址,源端口号根据NAPT路由器动态分配(此处为40001和40002),并将源地址与私有地址的关系记录在NAT转换表中。

主机A的数据报主机B的数据报
源地址:端口号221.8.14.91:40001221.8.14.91:40002
目的地址:端口号36.152.44.96:808036.152.44.96:8080

NAPT转换表

内网地址:端口号外网地址:端口号
192.168.1.10:12345221.8.14.91:40001
192.168.1.11:12345221.8.14.91:40002
............

        step3: 因特网上的服务器收到IP数据报后,给主机返回相应数据报,将请求报文的源IP地址作为目标IP地址,自身的IP地址作为源IP地址,并将数据报发送出去。

主机A的数据报主机B的数据报
源地址:端口号36.152.44.96:808036.152.44.96:8080
目的地址:端口号221.8.14.91:40001221.8.14.91:40002

         step4: 响应数据报发送到路由器后,路由器再次查询NAT转换表,寻找到对应的私有地址,再将数据报的目标IP地址修改为内网私有地址,再将其发送给相应主机。

主机A的数据报主机B的数据报
源地址:端口号221.8.14.91:40001221.8.14.91:40002
目的地址:端口号192.168.1.10:12345192.168.1.11:12345

         此时,通信完成。

2.4 DNAT

        如果我们的内网计算机对外提供服务,公网上发过来的请求不能直接到达内网计算机,我们需要DNAT技术帮忙转发请求。其大致过程如下。

        step1:路由器配置DNAT,若访问公网地址221.8.14.91的8080端口则自动转到计算机A。

221.8.14.91:8080  ->  192.168.1.10:80

        step2: 访问数据报从WAN口进入路由器后,路由器执行DNAT转到相应主机A,修改目标地址为192.168.1.10,修改目标端口为80,从而把数据报转发给计算机A。

三、总结

        NAT(NAPT)的存在使得IPv4虽然匮乏,但仍然能够使得计算机网络正常运行,同时NAT(NAPT)技术对外屏蔽了内网主机的网络地址,为内网的主机提供了一定的安全保护。


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

相关文章

NAT与NAPT

一、NAT和NAPT的概念 NAT(Network Address Translation,网络地址转换):NAT是将IP数据报头中的IP地址转换为另一个IP地址的过程。使用少量的公网IP地址代表较多的私网IP地址的方式,仅支持地址转换,不支持端…

华为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 技术原理: 静态NAT原理: 静态NAT(土豪用法): NAT转换示例: 静态NAT配置方法介绍: 1、方式一: 2、方式二: 静态NAT的配置实例: 动态NAT原理&…

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

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

静态NAT、NAT server、NAPT区别

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

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的功能是完成内部私有地址和全局网络地址的转换,让计算机能与外界网络通信。其属接入广域网(WAN)技…

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…