网络地址转换(NAT,Network Address Translation)


顾名思义,本章将告诉你如何让私有IP上网。


众所周知,IPv4地址已经不够用了。NAT就是为了解决这个问题而生的——它能让一群设备共享一个公网IP上网。

当你捣鼓你的路由器的时候一般上行都会连一台家用路由器。而家用路由器绝大多数都没法设置静态路由或者接收动态路由表。它们只是为NAT而生的,也只会NAT。怎么办?那我们也NAT。

和之前一样,思科和华为/华三的命令体系完全不同。请参照下表:


⚠️ 第一步:确认接口角色

配置NAT之前,必须搞清楚哪个接口是"内网",哪个接口是"外网":

💡 小贴士:实在分不清的话,记住"私网侧是里面是inside,公网侧是外面是outside"就行。


进入接口配置

确认好角色后,进入接口指定NAT角色:

厂商指定内网口指定外网口
思科ip nat insideip nat outside
华为nat insidenat outside
华三nat insidenat outside

NAT的三种实现方式

1. 静态NAT(Static NAT)

一个内网IP对应一个固定公网IP,常用于对外发布服务器

厂商配置命令
思科ip nat inside source static [内网IP] [公网IP]
华为nat static global [公网IP] inside [内网IP]
华三nat static global [公网IP] inside [内网IP]

2. 动态NAT(Dynamic NAT)

内网IP从公网IP池里临时借一个用,用完归还,不常用

厂商配置步骤
思科1. ip nat pool [池名] [起始IP] [结束IP] netmask [掩码]
2. access-list [号] permit [内网网段] [反掩码]
3. ip nat inside source list [号] pool [池名]
华为/华三1. nat address-group [组号] [起始IP] [结束IP]
2. acl [号] permit [内网网段] [通配符]
3. nat outbound [号] address-group [组号]

3. PAT/NAPT(Port Address Translation)

最常用的上网方式:所有内网IP共享一个公网IP,通过端口号区分不同连接

厂商配置命令
思科ip nat inside source list [号] interface [外网口] overload
华为nat outbound [号] address-group [组号](不加组号就是出接口)
华三nat outbound [号]

🚀 重点掌握:家庭和企业宽带上网用的就是PAT,也叫"端口复用"或"多对一NAT"。


⚠️ 第二步:确认哪个流量需要NAT

需要告诉设备:哪些内网IP允许上网。通常用ACL(访问控制列表)来定义:

厂商定义允许上网的流量
思科access-list 1 permit 192.168.1.0 0.0.0.255
华为acl 2000 rule permit source 192.168.1.0 0.0.0.255
华三acl basic 2000 rule permit source 192.168.1.0 0.0.0.255

⚠️ 注意:思科用的是反掩码(0.0.0.255),华为/华三用的也是反掩码(通配符),千万别写成255.255.255.0! 其实写错了也没关系,会有提示告诉你的。


完整配置示例

场景:让内网 192.168.1.0/24 通过外网口 G0/1 上网

思科 (Cisco)

R-Center# configure terminal
R-Center(config)# interface GigabitEthernet0/0      # 内网口
R-Center(config-if)# ip nat inside
R-Center(config-if)# exit
R-Center(config)# interface GigabitEthernet0/1      # 外网口
R-Center(config-if)# ip nat outside
R-Center(config-if)# exit
R-Center(config)# access-list 1 permit 192.168.1.0 0.0.0.255
R-Center(config)# ip nat inside source list 1 interface GigabitEthernet0/1 overload
R-Center(config)# end

华为 (Huawei)

<R-Center> system-view
[R-Center] interface GigabitEthernet0/0/0           # 内网口
[R-Center-GigabitEthernet0/0/0] nat inside
[R-Center-GigabitEthernet0/0/0] quit
[R-Center] interface GigabitEthernet0/0/1           # 外网口
[R-Center-GigabitEthernet0/0/1] nat outside
[R-Center-GigabitEthernet0/0/1] quit
[R-Center] acl 2000
[R-Center-acl-basic-2000] rule permit source 192.168.1.0 0.0.0.255
[R-Center-acl-basic-2000] quit
[R-Center] nat outbound 2000
[R-Center] return

此段代码未经本人测试,但是有以下反馈:华为只需在出接口配置 nat outbound [ACL] 即可,内网口保持默认。

华三 (H3C)

<R-Center> system-view
[R-Center] interface GigabitEthernet1/0/1           # 内网口
[R-Center-GigabitEthernet1/0/1] nat inside
[R-Center-GigabitEthernet1/0/1] quit
[R-Center] interface GigabitEthernet1/0/0           # 外网口
[R-Center-GigabitEthernet1/0/0] nat outside
[R-Center-GigabitEthernet1/0/0] quit
[R-Center] acl basic 2000
[R-Center-acl-ipv4-basic-2000] rule permit source 192.168.1.0 0.0.0.255
[R-Center-acl-ipv4-basic-2000] quit
[R-Center] nat outbound 2000
[R-Center] return

🔍 验证NAT状态

配置完了怎么确认生效了?

厂商查看NAT转换表查看NAT统计
思科show ip nat translationsshow ip nat statistics
华为display nat session alldisplay nat outbound
华三display nat sessiondisplay nat outbound

思科输出示例

R-Center# show ip nat translations
Pro Inside global      Inside local       Outside local      Outside global
tcp 203.0.113.5:12345  192.168.1.10:12345 8.8.8.8:80         8.8.8.8:80

看到类似输出说明内网192.168.1.10正在通过公网IP 203.0.113.5访问8.8.8.8的80端口。


常见问题

