前言
随着 Internet 的发展和网络应用的增多,有限的 IPv4 公有地址已经成为制约网络发展的瓶颈。为解决这个问题,NAT(Network Address Translation,网络地址转换)技术应需而生。NAT 技术主要用于实现内部网络的主机访问外部网络。一方面 NAT 缓解了 IPv4 地址短缺的问题,另一方面 NAT 技术让外网无法直接与使用私有地址的内网进行通信,提升了内网的安全性。
这篇文章按数据通信的学习脉络,把 NAT 的产生背景、四种常见实现方式(静态 NAT、动态 NAT、NAPT/Easy IP、NAT Server)以及它们在报文转发过程中的地址变化讲清楚,最后落到华为设备的配置和验证命令。
NAT概述
NAT产生背景
随着互联网用户的增多,IPv4 的公有地址资源显得越发短缺。同时 IPv4 公有地址资源存在地址分配不均的问题,这导致部分地区的 IPv4 可用公有地址严重不足。为解决该问题,使用过渡技术解决 IPv4 公有地址短缺就显得尤为必要。
IPv6 是最终的解决方案,但网络改造需要漫长的周期。在过渡期内,业界用了两类手段:一类是让更多主机共享少量公网地址(NAT、NAPT、CGNAT),另一类是让私有网络之间能直接通信(各种隧道和打洞技术)。NAT 属于前者,成本最低、部署最广,几乎每一台家用路由器的 WAN 口都在跑它。
私网IP地址
公有地址:由专门的机构管理、分配,可以在 Internet 上直接通信的 IP 地址。私有地址:组织和个人可以任意使用,无法在 Internet 上直接通信,只能在内网使用的 IP 地址。A、B、C 类地址中各预留了一些地址专门作为私有 IP 地址(RFC 1918):
- A 类:10.0.0.0 ~ 10.255.255.255(10.0.0.0/8,约 1677 万个地址)
- B 类:172.16.0.0 ~ 172.31.255.255(172.16.0.0/12,约 104 万个地址)
- C 类:192.168.0.0 ~ 192.168.255.255(192.168.0.0/16,约 6.5 万个地址)
这些地址不会出现在公网路由表中,任何一台路由器收到目的地址为私有地址的报文都会直接丢弃。因此内网主机想访问 Internet,必须在出口处把私有地址换成公有地址,这正是 NAT 要解决的问题。
另外还有一个容易混淆的地址段:100.64.0.0/10(RFC 6598),它是运营商级 NAT(CGNAT)专用的共享地址空间。家宽用户拿到的“不是公网 IP 的 IP”,很多时候就是这一段,它的地位介于私有地址和公有地址之间。
NAT技术原理
NAT:对 IP 数据报文中的 IP 地址进行转换,是一种在现网中被广泛部署的技术,一般部署在网络出口设备,例如路由器或防火墙上。NAT 的典型应用场景:在私有网络内部(园区、家庭)使用私有地址,出口设备部署 NAT,对于“从内到外”的流量,网络设备通过 NAT 将数据包的源地址进行转换(转换成特定的公有地址),而对于“从外到内”的流量,则对数据包的目的地址进行转换。通过私有地址的使用结合 NAT 技术,可以有效节约公网 IPv4 地址。

结合上图,一次完整的访问里地址是这样变化的:
- PC(192.168.1.10)发出请求:源 IP 192.168.1.10,目的 IP 200.1.2.3。
- 报文到达出口设备,NAT 把源地址替换为公网地址 122.1.2.1:源 IP 122.1.2.1,目的 IP 200.1.2.3,同时在设备上留下一条映射记录。
- Web 服务器回包:源 IP 200.1.2.3,目的 IP 122.1.2.1。
- 报文回到出口设备,NAT 按映射记录把目的地址还原成 192.168.1.10:源 IP 200.1.2.3,目的 IP 192.168.1.10,PC 收到响应。
可以看到,NAT 设备必须保存“私有地址 ↔ 公有地址”的映射关系,否则回程报文无法还原。映射关系怎么建立、建立后怎么回收、是否复用端口,就区分出了后面几种不同的 NAT 类型。
NAT的类型
按映射关系的建立方式和转换粒度,现网常见的 NAT 可以分成下面几类:
| 类型 | 映射关系 | 是否转换端口 | 是否需要地址池 | 典型用途 |
|---|---|---|---|---|
| 静态 NAT | 私有地址 ↔ 公有地址一对一,固定不变 | 否 | 否(直接指定公网地址) | 内网服务器需要固定公网地址发布 |
| 动态 NAT(No-PAT) | 从地址池临时分配,一对一 | 否 | 是 | 少量主机临时上网,公网地址不紧张 |
| NAPT | 地址 + 端口一起转换,一对多 | 是 | 是 | 大量主机共享少量公网地址 |
| Easy IP | 地址 + 端口一起转换,一对多 | 是 | 否(直接用接口地址) | PPPoE、DHCP 等动态获取公网地址的出口 |
| NAT Server | 公有地址:端口 ↔ 私有地址:端口,固定 | 是 | 否 | 把内网服务器发布到公网 |
静态NAT
静态NAT原理
静态 NAT:每个私有地址都有一个与之对应并且固定的公有地址,即私有地址和公有地址之间的关系是一对一映射。
支持双向互访:私有地址访问 Internet 经过出口设备 NAT 转换时,会被转换成对应的公有地址。同时,外部网络访问内部网络时,其报文中携带的公有地址(目的地址)也会被 NAT 设备转换成对应的私有地址。

