NAT 系列:认识 NAT
一文概览 NAT
NAT
NAT(Network Address Translation,网络地址转换)在计算机网络中是一种在 IP
数据包通过路由器或防火墙时重写来源 IP
地址或目的 IP
地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有 IP
地址访问互联网的私有网络中。
NAT
从大类上都可以分为两类:静态 NAT
和 动态 NAT
。
静态 NAT
是管理员手动创建和维护映射,通常与 NAT
的入站类型相关联。
动态 NAT
是路由器根据需要自动创建和维护映射,通常与 NAT
的出站类型相关联。
每个 TCP/IP
数据包都包含一个 源 IP 地址
、源端口
、目的 IP 地址
和 目的端口
。所有类型的 NAT
都会使用这些值创建 NAT
映射。
例如,一个 IP 为
192.168.0.1
的内部客户机使用端口56876
,经过 NAT 转变后 IP 变为3.3.3.3
(翻译后的源 IP)和端口56876
(源端口)连接到 IP2.2.2.2
(目的 IP 地址)的80
端口(目的端口)。NAT 使用原始内部 IP 和端口、翻译后 IP 和端口这 4 个值创建一个映射。当数据包从网站返回到路由器时,使用与该映射相关值,NAT 将数据包转发到内部客户端。
NAT 的四种类型
全锥型 NAT(Full Cone NAT)

全锥型 NAT
是静态 NAT,也是唯一一种永久开放端口的 NAT
,允许从 任何外部主机 进行入站连接。全锥型 NAT
将一个公共 IP 地址和端口映射到 LAN IP 和端口。任何外部主机都可以通过映射的 NAT
IP 和端口向 LAN IP 发送数据。但是,如果它试图通过不同的端口发送数据,就会失败。这种类型的 NAT
也被称为端口转发。这是受限制最少的 NAT
类型,唯一的要求是连接在一个特定的端口(客户端打开的端口)。
例如,我的电脑有一个网站在
80
端口上运行,我创建了一个一对一的规则,将路由器的 WAN IP1.1.1.1
映射到192.168.0.1
,端口80
映射到80
端口。凡是在80
端口向1.1.1.1
发送数据的外部主机都会被NAT
转发到192.168.0.1 80
端口。
注意: 端口号不必相同;我可以在 56456
端口上运行我的网站,但创建 NAT
映射,将 80
端口转发到 56456
端口。这样,外部客户端就会认为我的网站在 80
端口上,而在任何其他端口上的连接尝试都会被丢弃。
受限锥形 NAT(Restricted Cone NAT)

受限锥体 NAT
是动态 NAT
,它的工作方式与全锥型 NAT
相同,但会对进站的 IP 地址施加额外的限制。根据限制,唯一的要求是数据包必须从映射的端口进入,并且来自内部客户端已发送数据包的 IP 地址。亦即需要内部主机首先发起连接的外部主机,才能被接受入站。
例如,我的电脑与一个网站 (
56.45.34.78
) 进行外向连接,源IP
为192.168.0.1
,源端口为56723
。NAT
使用源端口56723
创建一个(动态)映射到我的电脑。使用目的端口56723
(这是出站 NAT 的源端口)到达的源 IP
为56.45.34.78
(网站 IP
)的数据包将被接受,接着网站返回数据至我的PC
。任何其他 IP 即使使用正确的56723
端口进行连接尝试将被丢弃。同样,即使正确的IP
使用56723
以外的目的端口进行的连接尝试也将被丢弃。
端口受限锥型 NAT(Port Restricted Cone NAT)

端口受限锥型 NAT
是动态 NAT
,它的作用与受限锥形 NAT
完全相同,但同时对端口进行限制。受限锥形 NAT
接受来自外部主机任何源端口的连接,而端口受限锥型 NAT
则进一步要求外部主机的源端口是固定的。
例如,我的电脑在 80 端口(目标端口)上向网站 IP
217.87.69.8
建立了一个外向连接。NAT 将我的源 IP192.168.0.1
映射到 WAN IP1.1.1.1
和源端口56723
。当网站发回数据包时,它的源 IP 必须是217.87.69.8
,目的端口是56723
(就像一个受限锥型 NAT),但除此之外,还要求源端口必须是80
。如果这三者中的任何一个不一样,端口受限锥型 NAT 就会放弃连接。
对称型 NAT(Symmetric NAT)

