前言
NAT是什么,应用场景有哪些?它仅仅是用来解决IPv4地址数量不足的工具吗?和NAPT又有怎样的关系?这些问题都将在本文中得到解答。
NAT(Network Address Translator)
棘手的问题
如下图所示,某公司要将甲乙两部门的内网合并。
一种方法是去掉乙部门的路由器R2,并直接将乙部门的交换机连到甲部门的路由器R1上。但是同一个路由器不能连接两个相同的网段。解决之道是修改甲部门或者乙部门的网络配置(很可能是每一台主机的配置,如果用了静态IP的话)。这是非常麻烦的。
我们还可以在甲乙两部门的网络之上再加一个路由器。尽管这样做解决了网段冲突,但LAN 1中的主机仍然无法和LAN 2中的主机通信。事情是显然的:路由器R1不会转发来自f0端口的发往192.168.0.0/24网段的消息(f0端口连接的就是192.168.0.0/24网段,转发没有意义)。同理,LAN 2也无法访问LAN 1中的主机。
如下图所示,假设运营商只给家用路由器分配了一个WAN地址,为了使路由器下的设备都可以上网,我们又应当如何设置呢?
NAT的出现
总结以上两种情况,它们的共性是:原先在网络内部使用的地址不能在网络外部被使用。好在NAT的出现解决了这种问题。即允许我们在本地网络中使用私有地址。
NAT的分类
为了解决以上两种不同的问题,我们提出了两种NAT方案。即,Basic NAT与NAPT。
NAT的主要任务是将内部私有地址映射为在全局有效的地址。
此任务逻辑上使用NAT转换表实现。下表为Basic NAT的转换表。
内网IP | 外网IP |
---|---|
xxx.xxx.xxx.xxx | xxx.xxx.xxx.xxx |
xxx.xxx.xxx.xxx | xxx.xxx.xxx.xxx |
下表为NAPT的转换表。
内网IP | 内网端口 | 外网IP | 外网端口 |
---|---|---|---|
xxx.xxx.xxx.xxx | XXXX | xxx.xxx.xxx.xxx | XXXX |
xxx.xxx.xxx.xxx | XXXX | xxx.xxx.xxx.xxx | XXXX |
Traditional NAT的转换表通常在内网访问外网时生成,以便外网主机答复的时候将目的IP根据转换表替换为内网主机IP。
Basic NAT
Basic NAT通过将一组内部私有地址动态映射为一组全局有效地址的方式使得内网设备可以访问外网。其工作流程如下图所示。
在图中,我们设定路由器R1可以将内网私有IP映射到198.76.29.0/24网段中的IP,同时设定路由器R2可以将内网私有IP映射到198.76.28.0/24网段中的IP。
RFC3022 没有要求Basic NAT映射后的IP为路由器外网端口(即上图中f1,f2)的IP。
假设主机192.168.0.2(下文简称主机A)希望访问192.168.0.10(下文简称主机B)。这分为以下几个步骤:
- 主机A发送IP数据包,其源地址是主机A的地址,目标地址是路由器R2
- R1将IP包的源地址修改为198.76.29.7
- 路由器R3转发,不涉及IP地址修改
- R2根据预先设置好的NAT表将目标地址修改为192.168.0.10
有以下几点值得注意:
- 尽管Basic NAT可以将私有内部IP动态映射为任意一个有效的全局IP,但我们依然可以静态地指定将某些确定的内部私有IP映射为某些确定的有效全局IP。这种方法为内网向外网暴露指定设备提供了支持。言外之意,通常情况下外(公)网无法主动访问内(私)网主机。
- 当内网私有IP数量小于等于外网有效IP数量时,Basic NAT允许这些IP同时上网;否则当外网IP数目不足时,部分内网IP将被拒绝访问外网。毫无疑问,这种方式并没有减少所需IP地址的数量。
- NAT天然地将网络分为内网和外网两部分,与路由器无关。
- NAT对终端(主机上的应用程序、用户)是透明的。
- 前文已述,NAT需要一张转换表(关联表)。
- NAT对外网隐藏内网IP地址,增加内网安全性。
- 当外网结构发生变化是,NAT可以隔离这种变化从而使得内网无需重新配置。
NAPT
NAPT将一组内网私有IP映射为唯一一个WAN口(图中e0口)IP,同时将内网端口(例如TCP或者UDP端口)映射为另一组端口。
为了提供外网对内网的访问,此种方式依然可以静态地将外网的IP+端口与内网的IP+端口进行绑定。仅从端口数目的限制(0~65535)上看,NATP允许同时维持65536个连接。
后记
本文还有很多内容没有涉及。例如,对ICMP报文的修改,对FTP、DNS的支持,校验和修改(因为NAPT更改了传输层端口)、会话保持等诸多内容。
未完待续……