NAT(网络地址转换)是一种网络技术,让数百万家庭和办公室设备共享单个公网IP地址——这是解决IPv4地址耗尽问题的实际方案。本文解释NAT是什么、PAT的工作机制,以及NAT在家庭路由器、云端VPC和Docker中的应用。
需要企业数据解决方案?
自 2019 年起,AlgoData 为企业提供数据工程、分析与 AI 解决方案。
NAT是什么?

**NAT(Network Address Translation,网络地址转换)**是路由器或防火墙在数据包通过设备时修改数据包头部IP地址的过程。最初目标:允许局域网内的多台设备共享单个公网IP地址与互联网通信。
1996年,IANA预测IPv4地址将会耗尽——他们是对的(实际发生于2011年)。NAT成为"救生筏",通过将私有地址空间与公共互联网隔离,将IPv4的生命周期延长了15年以上。
私有IP地址范围(无法在互联网上路由):
10.0.0.0/8— A类,最多1600万个内网地址172.16.0.0/12— B类,常用于中型企业网络192.168.0.0/16— C类,家庭网络最常见(65,536个地址)
局域网内的设备可以使用这些范围内的任意地址,无需向IANA注册,因为它们永远不会直接出现在公共互联网上——NAT在边界处理地址转换。
NAT的3种主要类型

静态NAT(Static NAT)
一对一固定映射:一个私有IP始终对应同一个固定公网IP。适合需要稳定可达地址的Web服务器和邮件服务器,以便外部客户端可以主动发起连接。
示例:192.168.1.10 ↔ 203.0.113.10(永久、双向)
动态NAT(Dynamic NAT)
路由器维护一个公网IP 地址池,需要时临时分配给设备。设备断开连接后,IP归还地址池。如今较少使用,因为仍需要多个公网IP——无法实现PAT的多对一效率。
PAT — 端口地址转换(NAT伪装)
这是最常见的类型——多个私有IP共享单个公网IP,通过端口号加以区分。在Linux上也称为"IP伪装"(IP Masquerading),在Cisco上称为"NAT超载"(NAT Overload)。
几乎所有家庭路由器和大多数企业路由器都使用PAT。单个公网IP的路由器可以通过在不同源端口号上多路复用连接,同时为数十台设备提供服务。TCP/UDP端口范围从0到65535,每个公网IP有数万个槽位可用。
PAT工作原理详解
当192.168.1.10的计算机向8.8.8.8:53发送DNS查询时:
- 原始数据包离开设备:src=
192.168.1.10:52341,dst=8.8.8.8:53 - 路由器重写源地址:src=
203.0.113.1:40001,dst=8.8.8.8:53 - 路由器记录到NAT表:
192.168.1.10:52341 ↔ 203.0.113.1:40001 - DNS响应到达路由器:dst=
203.0.113.1:40001 - 路由器查找NAT表 → 转发至
192.168.1.10:52341
NAT表是有状态的——路由器跟踪每个活动连接。连接结束或超时(UDP通常30秒,TCP建立连接通常120秒)后,条目被删除,端口槽位重新可用。
多台设备可以在内部使用相同的源端口(例如192.168.1.10:52341和192.168.1.20:52341)——路由器为每个分配不同的外部端口(40001和40002)并分别映射。这是PAT的核心:外部端口号成为唯一的会话标识符。
Linux上使用iptables配置NAT
Linux可以使用iptables作为完整的NAT路由器运行。这种配置常用于家庭实验室、云端网关实例或自托管VPN出口节点:
1# 启用IP转发(允许Linux在接口之间转发数据包)
2echo 1 > /proc/sys/net/ipv4/ip_forward
3
4# 通过sysctl持久化配置(重启后生效)
5echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
6sysctl -p
7
8# NAT伪装:内网所有流量通过eth0出口
9iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
10
11# 端口转发(DNAT):将外部8080端口路由到内部192.168.1.10:80
12iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 \
13 -j DNAT --to-destination 192.168.1.10:80
14iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT
15
16# 持久化规则(重启后保留)
17iptables-save > /etc/iptables/rules.v4
查看当前NAT状态:
1# 查看连接跟踪表(所有活动NAT映射)
2conntrack -L
3# 或直接从内核读取
4cat /proc/net/nf_conntrack
5
6# 查看所有iptables NAT规则
7iptables -t nat -L -n -v
8
9# 统计活动NAT条目数量
10conntrack -L | wc -l
conntrack命令显示每个被跟踪的活动会话,包括协议、状态、超时时间以及原始/回复地址元组。这是可以在运行中的Linux路由器上实时检查的NAT表。
Docker中的NAT
Docker在bridge网络中启动容器时会自动创建NAT规则:
1# 检查Docker默认bridge网络
2docker network inspect bridge
3
4# 查看Docker创建的iptables NAT规则
5sudo iptables -t nat -L DOCKER -n -v
6
7# 端口映射(-p 8080:80)自动创建DNAT规则
8docker run -p 8080:80 nginx
9# 等效于:
10# iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to 172.17.0.2:80
bridge网络中的容器默认从172.17.0.0/16范围获取IP。当容器向外发送流量时,Docker宿主机执行MASQUERADE——将容器IP替换为宿主机IP。发布端口的入站流量通过DNAT直接转发到容器的私有IP和端口。
检查Docker创建的规则:
1# 查看POSTROUTING链中的所有NAT规则(包括Docker MASQUERADE)
2sudo iptables -t nat -L POSTROUTING -n -v
3
4# 查看通过Docker NAT的活动连接
5sudo conntrack -L | grep 172.17
使用docker network create创建的自定义Docker网络也默认使用NAT,但子网不同(如172.18.0.0/16、172.19.0.0/16)。这使不同网络上的容器可以相互隔离,同时仍共享宿主机的公网IP进行出站流量。
云端NAT(AWS VPC)