因为映射是提前写死的,静态 NAT 不需要地址池、也不做端口转换,一条映射长期占用一个公网地址,好处是外网可以随时主动访问这台内网主机,坏处是地址利用率最低——内网主机长期在线与否,公网地址都被占着。
静态NAT转换示例

例中内网的 192.168.1.1、192.168.1.2、192.168.1.3 分别固定映射到 122.1.2.1、122.1.2.2、122.1.2.3,两个方向都能走通:
- 出方向:192.168.1.1 访问 200.1.2.3,出口设备把源地址改成 122.1.2.1,服务器看到的是 122.1.2.1。
- 入方向:外网主机 202.1.2.3 主动访问 122.1.2.3,出口设备按映射把目的地址改成 192.168.1.3;192.168.1.3 回包时源地址再被改回 122.1.2.3,外网主机全程只看到公网地址。
静态NAT配置介绍
1.方式一:接口视图下配置静态 NAT
[Huawei-GigabitEthernet0/0/0] nat static global 122.1.2.1 inside 192.168.1.1
2.方式二:系统视图下配置静态 NAT
[Huawei] nat static global 122.1.2.1 inside 192.168.1.1
命令格式是 nat static global { global-address } inside { host-address },global 后面是公网地址,inside 后面是内网主机地址。两种视图下配置命令相同,区别在于:在系统视图下配置后,还需要在具体的接口下开启静态 NAT 功能。
[Huawei-GigabitEthernet0/0/0] nat static enable
配置完成后用 display nat static 查看静态 NAT 映射是否生效。
动态NAT
动态NAT原理
动态 NAT:静态 NAT 严格地一对一进行地址映射,这就导致即便内网主机长时间离线或者不发送数据时,与之对应的公有地址也处于使用状态。为了避免地址浪费,动态 NAT 提出了地址池的概念:所有可用的公有地址组成地址池。当内部主机访问外部网络时临时分配一个地址池中未使用的地址,并将该地址标记为“In Use”。当该主机不再访问外部网络时回收分配的地址,重新标记为“Not Use”。

需要注意的是,这种“只换地址、不换端口”的做法叫 No-PAT(No-Port Address Translation,非端口地址转换),地址池里有多少个地址,同时最多就只能有这么多台主机上网,公网地址利用率仍然不高。要突破这个限制,就要靠下面的 NAPT。
动态NAT转换示例(一):地址池与映射表

例中有三个可用的公网地址 122.1.2.1 ~ 122.1.2.3。192.168.1.1 发起访问时,设备发现 122.1.2.1 已被占用(In Use),于是从池中挑一个空闲的 122.1.2.2(Not Use),把它标记为 In Use,并生成一条临时映射表项,此后这台主机发出的报文源地址都换成 122.1.2.2。
动态NAT转换示例(二):回程报文的转换

回程方向正好相反:Web 服务器把响应发给 122.1.2.2,设备在映射表中匹配到这条记录,把目的地址还原成 192.168.1.1 再送进内网。整个过程中,外网始终只能看到 122.1.2.2,看不到内网的真实地址。
动态NAT配置介绍
1.创建地址池,配置公有地址范围,其中 group-index 为地址池编号,start-address、end-address 分别为地址池起始地址、结束地址。
[Huawei] nat address-group 1 122.1.2.1 122.1.2.3
2.配置地址转换的 ACL 规则,配置基础 ACL,匹配需要进行动态转换的源地址范围。
[Huawei] acl number 2000
[Huawei-acl-basic-2000] rule permit source 192.168.1.0 0.0.0.255
3.接口视图下配置带地址池的 NAT Outbound,接口下关联 ACL 与地址池进行动态地址转换,no-pat 参数指定不进行端口转换。
[Huawei-GigabitEthernet0/0/0] nat outbound 2000 address-group 1 [ no-pat ]
带上 no-pat 就是本文这一节的动态 NAT(1:1);去掉 no-pat 就变成 NAPT(1:n)。配置完成后可用 display nat address-group、display nat outbound 和 display nat session all 查看地址池、NAT 策略和当前会话表。
NAPT与Easy IP
NAPT原理
动态 NAT 选择地址池中的地址进行地址转换时不会转换端口号,即 No-PAT(No-Port Address Translation,非端口地址转换),公有地址与私有地址还是 1:1 的映射关系,无法提高公有地址利用率。NAPT(Network Address and Port Translation,网络地址端口转换):从地址池中选择地址进行地址转换时不仅转换 IP 地址,同时也会对端口号进行转换,从而实现公有地址与私有地址的 1:n 映射,可以有效提高公有地址利用率。

