什么是NAT
网络地址转换(英语:Network Address Translation,缩写:NAT),是一种在IP数据包通过路由器或防火墙时重写源/目的 IP 的技术。在常见家用场景中,它也会连同端口一起转换。该技术普遍应用于有多台主机,但只通过一个公有IP地址访问互联网的私有网络中。
NAT像一个网络中介,在发送方和接收方之间进行地址转换,从外部网络视角来看,达成了隐藏网络地址、节约IPV4地址资源的效果,同时却违背了计算机网络中的端到端原则,使得一些内网部署的服务难以被公网主动访问(默认缺乏可达路径/入站映射)。
NAT是如何工作的
我们以家庭局域网举例来说,典型的家庭网络是一个以路由器为中心的星型网络拓扑结构,路由器/家庭网关进行分组转发、路由选择;而作为网络层设备,通常还会进行包过滤/状态检测,从而体现出对入站/出站流量的控制。
地址与端口映射(Mapping)
在明确了家庭网络结构后,我们来模拟一次上网行为的完整过程:
家用电脑浏览器访问某个网站,浏览器会让系统分配临时端口用来发送和接收数据。
这一过程中我们做出如下假设:
浏览器将网页访问请求从本机192.168.1.2的5555端口发向网关192.168.1.1,路由器拿到请求后会寻找一个未被占用的外部端口,来向22.22.22.22:80发送请求。
在这一过程中,假设路由器的公网 IP 是 33.33.33.33,并分配了外部端口 9999,那么公网侧看到的请求就是从 33.33.33.33:9999 发往 22.22.22.22:80。服务器响应时,回包方向为 22.22.22.22:80 → 33.33.33.33:9999。路由器收到回包后查映射表,将目的地址/端口还原为 192.168.1.2:5555,再转发给内网主机。这个“改写 + 记表 + 还原转发”的过程,就是 NAT 映射。
到这里我们解释了“出站时地址/端口如何被改写”。但问题来了:路由器怎么知道回包该转发给谁?外网能不能随便打进来?这就涉及连接状态与过滤。
连接状态与过滤(State & Filtering)
在前面的例子中,路由器在进行 NAT 映射的同时,会维护一张映射/会话表,用来记录“谁和谁建立了通信关系”。示意如下:
当路由器收到来自 22.22.22.22:80 → 33.33.33.33:9999 的回包时,会查表命中这条记录,从而将目的地址/端口还原为 192.168.1.2:5555 并转发到内网主机。
与此同时,路由器通常也会基于这张表实施入站过滤:只允许“与既有会话相关”的入站回包进入,而对“没有对应状态的陌生入站连接”默认丢弃。正因如此,我们日常从内网主动访问外网几乎总是正常,但从公网主动访问内网服务则经常需要额外配置(例如端口映射等)。
不同 NAT 类型(Full Cone、Restricted、Port-Restricted、Symmetric)的区别,本质上就体现在两点:映射记录如何建立,以及入站过滤条件严格到什么程度。
NAT的类型:从机制推导分类
入站过滤场景讨论
以上文场景为例,假定路由器收到来自22.22.22.22的回包,但来自90端口,而路由器映射表中记录了22.22.22.22:80的远端端点。
入站端口无法命中,数据包随即被丢弃,就是地址和端口相关过滤(Address and Port-Dependent Filtering)。
如果只根据远端IP来决定是否放行,而不关注远端端口,就是地址相关过滤(Address-Dependent Filtering)。
如果只要映射记录(会话)还存在,就放行全部的远端端点的数据包进入,就是端点无关过滤(Endpoint-Independent Filtering)。
出站映射场景讨论
同样以上文场景为例,假设我们的同一主机需要访问另一站点,假定远端端点为44.44.44.44:80 。而映射表中已经有一条关于主机的映射记录(见上文表格)。
在这种情况下仍复用先前映射关系,即为仍使用公网端点33.33.33.33:9999 去访问目标远端端点,映射表新增一条记录,如下图所示:
这条映射记录中的公网端点是由访问22.22.22.22:80创建的,但在访问44.44.44.44:80 上同样适用。
这种映射行为叫做端点无关映射(Endpoint-Independent Mapping)。
假设主机在对新的远端端点(IP/端口和以往不同)44.44.44.44:8888访问时,映射表新增一条记录,如下图所示:
只要访问的目标IP/端口与以往不同,就使用新的空闲端口开一条映射规则。
这种映射行为叫做地址和端口相关映射(Address and Port-Dependent Mapping)。
除此之外还有一种映射行为,它只关注远端地址而不关注远端端口,表现为允许同一远端地址的不同端口向主机同一公网端点发送数据,即为即使访问的远端端口不同,只要为同一远端地址就不会创建新的映射规则。
这种映射行为叫做地址相关映射(Address-Dependent Mapping)。
NAT的出站映射行为和入站过滤行为共同决定了网络属于何种NAT类型
NAT网络类型