对称型 NAT
是动态 NAT
,它限制的方式与端口受限锥型 NAT
完全相同,但处理 NAT 转换的方式不同。目前讨论的所有类型的 NAT
在 NAT
连接时都 不会改变源端口。
例如,当客户端使用 IP
192.168.0.1
和源端口56723
访问互联网时,NAT
将源IP
改变为56.35.67.35
,但保持端口号不变,这被称为端口保留。
而对称型 NAT
会将端口改为 随机生成的新端口,甚至是同一客户端到不同目的地的连接也会发生。亦即为每个连接创建唯一的映射
例如,在
端口受限锥型 NAT
的例子上进行扩展,我的PC
向网站IP
217.87.69.8
和56.76.87.98
建立两个出站连接。我的电脑使用源IP
192.168.0.1
和源端口56723
进行两个连接。到目前为止,在所有类型的NAT
上,这两个连接都会被NAT
化,只改变源 IP 地址而保持源端口不变。然而这次,对称型 NAT
没有将源端口保留为56723
,而是将其中一个连接的源端口改为45765
,另一个连接的源端口改为53132
(随机)。这就为每个连接创建了唯一的映射,来自这些目的地的流量必须通过各自的端口进入。所以217.87.69.8
必须将数据包发送到目的端口45765
,56.76.87.98
必须将数据包发送到端口53132
,此外还需要遵循端口受限锥型 NAT
的要求。
对 NAT 的正面评价
-
NAT
在一定程度上缓解了IPv4
地址短缺的问题,让更多的设备(间接)接入了互联网。 -
NAT
全双工连接支持的缺少在一些情况下可以看作是一个有好处的特征而不是一个限制。在一定程度上,NAT 依赖于本地网络上的一台机器来初始化和路由器另一边的主机的任何连接,它可以阻止外部网络上的主机的恶意活动。这样就可以阻止网络蠕虫病毒来提高本地系统的可靠性,阻挡恶意浏览来提高本地系统的私密性。很多具有 NAT 功能的防火墙都是使用这种功能来提供核心保护的。另外,它也为 UDP 的跨局域网的传输提供了方便。
对 NAT 的批评
-
在一个具有
NAT
功能的路由器下的主机并没有获得真正的 IP 地址,并且不能参与一些因特网协议,一些需要初始化从外部网络创建的 TCP 连接和无状态协议(比如 UDP)无法实现。除非NAT
路由器管理者预先设置了规则,否则送来的数据包将不能到达正确的目的地址。 -
端对端连接是被 IAB 委员会(Internet Architecture Board)支持的核心因特网协议之一,因此有些人据此认为
NAT
是对公用因特网的一个破坏。一些因特网服务提供商(ISP)只向他们的客户提供本地 IP 地址,所以他们必须通过NAT
来访问 ISP 网络以外的服务,并且这些公司能不能算的上真正的提供了因特网服务的话题也被谈起。 -
NAT
使得IP
协议从面向无连接变成立面向连接。NAT
必须维护专用IP
地址与公用 IP 地址以及端口号的映射关系。在TCP/IP
协议体系中,如果一个路由器出现故障,不会影响到TCP
协议的执行。因为只要几秒收不到应答,发送进程就会进入超时重传处理。而当存在NAT
时,最初设计的TCP/IP
协议过程将发生变化,Internet
可能变得非常脆弱。 -
NAT
违反了基本的网络分层结构模型的设计原则。因为在传统的网络分层结构模型中,第 N 层是不能修改第 N+1 层的报头内容的。NAT
破坏了这种各层独立的原则。 -
NAT
同时存在对高层协议和安全性的影响问题。RFC
对NAT
存在的问题进行了讨论。NAT 的反对者认为这种临时性的缓解IP
地址短缺的方案推迟了IPv6
迁移的进程,而并没有解决深层次的问题,他们认为是不可取的。