
NAT这三个字母干网络的应该都不陌生。HCIA-SEC的学习大纲里NAT一直是防火墙功能的重头戏考试爱考实际项目里更是绕不开——公司要上互联网地址不够用私有地址又不能直接出现在公网上这时候就得靠防火墙上的NAT来转。我前前后后也配置过不少华为USG的防火墙从几台设备的项目到几十个分支的组网NAT这个功能几乎是每一台设备都要碰的地方。这篇笔记就结合HCIA-SEC的考点和实际项目经验把NAT的原理、华为防火墙上的分类和配置、以及常见的坑都整理一遍适合正在备考HCIA-SEC的朋友也适合刚接触华为防火墙、想在项目里少走弯路的同志。1. NAT到底解决了什么问题地址短缺只是表面原因1.1 一个地址不够用两个思路的博弈先问一个问题为什么我们需要NAT很多人脱口而出“IPv4地址不够用”。这句话没错但只对了一半。IPv4地址空间总数不到43亿而且公网地址早被运营商、云厂商和大企业分得差不多了普通公司想申请一个完整的公网网段几乎不可能。与此同时企业内部少则几十台、多则上万的终端都要上网难道每台设备都分配一个公网地址显然不现实成本上就接受不了。于是组网上常见的做法是内网使用RFC1918定义的私有地址也就是10.0.0.0/8、172.16.0.0/12、192.168.0.0/16这三个段。这些地址的特点是免费、可重复使用、任何组织内部都能用但有个致命限制——不能直接在公网上路由。私有地址的报文一旦进入公网运营商的路由器根本不认直接丢弃。这就产生了一个矛盾内网设备用的是私网地址但访问公网时必须要有公网地址作为身份标识。解决思路有两个。一个是纯路由方案给每台内网设备分配公网地址让报文以公网地址身份直接出网。这个方案在IPv4时代基本属于奢侈品只有大型政企才能承担普通项目想都不要想。另一个就是NAT方案内网设备保持私有地址不变在网络的边界设备上通常是防火墙、路由器做地址转换把私有地址替换成一个或多个公网地址。NAT方案成本低、灵活、还能顺带提供一定程度的隔离和隐藏所以最终成为了主流。理解了这个背景你就能明白为什么几乎所有企业网络出口都有NAT的身影。私有地址的复用特性还带来了一个衍生问题——不同的企业可能用了同一个192.168.1.0/24网段。隔离倒是没问题因为私有地址本来就不出现在公网但一旦两个需要互访的内网都用了相同网段就会出现后面要讲到的地址冲突和双向NAT场景。这正好是HCIA-SEC里喜欢出题的地方别以为NAT只是“给上网用”的它承担的职责比大部分人想象的要多。1.2 会话表理解NAT绕不开的核心概念NAT的全称是Network Address Translation字面意思就是网络地址转换。很多初学者把它理解成“一个简单的地址改写动作”这种理解会让你在排障时非常痛苦。实际上NAT是一种有状态的技术它的核心是设备上维护的一张表——会话表华为的设备上通常叫session table你在命令行里看到的就是display firewall session table的输出。为什么要有会话表因为NAT不是简单地改一次地址就完了。当内网主机10.1.1.5访问公网服务器80.1.1.1时防火墙会把报文的源地址从10.1.1.5改成出口公网地址200.1.1.1同时换一个源端口。服务器收到后回包的目的地址是200.1.1.1这个回包回到防火墙防火墙必须知道它应该转换回10.1.1.5否则这个包就不知道往哪送了。会话表就是干这个用的它记录了一条会话的完整映射关系包括转换前的源IP、源端口和转换后的源IP、源端口以及目的IP和目的端口。你可以把会话表想象成公司前台的访客登记簿。访客内网报文进门时登记了自己和要拜访的人前台给他发一个临时访客牌公网地址和端口访客离开后回访的人拿着访客牌找到前台前台一查登记簿就知道该把他引导到哪间办公室。NAT的工作方式和这个一模一样。这也是为什么NAT设备不能像路由器那样“转发完就忘”每一台NAT设备都必须记住自己做过哪些转换否则回包就是对不上号的死信。用一条完整流量串起来看更清楚。假设内网192.168.1.5要访问外网80.1.1.1上的Web服务192.168.1.5发送一个源地址192.168.1.5、源端口1080、目的地址80.1.1.1、目的端口80的TCP SYN报文防火墙收到后查安全策略确认放行再查NAT策略命中Easy IP在会话表里创建一条表项记录转换前192.168.1.5:1080和转换后200.1.1.2:35000的映射关系报文被发出时源地址和源端口已经被替换成200.1.1.2:3500080.1.1.1收到报文并回应回包目的地址是200.1.1.2:35000防火墙收到回包查会话表找到对应的表项把目的地址和目的端口转换回192.168.1.5:1080然后交给内网。整个过程看起来不复杂但每一步都依赖会话表的存在。TCP连接是双向的UDP虽然没有连接状态但同样靠会话表维持“连接”的假象ICMP则利用报文中携带的标识匹配转换关系。这就是为什么NAT设备通常必须是有状态设备——无状态的NAT转换在工程上是站不住脚的。在实际排障中只要涉及NAT问题我的第一件事永远是在防火墙上查看会话表确认这个流量到底有没有被正常转换、有没有建立会话。如果会话表里根本没有这条流那后面的配置再正确也是白搭。2. 华为USG的NAT分类先搞清楚方向再动手2.1 源NAT内网访问外网地址不够时的解法华为USG防火墙上的NAT分类从方向上来说核心就两类源NATSource NAT和目的NATDestination NAT。源NAT解决的是“内网往外走”的问题也就是把报文的源地址改掉目的NAT解决的是“外网往里进”的问题也就是把报文的目的地址改掉。实际使用中还有源NAT和目的NAT结合的双向NAT。考试里经常考的就是你看到一条会话能不能判断出它做了什么方向的转换。源NAT里常见的形态有三种。第一种叫NAT No-PAT也就是只转换IP地址、不转换端口内外网地址是一对一的。比如内网服务器10.1.1.10映射到公网200.1.1.10出去的时候源IP从10.1.1.10变成200.1.1.10但源端口保持不变。这种方式的优点是对某些依赖源端口不变的业务比如部分视频会议、老旧的FTP应用友好缺点是消耗公网地址一个公网地址只能服务一台内网主机实际项目里用的场景有限主要用在特殊业务或合规要求严格的场合。第二种是PAT华为叫Easy IP或者NAPT它把源IP和源端口同时转换。一个公网IP最多可以承载六万多个并发连接端口范围通常是1到65535排除保留端口后大约64512个内网上百台电脑都通过这一个公网IP上网都没问题。USG上最简单的方式就是在NAT策略里写action source-nat easy-ip系统自动使用出接口的公网地址作为转换后的源地址。这是绝大多数项目里内网PC上互联网的标准配置。我做的项目中80%的源NAT需求用Easy IP就够了不要一上来就想着搞地址池。第三种是静态源NAT常见于内外网地址一一对应的场景。华为命令行里有个容易被忽略的关键字reversible。比如nat static outbound 192.168.104.70 172.16.115.134 reversible这条命令的含义是内网主机192.168.104.70主动访问外网时源地址被转换成172.16.115.134同时由于带了reversible关键字外网的流量也可以主动访问172.16.115.134并被反向转换成192.168.104.70。也就是说一条静态NAT规则同时实现了源NAT和目的NAT的效果。这种写法在“某台内网测试服务器既要出网、又要被外部指定IP访问”的场景下非常方便但注意reversible会把这个公网地址的完整访问权限暴露给对应的内网主机配置前一定要确认安全边界别把生产服务器的地址做成带reversible的静态NAT。2.2 目的NAT与NAT Server让外网主动找进来目的NAT通俗地说就是端口映射或服务器发布。公司内网有一台Web服务器IP是192.168.1.10只监听80端口外网用户想访问它肯定不能直接访问192.168.1.10因为这是一个私有地址在公网上不可达。这就需要防火墙做目的NAT把发往公网地址200.1.1.2:80的报文目的地址换成192.168.1.10:80。华为USG上实现这个功能用NAT Server配置。命令一般长这样nat server http_server protocol tcp global 200.1.1.2 80 inside 192.168.1.10 80也可以直接用接口的公网IP来发布不指定具体的公网地址nat server http_server protocol tcp global interface GigabitEthernet1/0/1 80 inside 192.168.1.10 80后一种方式在出口IP是动态获取的场景很常见比如PPPoE拨号线路IP变了也不影响NAT Server的映射关系。NAT Server的本质是防火墙主动在公网侧“开门”只开放你指定的端口和协议。比如同样是内网一台服务器你只映射了80端口外网访问它的443端口就被丢弃。这个特性既是优点也是隐患——映射的端口越多、范围越广暴露面就越大。我见过有同事图方便把内网一台数据库服务器的1433端口也映射了出去没过多久就被人扫描爆破出弱口令差点把整个内网数据库一起带走。所以做NAT Server时遵循最小开放原则是底线能用高端口映射就用高端口能不开就不开。NAT Server的形态不止端口映射一种。如果内网有一台服务器需要完整对外提供多个服务比如Web的80和443、邮件SMTP的25、POP3的110这时候就要考虑做地址映射也就是把公网地址的多个端口整体映射到内网服务器的对应端口。华为USG的Web界面里可以配置“映射到地址池”或逐个端口映射命令行操作时则是一条条加规则。建议在需求确认阶段就明确是按端口逐个映射还是整机发布。多数情况下逐端口映射更安全而且出了问题也容易收敛。2.3 双向NAT和多层NAT复杂场景的结构性选择双向NAT在HCIA-SEC里也是重点考点实际项目中则是“救火队员”。最常见的场景是网络合并、公司并购、或者分支互联时两边的内网网段都用了192.168.1.0/24地址冲突但业务上双方必须互通。这时候靠路由是解决不了的因为两边都认为192.168.1.1是“自己人”。解决思路就是在两个网络的边界设备上各做一次目的NATA侧访问B侧某台服务器时把目的地址从192.168.1.10变成10.1.1.10B侧实际地址然后B侧回包时再做源NAT把源地址从10.1.1.10变回192.168.1.10。这样两侧跑的都是自己熟悉的网段但实际报文在中间被转换了。华为USG上做双向NAT需要在NAT策略里同时配置源地址转换和目的地址转换并且要注意策略的匹配顺序。防火墙在匹配NAT策略时是从上往下的越是具体的规则越要放在前面。我吃过一次亏公司两个分支互联A分支访问B分支服务器的NAT策略放在了通用上网策略后面结果流量先被上网的Easy IP规则截住了源地址被转换到了B侧根本匹配不上预期的目的NAT排查了快一个小时才定位到是规则顺序问题。从那以后我的习惯是在写NAT策略之前先在纸上把“谁访问谁、从哪个域到哪个域、期望的转换结果是什么”列成一张表再按“最具体最优先”的顺序落配置。还有一个和NAT密切相关的高频考点是双机热备HRP。主备两台USG组成双机热备后NAT会话表需要在两台设备间同步否则主设备故障切换到备机时已经建立的NAT会话全部失效正在使用的业务会瞬间断开。华为USG上通过HRP的会话备份功能解决配置上需要确保两台设备的NAT策略、安全策略配置一致并开启session group同步。考试里出题点经常设在“主备切换后NAT会话不中断的机制是什么”这类问题上掌握“HRP备份会话表”这个答案基本就稳了。3. 实操一遍USG6500上把NAT从配置到验证全走通3.1 组网拓扑与需求清单先把需求写到纸上纸上谈兵说完了来点实际能抄作业的。我用一台华为USG6500E做演示组网很简单GigabitEthernet1/0/0接内网网段192.168.1.0/24安全区域是TrustGigabitEthernet1/0/1接外网公网地址200.1.1.2/30对端是运营商网关200.1.1.1安全区域Untrust。内网有一台Web服务器192.168.1.10需要对外提供HTTP服务。需求清单列出来内网所有PC可以访问互联网使用出口公网地址200.1.1.2做Easy IP外网用户可以通过http://200.1.1.2访问内网Web服务器192.168.1.10的80端口内网用户希望通过域名或公网IP 200.1.1.2也能访问到Web服务器。第三条就是著名的“回流”需求很多项目验收的时候客户都会提后面单独说。这里先把前两条配起来。另外如果你是在eNSP或PNetLab里练习拓扑结构基本一致只是接口编号可能会变成GigabitEthernet0/0/0之类不影响思路。3.2 Easy IP配置三步完成后打通上网华为USG防火墙的NAT配置逻辑很简单分三步配接口、放安全策略、配NAT策略。漏掉任何一步流量都过不去。第一步配置接口IP并加入安全区域interface GigabitEthernet1/0/0 ip address 192.168.1.1 255.255.255.0 undo shutdown # interface GigabitEthernet1/0/1 ip address 200.1.1.2 255.255.255.252 undo shutdown # firewall zone trust add interface GigabitEthernet1/0/0 # firewall zone untrust add interface GigabitEthernet1/0/1第二步安全策略。需要放行Trust到Untrust方向的HTTP、HTTPS、DNS等流量这里以一个宽松的测试策略为例生产环境请按最小化原则细化security-policy rule name trust_to_untrust source-zone trust destination-zone untrust action permit如果你只想放行特定服务可以在rule里用service关键字指定service tcp destination-port 80 service tcp destination-port 443 service udp destination-port 53第三步NAT策略把源NAT规则加上nat-policy rule name easy_ip_nat source-zone trust destination-zone untrust source-address 192.168.1.0 mask 24 action source-nat easy-ip配置完成后内网PC访问外网时防火墙会把报文的源地址转换成GigabitEthernet1/0/1接口的IP 200.1.1.2同时随机分配源端口。这里有个容易踩的坑很多新手只配了NAT策略忘记配安全策略结果报文根本走不到NAT那一步就被防火墙丢弃了。在华为USG上NAT策略和安全策略是两套独立的逻辑安全策略决定报文能否通过NAT策略决定通过的报文要不要做转换两者必须配合使用。用我常说的口诀记忆就是先判断“能不能过”再判断“怎么过”。3.3 服务器发布与回流给内网用户也留一条路接下来配置NAT Server让外网能访问内网的Web服务器。命令如下nat server http_server protocol tcp global 200.1.1.2 80 inside 192.168.1.10 80配置完这条命令外网用户访问http://200.1.1.2就能到达192.168.1.10:80。但注意这时候内网用户如果也通过http://200.1.1.2去访问Web服务器大概率是不通的。原因在于内网PC访问200.1.1.2:80时报文到达防火墙防火墙查NAT Server表发现目的地址应该转换成192.168.1.10于是把报文目的地址改成私有地址。但是回程报文从192.168.1.10发出的时候它一看目的地址是192.168.1.5内网PC直接在内网交换机上就把报文转给PC了根本不会走防火墙PC收到的响应报文的源地址是192.168.1.10但它发请求时访问的是200.1.1.2源目的对不上连接就挂了。这就是NAT回流问题的本质——流量在防火墙内部“打了个弯”但回程没有沿原路返回。华为USG解决回流的标准做法是启用NAT Hairpin同时调整NAT策略和目的NAT。核心思路是内网到公网IP的流量也要先走一遍源NAT转换成公网IP再由NAT Server完成目的NAT转换。配置上需要把NAT策略中的目的区域调整为local或者配置专门的hairpin规则具体命令取决于版本。我的经验是如果你用的是较新的USG6000系列V600R007之后的版本在Web界面上有NAT回流开关直接勾选即可老版本则需要自己在nat-policy里加一条允许Trust到Local的源NAT规则。这个特性最容易出错的地方是安全策略的顺序——回流流量必须同时被源NAT策略和安全策略允许两边的规则都不能少。配置完成后内网PC访问200.1.1.2:80报文在防火墙里被做了两次转换内网用户也能正常打开Web页面。因为回流配置容易出问题我的建议是项目里在需求阶段就跟客户确认“内网用户是否也需要通过公网地址访问内网服务器”如果需要就把它写进配置清单里而不是等验收时才发现。3.4 验证与检查清单配置完不等于配完了配置完成后怎么验证不能只看配置对不对还要看会话表中的实际转换结果。常用的验证命令我整理成一张表命令用途display nat session table查看NAT会话确认地址转换是否产生display firewall session table查看完整的会话状态包括匹配的安全策略和NAT策略display nat policy all查看NAT策略的匹配情况和命中次数display nat server all查看NAT Server映射表reset nat session清理NAT会话改配置后建议执行一次display ip routing-table确认路由可达路由错误会导致会话建立不起来实际操作中我会先在PC上ping外网IP然后在防火墙上执行display nat session table如果看到类似下面的输出说明NAT已经生效NAT Session: Source IP: 192.168.1.5 Port: 10240 Destination IP: 80.1.1.1 Port: 80 Protocol: TCP NAT Source: 200.1.1.2 Port: 35000注意一个细节查看会话的时机很重要。TCP连接是短连还是长连会话表项的存活时间是不同的。如果测试流量已经结束查不到会话很正常不代表NAT没工作。排查时可以先持续ping或访问服务保持会话活跃再打开会话表观察。Web界面在“监控-会话表”里也能看到但对命令行熟的人用CLI更快。配置完成后我还会执行一次save把配置保存到持久化存储因为USG默认配置不会自动保存设备一重启就全丢了。4. 常见问题与排查技巧实录4.1 NAT回流不通大多数项目第一个坑回流问题前面已经讲了一部分这里做个完整版的排查思路。现象很典型内网PC访问公网地址不通但外网用户访问正常或者反过来内网访问内网服务器正常、通过公网IP就不行。首先确认防火墙版本是否支持NAT Hairpin以及是否已开启。然后检查NAT策略中是否包含了Trust到Local或Trust到Untrust的回流流量。最后查看安全策略放行规则一定要覆盖回流报文的入接口和出接口方向。还有一个经常被忽略的坑DNS解析。内网PC通过域名访问服务器时如果域名是公网DNS解析出来的公网IP而服务器同时在内网DNS里配置了内网地址解析两边不一致NAT回流配置得再好也会因为解析到内网IP而走内网直连。遇到这种情况我的做法是建议客户把内网DNS的解析结果统一改成公网IP让所有用户都通过防火墙的NAT路径访问这样既能保持访问行为一致也能让NAT回流策略真正发挥作用。再分享一个真实案例。某项目上线后客户反馈外网访问网站没问题但公司内部访问自己的网站很慢有时还打不开。远程登录设备一看会话表里有大量TIME_WAIT和重传记录内网PC访问公网IP的流量在防火墙上做了往返转换但回程报文的源地址是服务器内网IP导致PC端连接状态错乱。问题根源就是上面说的“解析不一致”——内网PC把域名解析成了192.168.1.10而防火墙的回流规则只匹配公网IP。后来把内网DNS改为统一解析公网IP并在防火墙上确认hairpin规则生效问题马上消失。这类问题在内网环境有自建DNS的企业里出现频率非常高排查时需要格外留意。4.2 会话表与调试命令抓到现场比猜重要NAT排障最忌讳的就是不看会话表、一通乱改。遇到过不止一次同事排了半小时最后发现是安全策略没放行或者路由指向错误这些在会话表里都写得明明白白。我常用的排查节奏是先display firewall session table看有没有会话没有会话就看安全策略是否放行、路由是否可达有会话就看NAT转换是否正常源地址、目的地址是否符合预期转换正常但业务不通再往下查应用层比如FTP这种多通道协议需要ALG支持。华为USG的ALG应用层网关也是HCIA-SEC的重点。FTP、TFTP、SIP这些协议有一个共同点它们会在报文内容里携带IP地址和端口信息比如FTP的PORT命令会告诉对端“你来连我192.168.1.5的1025端口”如果防火墙不做ALG处理NAT转换后这个信息还是旧的私有地址对端根本无法连接。USG上默认开启了常见协议的ALG但如果你改过或者某些特殊场景下觉得不对可以用debugging nat alg的方式跟踪。实际项目里FTP被动模式连接失败的案例很多都跟ALG配置有关这个知识点考试也常考。调试命令方面华为USG支持debugging nat packet和debugging firewall packet能打印出报文经过NAT前后的详细信息。不过要注意debugging输出量很大生产设备上开启会占用不少CPU建议在模拟环境或维护窗口期使用开完马上关闭避免影响业务。另外再强调一个习惯每次修改NAT或安全策略后执行reset nat session清理一下旧会话避免新旧策略不一致导致存量连接异常。4.3 跨平台NAT对照从USG到iptables再到虚拟化学NAT不能只看华为一家因为现在很多项目是异构环境。比如Linux服务器上的NAT用iptables的nat表实现典型命令是iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE这条命令的效果和华为USG的Easy IP完全一样源地址转换为出接口的IP端口自动分配。如果收到类似“iptables v1.8.9 (legacy): cant initialize iptables table nat: table does not exist”的报错通常不是命令写错了而是内核的nat表相关模块没加载比如iptable_nat、nf_nat或者当前环境不允许加载内核模块比如容器里没有对应权限。判断方法是执行modprobe iptable_nat然后重新查看iptables -t nat -L能正常输出就说明模块补上了。这个经验在运维和虚拟化环境里非常实用。再来说虚拟化平台的NAT。VMware Workstation和VirtualBox里的NAT模式本质上就是宿主机上运行了一个NAT服务虚拟机共享宿主机的IP和端口上网。所以虚拟机里看到的路由默认网关通常是192.168.X.1这就是宿主机的虚拟网卡。而仅主机模式Host-Only只有一个虚拟交换机虚拟机之间能互通但没有NAT转换功能虚拟机无法访问外网除非你自己在宿主机上配置ICS或再加一台软路由。理解了NAT的原理你在配置虚拟机网络时就不会再问“为什么仅主机模式下ping不通网关”这种问题了。PNetLab这类模拟器里也有类似的NAT端口配置。你在PNetLab里把节点的NAT口绑定到pnet0管理口时要注意这个绑定让节点能通过管理网络向外通信但流量路径和真实防火墙的NAT差别很大模拟器里做实验时如果发现“节点能ping通外网但防火墙上的NAT会话表看不到流量”先检查一下节点是不是走了管理口的NAT而不是走了防火墙的接口。这是个很容易令人困惑的模拟器细节多花几分钟确认拓扑就能少掉不少头发。Windows平台的NAT也有存在感。Win10/Win11内置的“移动热点”和“Internet连接共享ICS”功能底层就是一个NAT服务把无线网卡上的流量转出去。WSL 2默认使用的也是NAT模式的虚拟网络所以WSL里访问宿主机的服务时地址和端口映射跟普通虚拟机有一样的问题你要通过Windows主机的IP或者配置端口转发才能访问WSL服务。VirtualBox里“从主机访问NAT网络的虚拟机”也是类似的解决思路在VirtualBox的端口转发规则里把宿主机的某个端口映射到虚拟机的22或80端口本质就是手动做了一个NAT Server。这些场景虽然设备不同但“源地址转换端口复用会话表维护”这套逻辑是完全一致的一通百通。最后分享一个经验NAT相关的故障90%都能通过一句话定位——先看会话表有没有这个流没有就看安全策略和路由有就看转换是否合理。剩下10%才是ALG、DNS、应用层的问题。只要你把会话表读熟了NAT排障基本就赢了一半。我每次培训新人的时候都会让他们先在模拟器上把各种NAT场景敲一遍、把会话表仔细读一遍比背十遍配置命令都管用。