NAT 作为当今现实网络中不可或缺的一部分,虽然应用广泛,但是对它的介绍却远不及其他网络协议。另一方面,IETF 也把 NAT 视为 IPv4 的权宜之计,在很长一段时间内都寄解决地址短缺问题之希望于大力推广 IPv6。从 RFC 的提出时间就可以看出,很多 NAT 穿透相关的 RFC 提出时间都晚 IPv6 不少。而现在看来,IPv6 的推广乃至 IPv4 的废弃还有相当长的路要走,所以可以预见,NAT 还将陪伴我们不少时日。
一、概念
NAT(Network address translation)就是网络地址转换技术。按照 Wikipedia 的解释,它就是一个在路由设备上修改 IP 首部的地址,从而把一个地址变成另一个地址的技术,简而言之就是针对 IP 地址的重命名。比如在路由器上设定把来自 A 网络的 IP 包中的地址 10.0.0.2
重命名成 10.1.1.3
,然后转发到 B 网络,反之亦然。这样对于 B 网络来说,访问 10.1.1.3
就等同于访问 A 网络中的 10.0.0.2
了。更加复杂的 NAT 技术还可能涉及对 TCP、UDP 协议中端口号的修改,不过总而言之,NAT 就是一个修改数据包头部完成 “重命名” 的技术。
目前 NAT 技术最广泛的应用是解决 IPv4 地址短缺问题。它的思路非常简单,就是重复利用同一个 IP 地址,并在路由器转发数据包的时候进行 “重命名”。比如在常识中,无论在家、学校还是餐厅里网上冲浪,路由器管理页面的地址总是 192.168.0.1
、手机的地址也总是 192.168
开头。而 IP 协议中要求每个设备都有不同的 IP 地址,否则就会混淆不同的设备。之所以我们还能继续网上冲浪,就是因为路由器上使用了 NAT 技术把这些192.168
开头的内网地址 “重命名” 成路由器自身的地址,然后转发给互联网。这样,不同的内网就可以使用同一个内网地址(比如学校和家里都有可能有 192.168.0.233
这个设备),但也不影响它们接入互联网。而如何完成 “重命名” 并避免可能发生的冲突就是 NAT 技术的关键。
二、分类(主要是传统 NAT)
要进一步理解 NAT,首先就是了解 NAT 的分类。RFC2663 把 NAT 分成了四类:传统 NAT、双向 NAT、两次 NAT、多宿主 NAT。由于最常见的就是传统 NAT,所以我就偷个懒,只介绍传统 NAT 了。