❓ 配置了NAT但上不了网?点我排查
  1. 接口角色反了:检查inside/outside是否标对
  2. ACL写错了:确认反掩码是否正确(是0.0.0.255不是255.255.255.0)
  3. 路由缺失:设备需要有默认路由指向下一跳
    • 思科:ip route 0.0.0.0 0.0.0.0 [下一跳IP]
    • 华为/华三:ip route-static 0.0.0.0 0 [下一跳IP]
  4. 外网口没IP:或者IP不是公网IP(如果是运营商分配的私网IP,属于运营商级NAT,与本设备无关)
❓ PAT和动态NAT有什么区别?
类型公网IP占用最大连接数适用场景
动态NAT1个内网IP占用1个公网IP受公网IP数量限制内网设备少,公网IP多
PAT所有内网IP共用1个公网IP约65535个/每个公网IP家庭、企业宽带上网

结论:PAT是现在的主流,动态NAT基本被淘汰了。


总结

操作思科华为/华三
标内网口ip nat insidenat inside
标外网口ip nat outsidenat outside
定义内网范围access-list [号] permit [网段] [反掩码]acl [号] rule permit source [网段] [反掩码]
开启PATip nat inside source list [号] interface [外网口] overloadnat outbound [号]
查看转换表show ip nat translationsdisplay nat session all

一句话总结

NAT就是让一群私网IP共用少数公网IP上网的技术,PAT是它最常用的形式。

当你用思科配置NAT的时候,如果你要配置PAT一定要加Overload。想知道为什么?点我。

思科配置 PAT 不加 overload 的后果


顾名思义,本隐藏章节将告诉你忘记敲 overload 会发生什么。


很多新手配置 PAT 时,照着教程敲了 ip nat inside source list 1 interface g0/1,结果内网电脑死活上不了网——问题就出在忘了加 overload

在思科设备上,overload 这个关键字决定了 NAT 的行为到底是"多对一"还是"多对多"。不加它,设备就不会启用端口复用,后果很严重。


⚠️ 不加 overload = 动态 NAT

先看两条命令的对比:

命令类型含义
ip nat inside source list 1 interface g0/1 overloadPAT(端口地址转换)多对一,所有内网IP共享一个公网IP
ip nat inside source list 1 interface g0/1动态 NAT多对多,每个内网IP独占一个公网IP

不加 overload,你配置的就是动态 NAT,而不是 PAT


💥 不加 overload 的四大后果

1. 公网IP不够用,直接瘫痪

  • PAT模式:1个公网IP可以带整个内网(理论支持约65535个并发连接)
  • 动态NAT模式每个内网IP独占一个公网IP,有多少公网IP,就只能让多少台设备同时上网

后果:如果你只有一个公网IP(家庭宽带、小企业专线常见情况),那么只有第1台设备能上网,第2台开始全部失败

2. 配置报错(如果你用的是接口)

如果你用的是 interface 这种写法(如 interface g0/1),不加 overload 甚至可能报错:

%Pool ... not defined. Use 'ip nat pool' command

因为动态NAT需要一个地址池,而你只给了一个接口,设备不知道该怎么分配。

3. 端口不复用,连接数受限

  • PAT:通过端口号区分不同连接,1个公网IP + 65535个端口 = 海量并发
  • 动态NAT:只换IP不换端口,1个公网IP = 1个连接(实际上是被端口限制了)

后果:即使用多个公网IP,每个IP同时只能被一台设备的一个会话占用,效率极低。

4. 外网无法主动访问内网(这不是好事)

虽然不加 overload 也能隐藏内网(和PAT一样),但这不是优点——你想要的只是让内网上网,而不是限制并发数。


🧪 实验对比

正确配置(PAT,加 overload)

R-Center(config)# access-list 1 permit 192.168.1.0 0.0.0.255
R-Center(config)# ip nat inside source list 1 interface GigabitEthernet0/1 overload
R-Center(config)# interface GigabitEthernet0/0
R-Center(config-if)# ip nat inside
R-Center(config-if)# interface GigabitEthernet0/1
R-Center(config-if)# ip nat outside

效果:内网50台电脑都能上网,show ip nat translations 看到同一个公网IP后面跟着不同端口:

Pro Inside global      Inside local       Outside local      Outside global
tcp 203.0.113.5:12345  192.168.1.10:12345 8.8.8.8:80         8.8.8.8:80
tcp 203.0.113.5:23456  192.168.1.11:23456 8.8.8.8:80         8.8.8.8:80

错误配置(动态NAT,忘加 overload)

R-Center(config)# access-list 1 permit 192.168.1.0 0.0.0.255
R-Center(config)# ip nat inside source list 1 interface GigabitEthernet0/1
%Pool ... not defined. Use 'ip nat pool' command   # 报错

即使强行用地址池配置:

R-Center(config)# ip nat pool PUBLIC 203.0.113.5 203.0.113.5 netmask 255.255.255.248
R-Center(config)# ip nat inside source list 1 pool PUBLIC

效果:只有第1台访问外网的设备能成功,第2台开始全部超时。


🔍 怎么判断当前配置是PAT还是动态NAT?

命令PAT 输出特征动态 NAT 输出特征
show ip nat translations同一个公网IP,端口号不同不同内网IP对应不同公网IP
show ip nat statistics显示 Total translations: 很多显示 Total addresses: 很少

✅ 正确用法总结

场景命令说明
只有一个公网IPip nat inside source list 1 interface g0/1 overload必须加 overload
有多个公网IP,想让内网共享ip nat pool POOL 203.0.113.5 203.0.113.10 netmask 255.255.255.248
ip nat inside source list 1 pool POOL overload
也要加 overload,否则变成动态NAT
真的想要动态NAT(极少见)不加 overload,但要有足够多的公网IP每个内网IP独占一个公网IP

在思科设备上,不加 overload 的 NAT 就不是 PAT,而是动态 NAT——如果你只有一个公网IP,那只有第1台设备能上网。