目录
一、前言
二、网络地址转换(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.10 | 221.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:12345 | 192.168.1.11:12345 |
目的地址:端口号 | 36.152.44.96:8080 | 36.152.44.96:8080 |
step2: 路由器收到数据报后,执行源地址转换,将WAN口的公网IP地址修改为源IP地址,源端口号根据NAPT路由器动态分配(此处为40001和40002),并将源地址与私有地址的关系记录在NAT转换表中。
主机A的数据报 | 主机B的数据报 | |
源地址:端口号 | 221.8.14.91:40001 | 221.8.14.91:40002 |
目的地址:端口号 | 36.152.44.96:8080 | 36.152.44.96:8080 |
NAPT转换表 | |
内网地址:端口号 | 外网地址:端口号 |
192.168.1.10:12345 | 221.8.14.91:40001 |
192.168.1.11:12345 | 221.8.14.91:40002 |
...... | ...... |
step3: 因特网上的服务器收到IP数据报后,给主机返回相应数据报,将请求报文的源IP地址作为目标IP地址,自身的IP地址作为源IP地址,并将数据报发送出去。
主机A的数据报 | 主机B的数据报 | |
源地址:端口号 | 36.152.44.96:8080 | 36.152.44.96:8080 |
目的地址:端口号 | 221.8.14.91:40001 | 221.8.14.91:40002 |
step4: 响应数据报发送到路由器后,路由器再次查询NAT转换表,寻找到对应的私有地址,再将数据报的目标IP地址修改为内网私有地址,再将其发送给相应主机。
主机A的数据报 | 主机B的数据报 | |
源地址:端口号 | 221.8.14.91:40001 | 221.8.14.91:40002 |
目的地址:端口号 | 192.168.1.10:12345 | 192.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)技术对外屏蔽了内网主机的网络地址,为内网的主机提供了一定的安全保护。