NAT:让很多主机共享少量公网地址
更新时间:2026-09-17。网络协议域·网络层(实现常在路由器/防火墙的连接跟踪里)。它与四层转发、conntrack 紧密相关,L4 负载均衡见 L4/L7 负载均衡、ipvsadm。
IPv4 地址有限,家庭/公司内部用的是私有网段(10/8、172.16/12、192.168/16),这些地址不能在公网路由。NAT(Network Address Translation,网络地址转换) 在边界路由器/防火墙上改写 IP 包头(通常还有端口),让一批内网主机共享少量公网 IP 通信,同时也带来了"公网不能主动连入内网"等副作用。
一、SNAT 与 DNAT:改写源还是目的
| 类型 | 改什么 | 方向/用途 |
|---|---|---|
| SNAT(Source NAT,源地址转换) | 出方向改写源 IP/端口 | 内网多主机共享公网 IP 上网(最常见) |
| DNAT(Destination NAT,目的地址转换) | 入方向改写目的 IP/端口 | 端口映射:把公网 IP:端口转到内网某台服务器;负载均衡 |
| PAT/NAPT | 同时改 IP+端口,靠端口区分多条流 | SNAT 的主流实现,多主机/多连接复用一个公网 IP |
SNAT/PAT 上网过程:
内网主机 192.168.1.10:5000 ---> NAT 网关(公网 203.0.113.1)
网关改写为 203.0.113.1:40001 并记录映射表 -> 公网服务器
公网服务器回 203.0.113.1:40001 -> 网关查表 -> 改回 192.168.1.10:5000
另一台主机 192.168.1.11:5000 可复用同一公网 IP,只是端口不同(40002)这张"五元组→内网主机"的映射就是 conntrack/NAT 表项,有空闲超时(UDP 短、TCP 按状态)。
DNAT 端口映射:
公网访问 203.0.113.1:443 --DNAT--> 192.168.1.20:443(内网 web)
Linux 上由 iptables/nftables 的 nat 表 PREROUTING/POSTROUTING 链实现二、为什么 NAT 破坏端到端、影响连接
NAT 是"有状态"的:只有内网先发起、表中存在映射时,回程包才知道转给谁。因此:
- 公网无法主动连入 NAT 后的主机(没有对应表项)——家庭宽带做服务器需要 DNAT 端口转发或内网穿透。
- 表项会老化:长连接若长时间无报文被 NAT 回收,后续对端的包无法送达;应用需要 keepalive/心跳(如 WebSocket、TCP keepalive)维持映射,见 WebSocket 心跳。
- 依赖连接跟踪,海量并发会受 conntrack 表容量限制(
nf_conntrack_max),表满丢包,见网络连接数 FAQ。 - 改写地址+端口可能影响在载荷里携带 IP/端口的协议(FTP active、SIP 等),需要 ALG 辅助。
三、NAT 类型与 P2P 打洞
不同 NAT 的映射策略决定 P2P(音视频、游戏)能否打通:
- Full Cone(全锥):一旦内网用某端口对外,任意外部地址都能经该映射回连——最宽松。
- Restricted Cone/Port-Restricted Cone:限制回连源地址(甚至端口),需内网先向对方发过包。
- Symmetric NAT(对称型):对不同目标分配不同映射端口,最难打洞。
两端各在 NAT 后时,常用 STUN 发现自己的公网映射、用 **UDP 打洞(hole punching)**互相建立映射;打不通时用 TURN 中继。WebRTC 就内建了这套 ICE/STUN/TURN 机制。对称 NAT 比例高会降低直连成功率、更多走中继。
四、Linux 上的实现与观测
# iptables/nftables 的 nat 表:MASQUERADE 是动态出口 IP 的 SNAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-dest 192.168.1.20:80
cat /proc/net/nf_conntrack | head # 当前连接跟踪/NAT 表项
conntrack -L | wc -l # 表项数量
sysctl net.netfilter.nf_conntrack_max # 容量- 大规模出站网关要关注 conntrack 容量、本地端口范围(PAT 复用上限)与超时。
- L4 负载均衡(ipvsadm/LVS、kube-proxy)本质也是一种 DNAT(NAT 模式)或直连(DR/TUN)。
五、CGNAT 与 IPv6
- 运营商侧还可能再套一层 CGNAT(运营商级 NAT),多个家庭共享公网 IP,使端口映射/入站连接和 IP 封禁更麻烦,也促进了 IPv6。
- IPv6 地址空间足够大,设计上不需要 NAT,每设备可端到端直连(NPTv6/NAT66 不是主流),安全边界改由防火墙而非"靠 NAT 隐藏"来保证。注意"NAT 不是安全机制",它只是顺带提供了不可入性。
相关阅读
四层转发见 L4/L7 负载均衡 与 ipvsadm,连接表容量见连接数 FAQ,NAT 上的 MTU 问题见 IP 分片/MTU/MSS,P2P 见 WebSocket。
总结
NAT 在边界改写 IP/端口让内网主机共享公网地址:出方向 SNAT/PAT 靠 conntrack 表项和端口复用来上网、入方向 DNAT 做端口映射;代价是破坏端到端(公网不能主动连入、表项老化需心跳、受 conntrack 容量限制),不同 NAT 映射策略(锥型/对称)决定 STUN/TURN 打洞难度;CGNAT 加剧稀缺而 IPv6 以海量地址从设计上摆脱 NAT。