NAT原理


简介

NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”。

允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)转换成合法网络IP地址的技术。

因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。(也有人说这是阻碍IPV6发展的原因之一)

分类

  • 静态NAT(Static NAT)

  • 动态地址NAT(Pooled NAT)

  • 网络地址端口转换NAPT(Port-Level NAT)

(Network Address Port Translation)是把内部地址映射到外部网络的一个IP地址的不同端口上。它可以将中小型的网络隐藏在一个合法的IP地址后面。

NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口号。

NAPT是使用最普遍的一种转换方式,在HomeGW中也主要使用该方式。它又包含两种转换方式:SNATDNAT

(Source NAT):修改数据包的源地址。SNAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成,数据包伪装就是一个SNAT的例子。

(Destination NAT,DNAT):修改数据包的目的地址。DNAT刚好与SNAT相反,它是改变第一个数据包的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT

原理

  • 地址转换

NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。

如下图所示,NAT网关有2个网络端口,其中公共网络端口的IP地址是统一分配的公共 IP,为202.20.65.5

私有网络端口的IP地址是保留地址,为192.168.1.1。私有网中的主机192.168.1.2向公共网中的主机202.20.65.4发送了1个IP包(Dst=202.20.65.4,Src=192.168.1.2)。

NAT工作原理1

当IP包经过NAT网关时,NAT Gateway会将IP包的源IP转换为NAT Gateway的公共IP并转发到公共网,此时IP包(Dst=202.20.65.4,Src=202.20.65.5)中已经不含任何私有网IP的信息。

由于IP包的源IP已经被转换成NAT Gateway的公共IP,Web Server发出的响应IP包(Dst= 202.20.65.5,Src=202.20.65.4)将被发送到NAT Gateway。

这时,NAT Gateway会将IP包的目的IP转换成私有网中主机的IP,然后将IP包(Des=192.168.1.2,Src=202.20.65.4)转发到私有网。
对于通信双方而言,这种地址的转换过程是完全透明的。转换示意图如下:

转换示意图

  • 连接追踪

在上述过程中,NAT Gateway在收到响应包后,就需要判断将数据包转发给谁。此时如果子网内仅有少量客户机,可以用静态NAT手工指定;
但如果内网有多台客户机,并且各自访问不同网站,这时候就需要连接追踪(connection track)。如下图所示:

连接追踪

在NAT Gateway收到客户机发来的请求包后,做源地址转换,并且将该连接记录保存下来,当NAT Gateway收到服务器来的响应包后,查找Track Table,确定转发目标,做目的地址转换,转发给客户机。

  • 端口转换

以上述客户机访问服务器为例,当仅有一台客户机访问服务器时,NAT Gateway只须更改数据包的源IP或目的IP即可正常通讯。
但是如果Client A和Client B同时访问Web Server,那么当NAT Gateway收到响应包的时候,就无法判断将数据包转发给哪台客户机,如下图所示:

端口转换1

此时,NAT Gateway会在Connection Track中加入端口信息加以区分。
如果两客户机访问同一服务器的源端口不同,那么在Track Table里加入端口信息即可区分,如果源端口正好相同,那么在时行SNAT和DNAT的同时对源端口也要做相应的转换,如下图所示:

端口转换2

是否会存在端口冲突?

假如小明开了一个浏览器窗口,使用10.0.0.1:1025访问互联网服务器1.1.1.1:443,问题来了,小明能否同时再开一个窗口访问1.1.1.1:443,使用相同的10.0.0.1:1025

绝不可能,如果这样的话,两次访问的流量服务器IP地址(10.0.0.1)、端口号(1025)是完全一样的,这样服务器会混淆两次通信会话,从而引起通信的紊乱,所以绝对不允许这样的端口冲突发生。

那大家不禁要问,小明的电脑是如何保证每个通信程序使用不冲突的端口号?

由操作系统集中管理,端口号一共16位,取值范围为0-65535,操作系统为了避免冲突,将这65536个端口资源统一调度,其中0-1024是知名端口,保留给相应的服务使用,1025-65535端口号可以留作普通进程使用,当一个程序执行时,如果该程序没有明确指定端口号,操作系统会从空闲的端口资源中选取一个,供该程序使用。
如果该程序明确指定了端口号,操作系统如果检查发现该端口号空闲并允许该程序使用,该程序可以继续用该端口继续运行。

无论是以上哪种方式,都可以避免端口冲突的状况的发生。

大家学习TCP/IP协议,一定听过五元组的概念,五元组的概念来源于TCP连接 (TCP,源IP,源端口,目的IP,目的端口)

这个五元组定义了一个session,每个session的五元组至少要有一项区别于别的session的地方。有人会说,每个TCP连接的的五元组的“TCP”都是一样的,那么为了保证每个session区别于别人的地方,只能依靠其它四元组了

但是,往往目的IP、目的端口也是固定不变的,此话怎讲?

比如大家访问百度,这是一个https连接,假定百度的服务器IP为6.6.6.6,在443端口侦听连接请求。

现在再来审视这个五元组:

(TCP,源IP,源端口,6.6.6.6,443)

那么意味着,只能依靠(源IP,源端口)来区分彼此了

又有人说,如果是同一台主机,假设主机的IP=1.1.1.1,那么五元组就有四个元素是固定不变的了,如下图:

(TCP, 1.1.1.1,源端口,6.6.6.6,443)

那么对于同一台主机,访问同一台服务器的同一个服务(端口),只能依赖于不同的源端口。

操作系统统一管理端口号资源,保证每一个进程的端口号是唯一的,这样即使访问同一台服务器的同一个服务(端口),五元组也是不同的,这样就不会造成通信的紊乱。

应用

  • 数据伪装

可以将内网数据包中的地址信息更改成统一的对外地址信息,不让内网主机直接暴露在因特网上,保证内网主机的安全。同时,该功能也常用来实现共享上网。

  • 端口转发
    当内网主机对外提供服务时,由于使用的是内部私有IP地址,外网无法直接访问。因此,需要在网关上进行端口转发,将特定服务的数据包转发给内网主机。

  • 负载均衡
    目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器(被负载均衡的服务器就相当于上面的内网主机)。

  • 失效终结
    目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器,一旦路由器检测到该服务器宕机(心跳检测),它可以使用目的地址转换NAT透明地把连接转移到一个备份服务器上。

  • 透明代理
    NAT可以把连接到因特网的HTTP连接重定向到一个指定的HTTP代理服务器以缓存数据和过滤请求。一些因特网服务提供商就使用这种技术来减少带宽的使用而不用让他们的客户配置他们的浏览器支持代理连接。

转载链接:

风吹过的时光 https://blog.csdn.net/hzhsan/article/details/45038265

芷菁博客 http://www.stars625.com/nat.html


本文不允许转载。
  目录