不同 NAT 类型(Full Cone、Restricted Cone、Port-Restricted Cone、Symmetric)可以视为“出站映射行为 + 入站过滤行为”的典型组合。在多数 NAT 类型检测工具(如 RFC 3489/5780 语境)中,常见对应关系如下:
Full Cone NAT(全锥形 NAT)
出站映射:通常表现为 端点无关映射(Endpoint-Independent Mapping, EIM)。同一内网端点建立的公网端点可以被复用到不同远端端点。
入站过滤:通常表现为 端点无关过滤(Endpoint-Independent Filtering, EIF)。只要映射存在,任意外部端点向该公网端点发送入站数据包都可能被放行并转发至内网端点。
直观特征:最“开放”。一旦内网主机先对外发包建立映射,外部就更容易“打进来”。
Restricted Cone NAT(受限锥形 NAT)
出站映射:通常为 EIM。
入站过滤:通常为 地址相关过滤(Address-Dependent Filtering, ADF)。仅允许来自“内网主机曾发送过数据的远端 IP”的入站数据包通过;远端端口变化通常不作为过滤条件。
直观特征:外部必须是“你联系过的那个 IP”才能进来,但端口是否一致一般不要求。
Port-Restricted Cone NAT(端口受限锥形 NAT)
出站映射:通常为 EIM。
入站过滤:通常为 地址与端口相关过滤(Address and Port-Dependent Filtering, APDF)。只有来自“内网主机曾发送过数据的远端 IP + 端口”的入站数据包才会被放行。
直观特征:比 Restricted 更严格:不仅要求对方是那个 IP,还要求是那个端口。
Symmetric NAT(对称 NAT)
出站映射:典型特征是 地址与端口相关映射(Address and Port-Dependent Mapping, APDM)。同一内网端点在访问不同远端端点时,往往会分配不同的公网端点(不同的公网端口)。
入站过滤:通常也更严格,常见表现为 APDF(或至少不弱于 ADF)。
直观特征:最“不稳定/难预测”。由于“针对不同远端建立不同公网端点”,外部很难复用已有映射进行入站通信,这也是对称 NAT 场景下穿透更困难的根源之一。
CGNAT:为什么你拿不到公网 IP
电信级NAT或运营商级NAT(Carrier-grade NAT,缩写为CGNAT或CGN),也称大规模NAT(large-scale NAT,缩写LSN),是运营商为了缓解IPv4地址枯竭问题,向客户分配私网IPv4地址而非公网地址,并通过自身的中间件完成的网络地址转换(NAT)操作。电信级NAT可以让更多的终端设备共享一个公共地址。
———摘自 维基百科《电信级NAT》
CGNAT = 运营商在你家路由器外面再做一层大规模 NAT(也叫 LSN),让很多用户共享少量公网 IPv4。
通俗来讲就是运营商的大内网,无法从公共互联网直接访问。
与此同时,你也无法决定他的出/入站控制行为,一切取决于运营商的网络配置,普遍见于家庭网络。
这里要补充这一概念,因为这是日后实际操作中不可避免的一部分。这里仅作了解,不过多赘述。
总结
了解 NAT 的相关机制,将为我们日后部署各类网络服务打下坚实的通信基础。同时,它也为理解端口映射、内网穿透以及 P2P 通信等实践活动提供支撑。
评论