系列文章: DevOps
  1. 1 API网关是什么?微服务的统一入口点
  2. 2 NAT是什么?计算机网络中的网络地址转换详解
  3. 3 GitLab CI/CD是什么?自动化构建、测试与部署流水线
  4. 4 Apache Kafka是什么?分布式事件流处理平台详解
  5. 5 Serverless是什么?FaaS、冷启动与何时选择无服务器架构
  6. 6 Subnet和CIDR是什么?IP网络分段与现代路由
  7. 7 什么是Kubernetes?当今最流行的容器编排平台
  8. 8 Proxy是什么?正向代理、反向代理与SOCKS5详解
  9. 9 什么是Nginx?集Web服务器、反向代理与负载均衡于一体
✦ 快速摘要
NAT(网络地址转换)是一种让多台设备共用一个公网IP地址的技术。深入了解PAT、静态NAT、动态NAT的工作原理,以及NAT在路由器、云端VPC和Docker中的应用。
这篇文章怎么样?

NAT(网络地址转换)是一种网络技术,让数百万家庭和办公室设备共享单个公网IP地址——这是解决IPv4地址耗尽问题的实际方案。本文解释NAT是什么、PAT的工作机制,以及NAT在家庭路由器、云端VPC和Docker中的应用。

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.10203.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查询时:

  1. 原始数据包离开设备:src=192.168.1.10:52341,dst=8.8.8.8:53
  2. 路由器重写源地址:src=203.0.113.1:40001,dst=8.8.8.8:53
  3. 路由器记录到NAT表192.168.1.10:52341 ↔ 203.0.113.1:40001
  4. DNS响应到达路由器:dst=203.0.113.1:40001
  5. 路由器查找NAT表 → 转发至192.168.1.10:52341

NAT表是有状态的——路由器跟踪每个活动连接。连接结束或超时(UDP通常30秒,TCP建立连接通常120秒)后,条目被删除,端口槽位重新可用。

多台设备可以在内部使用相同的源端口(例如192.168.1.10:52341192.168.1.20:52341)——路由器为每个分配不同的外部端口(4000140002)并分别映射。这是PAT的核心:外部端口号成为唯一的会话标识符。

Linux上使用iptables配置NAT

Linux可以使用iptables作为完整的NAT路由器运行。这种配置常用于家庭实验室、云端网关实例或自托管VPN出口节点:

Bash
 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状态:

Bash
 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规则:

Bash
 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创建的规则:

Bash
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/16172.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示例:

hcl
 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 NATAzure NAT GatewayDigitalOcean 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类型分类(从最宽松到最严格):

  1. 全锥形NAT(Full Cone NAT)——映射建立后,任何外部主机都可以到达内部客户端
  2. 受限锥形NAT(Restricted Cone NAT)——只有客户端曾联系过的主机才能发送入站数据包
  3. 端口受限锥形NAT(Port Restricted Cone NAT)——只有客户端联系过的确切IP:端口才能回复
  4. 对称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兼容性的原因。

Subnet和CIDR是什么?IP网络分段详解

VPN是什么?虚拟专用网络详解

Kubernetes是什么?容器编排详解

常见问题Q&A
NAT是什么?简单来说?
NAT(网络地址转换)是一种让路由器将局域网内设备的私有IP地址转换为单个公网IP地址的技术,用于与互联网通信。这就是为什么数十亿台设备可以连接互联网,尽管IPv4只有约43亿个地址。
PAT和静态NAT有什么区别?
静态NAT是固定的一对一映射:一个私有IP始终对应同一个公网IP——通常用于需要从互联网访问的服务器。PAT(端口地址转换),也称为NAT伪装,通过端口号区分连接,将多个私有IP映射到同一个公网IP——这是家庭路由器和企业路由器中最常见的NAT类型。
NAT会影响网络性能吗?
会,但对现代硬件来说通常可以忽略不计。路由器需要维护NAT转换表并查找每个数据包。NAT真正的挑战在于:(1) P2P/VoIP/游戏需要入站连接,NAT穿透较为复杂;(2) 全锥形NAT与对称NAT的行为差异影响WebRTC;(3) NAT表对同时连接数量有限制。
Docker如何使用NAT?
Docker桥接网络默认使用NAT(iptables MASQUERADE),使容器能够访问互联网。容器从172.17.0.0/16网段获取私有IP。当容器向外发送数据包时,Docker守护进程使用iptables MASQUERADE将容器的源IP替换为Docker宿主机的IP。端口映射(-p 8080:80)会创建DNAT规则,将流量转发到容器。
IPv6还需要NAT吗?
理论上不需要——IPv6拥有340万亿亿亿个地址,足以为地球上每个原子分配一个。然而,NAT66(IPv6的NAT)仍然存在于某些企业部署中,原因是安全需求(隐藏内网拓扑)或ISP只分配了一个小的IPv6前缀。趋势是采用端到端IPv6,无需NAT。
什么是NAT穿透?
NAT穿透是一组技术,用于让两台位于NAT后的设备能够直接连接——因为NAT默认阻止入站连接。常见技术包括:STUN(发现公网IP/端口)、TURN(P2P失败时的中继服务器)和ICE(WebRTC中使用的结合STUN+TURN的框架)。VoIP、WebRTC和点对点游戏都依赖NAT穿透。