NAT是网络地址转换(Network Address Translation)的缩写。通俗的理解就是将网络数据包从一个地址转换为另外一个,转换的过程中保持数据包的实际数据(payload)保持不变。如果将源地址进行转换则称为SNAT(source NAT);转换目标地址则是DNAT(Destination NAT);如果同时转换目标地址和源地址则称为Twice NAT。
不同的NAT有不同的使用场景。在目前的网络环境中,NAT几乎已经无处不在,尤其是SNAT。以现在我所处的家庭宽带环境为例说明一下NAT的强大存在。我所用的电脑IP地址是10.0.1.4,登陆到接入路由器上显示获得的IP地址是10.64.93.240。为了清晰了解数据包的来龙去脉,使用traceroute工具观察本地到114.114.114.114经过哪些网络节点:
1 | traceroute to 114.114.114.114 (114.114.114.114), 64 hops max, 52 byte packets |
从上面的输出可以清晰看出:假如本地要向地址114.114.114.114通讯,需要经过一系列节点。其中1、2、3都是家里的路由器。为什么用3个路由器其实也很无奈。电信提供的那个光纤拨号的设备本身具有路由功能,但是只有两个网口,Wi-Fi信号很差并且没有5G频段。所以就把之前不用的旧四口路由器拿了过来,但这个路由器又不能工作在桥接模式。这两台路由器都在客厅,就拉了一根网线到房间,房间有另外一个路由器,所以就有了3个路由器。每次经过路由器都要进行一次NAT。
第四跳的地址是100.64.0.1,这是一个比较特殊的保留地址。100.64.0.0/10网段被用作网络运行商NAT地址段,范围从100.64.0.0~100.127.255.255,共计4,194,304个IP地址。这个地址段被运营商视作内网,因此拨号分配到的地址是10.64.93.240。所以经过100.64.0.1时也需要做一次NAT。
为了知道真正的公网地址,可以访问诸如http://ipip.net http://ip.cn http://ip138.com 之类网站。显示的结果是202.97.40.110。因此发送到114.114.114.114的数据包至少要进行5次NAT。三次在家庭路由器,一次在100.64.0.1, 一次在202.97.40.110。第5跳和第6跳有没有NAT比较难以判断。
由于IPv4地址匮乏,NAT非常普遍。除了一些具有公网地址的服务器,其他设备进行网络连接都要进行几次转换。这些设备包括通常的家庭网络设备、手机、公司内网设备等。如果一个设备的地址是192.168.x.x, 10.x.x.x几乎可以断定是通过NAT联网。SNAT很大程度上缓解了IPv4地址紧缺的困境,所以SNAT应用最为广泛。