NAT 怎么工作:网关上的一本改写账
NAT 的存在是因为 IPv4 地址不够用:一整户、一整间办公室的内网地址(192.168.x.x)要共用一个公网地址。机制是网关保管的一本动态改写账。内网设备往外发包——比如 192.168.0.21 的 51234 端口发往某台服务器——网关把源头改写成自己的公网地址加一个自选端口(99.236.1.10:62001),同时在账上记一行:公网 62001 ↔ 192.168.0.21:51234,对应这个目的地。回包到达 62001 时,查账、改写回去、送进内网。跟收发室加分机号一模一样:外人只看见一个街道地址,收发室知道每件包裹归哪个分机。
一个副作用白送:从外面来的包,账上没有对应行就直接丢掉。没人邀请过的入站流量无处可去——NAT 网关是意外当上的防火墙。
端口是池化资源。 网关按公网 IP、按协议,像从连接池里取连接一样分配和回收端口。分配策略有讲究:顺序分配可猜,所以 prefer 随机;端口保持(内网端口空闲时就沿用)对某些协议友好。运营商级 NAT(CGNAT)下一个公网地址被许多用户共用,端口按每用户一整块发。账行闲置会过期,所以长命的 UDP 流要发保活(WireGuard 的是 25 秒)——发的不是问候,是给自己那行账续命。
四种类型是两个互相独立的行为。 映射行为:同一个内网套接字换个目的地说话,公网端口复用(与端点无关——最友好的情形,旧称全锥),还是按目的地地址换新、按地址+端口换新?过滤行为:账行建好之后,谁能顺着它回来——任何人、只有内网主动联系过的地址、还是只有精确的地址+端口?最 hostile 的角落是对称型 NAT:每个目的地一个新端口,外加最严过滤。
为什么对称型打穿不了洞。 点对点穿透(STUN)的玩法是:各自先探明自己的公网地址+端口,再告诉对方往哪儿发。但对称型下,经 STUN 探到的端口是为 STUN 服务器分配的——真正发给对端时分配的是另一个端口。你广告出去的地址不是能用的地址,直连必然失败,流量只能退到中继。组网 VPN 都要自带中继就是这个原因(Tailscale 的 DERP 是一个例子):中继不是设计本意,是给这种打不穿的 NAT 留的后路。
端口转发是人工的例外:一条手写的永久账行——公网 X 端口永远映射到这台内网设备——用于内网服务没先开口也要能被外面够到的场合。