从上面的映射表可以看出,NAPT 记录的映射项是“地址 + 端口”,而不是单独的地址,所以同一个公网地址能同时被多台主机使用:
| 私有地址:端口 | 公有地址:端口 | 说明 |
|---|---|---|
| 192.168.1.1:10321 | 122.1.2.2:1025 | 同一公网地址的不同端口,互不冲突 |
| 192.168.1.2:17087 | 122.1.2.2:1026 | 端口号由 NAT 设备重新分配 |
正因为把端口也纳入了转换范围,同一个公网地址理论上能承载数万个并发会话(公网端口约 6.4 万个)。一台家用路由器拿到一个公网地址,就能让家里所有设备同时上网——这也是现网 NAT 部署量最大的形态。
Easy IP
Easy IP:实现原理和 NAPT 相同,同时转换 IP 地址、传输层端口,区别在于 Easy IP 没有地址池的概念,使用接口地址作为 NAT 转换的公有地址。Easy IP 适用于不具备固定公网 IP 地址的场景:如通过 DHCP、PPPoE 拨号获取地址的私有网络出口,可以直接使用获取到的动态地址进行转换。

配置上只差一个参数:不写 address-group 就是 Easy IP,出口接口的地址变了,转换地址自动跟着变,不用改配置。
[Huawei-GigabitEthernet0/0/0] nat outbound 2000
NAT Server
NAT Server使用场景
NAT Server:指定[公有地址:端口]与[私有地址:端口]的一对一映射关系,将内网服务器映射到公网,当私有网络中的服务器需要对公网提供服务时使用。外网主机主动访问[公有地址:端口]实现对内网服务器的访问。

它解决的是 NAT 的“单向性”问题:NAPT 只允许内网主动访问外网,外网想访问内网服务器时,NAT 设备上并没有对应的映射表项,报文会被丢弃。NAT Server 相当于手工预置一条固定的映射项,让外网的请求也能进得来。
NAT Server转换示例

例中内网 Web 服务器是 192.168.1.10,对外发布为 122.1.2.1:80,一次访问的地址变化是:
- 外网主机 200.1.2.3 以随机源端口 47819 发起访问:源 200.1.2.3:47819,目的 122.1.2.1:80。
- 出口设备按 NAT Server 映射把目的地址、端口改成 192.168.1.10:80:源 200.1.2.3:47819,目的 192.168.1.10:80。
- 服务器回包:源 192.168.1.10:80,目的 200.1.2.3:47819。
- 出口设备按同一张映射表反向转换:源 122.1.2.1:80,目的 200.1.2.3:47819,外网主机看到的服务地址始终是公网地址。
NAT Server配置介绍
1.把内网服务器的全部端口映射到公网地址(一对一)
[Huawei-GigabitEthernet0/0/0] nat server global 122.1.2.1 inside 192.168.1.10
2.只映射指定协议和端口(推荐,安全面更小)
[Huawei-GigabitEthernet0/0/0] nat server protocol tcp global 122.1.2.1 80 inside 192.168.1.10 80
3.出口地址是动态获取的,可以用 current-interface 直接引用接口地址,并把公网端口换成非 80 端口
[Huawei-GigabitEthernet0/0/0] nat server protocol tcp global current-interface 8080 inside 192.168.1.10 80
配置完成后用 display nat server 查看映射关系。要注意的是,NAT Server 只是把端口暴露出去,真正的访问控制还要靠安全策略或 ACL 来做,不要图省事把整台服务器的所有端口都映射到公网。
NAT的局限
NAT 解决了地址短缺,但它是用“破坏端到端透明性”换来的,随之而来的问题在实际排障中很常见:
- 外网不能主动访问内网:没有映射表项就没有回程路径,必须借助 NAT Server 或打洞技术。
- 上层协议感知不到真实地址:FTP、SIP 这类把 IP 写在载荷里的协议需要 ALG 配合,否则会协商失败。
- P2P 与游戏联机受限:端口被复用、映射随时回收,直连成功率取决于 NAT 类型(对称型 NAT 尤其难打洞)。
- 排障更复杂:出现问题时要在 NAT 设备上查会话表,确认映射是否建立、是否老化。
- 消耗设备资源:每条会话都要占内存,地址池和会话数有限,大流量场景要关注规格上限。
小结
把上面的内容收一下,NAT 的几种形态其实只回答两个问题:映射关系怎么建、转换换算不算端口。
- 静态 NAT:手工写死一对一映射,不算端口,双向都能访问,适合固定发布的服务器。
- 动态 NAT:从地址池临时分配,不算端口,仍是 1:1,池子多大就最多几台主机上网。
- NAPT:地址 + 端口一起换,1:n,一个公网地址能带很多主机,是现网的主力形态。
- Easy IP:NAPT 的简化版,直接用接口地址,适合 PPPoE/DHCP 动态出口。
- NAT Server:反向的固定映射,把内网服务器发布到公网。
理解了这几种转换在报文里的地址变化,再去看 NAT 类型探测、端口映射、P2P 打洞这些话题,思路会清楚很多。
如果你觉得这篇文章不错,有用的话可以点击下面的“赞赏”支持作者,你的支持是我更新的动力(饿饿吃饭)。


Comments NOTHING