AWS VPC使用**NAT网关(NAT Gateway)**让私有子网资源无需公网IP即可访问互联网:
流量路径: 私有子网EC2 → NAT Gateway(位于公有子网)→ Internet Gateway → 互联网
AWS NAT Gateway特点:
- 绑定弹性IP(静态公网IP)——便于与第三方服务进行IP白名单配置
- 全托管服务——AWS自动扩展,无需运维
- 按小时计费(约$0.045/小时)加数据处理费(约$0.045/GB)
- 可用区级别——为保证高可用性,需在每个可用区部署一个NAT Gateway
Terraform示例:
1resource "aws_eip" "nat" {
2 domain = "vpc"
3}
4
5resource "aws_nat_gateway" "main" {
6 allocation_id = aws_eip.nat.id
7 subnet_id = aws_subnet.public.id
8
9 tags = {
10 Name = "main-nat-gateway"
11 }
12}
13
14resource "aws_route" "private_internet" {
15 route_table_id = aws_route_table.private.id
16 destination_cidr_block = "0.0.0.0/0"
17 nat_gateway_id = aws_nat_gateway.main.id
18}
其他云服务提供商也有类似服务:Google Cloud NAT、Azure NAT Gateway和DigitalOcean NAT Gateway均基于相同原理运作——为需要出站互联网访问但不暴露入站连接的私有资源提供托管NAT。
NAT的问题:NAT穿透
NAT阻断入站连接——外部主机无法主动连接到NAT后的设备,因为没有方法访问私有IP。这在实际应用中带来了挑战:
- VoIP和视频通话:WebRTC需要低延迟的直接P2P连接。解决方案:STUN(发现公网IP/端口)、TURN(P2P失败时中继流量)和ICE(按优先级尝试所有候选路径的框架)
- P2P游戏:NAT后的游戏主机需要"打洞"(hole punching)——双方同时向对方发送数据包,在对方的数据包到达之前在NAT表中打开条目
- 自托管服务器:需要在路由器配置中进行端口转发,或使用VPN反向隧道(Cloudflare Tunnel、ngrok、Tailscale funnel)完全绕过NAT
- 对称NAT(Symmetric NAT):最严格的NAT类型——为每个目标分配不同的外部端口,使基于STUN的P2P不可靠。WebRTC将回退到TURN中继,增加延迟和服务器成本
NAT类型分类(从最宽松到最严格):
- 全锥形NAT(Full Cone NAT)——映射建立后,任何外部主机都可以到达内部客户端
- 受限锥形NAT(Restricted Cone NAT)——只有客户端曾联系过的主机才能发送入站数据包
- 端口受限锥形NAT(Port Restricted Cone NAT)——只有客户端联系过的确切IP:端口才能回复
- 对称NAT(Symmetric NAT)——每个目标使用不同的外部端口;单独使用STUN不够
NAT64:连接IPv4与IPv6
随着互联网向IPv6过渡,NAT64允许纯IPv6客户端访问纯IPv4服务器:
- IPv6客户端 → NAT64网关 → IPv4服务器
- NAT64网关在边界将IPv6数据包转换为IPv4,反之亦然
- 结合DNS64使用,为纯IPv4域名合成IPv6地址,使客户端无需了解底层IPv4基础设施
NAT64正越来越多地被移动运营商和企业网络部署,这些网络内部已迁移到纯IPv6,但仍需访问传统IPv4服务。苹果要求iOS应用在NAT64环境中正常运行,这也是应用开发者必须测试IPv6兼容性的原因。

