firewalld的ingress/egress策略机制与传统IP伪装方式的对比及底层原理问询
兄弟,太懂你这种从手动敲iptables规则转到firewalld高级策略时的懵圈感了——明明以前必须开MASQUERADE才能让内网NAT转发跑起来,现在用策略配置完,看输出里masquerade是no,居然还能正常工作?我来给你拆解清楚这背后的逻辑。
首先复盘下你V1的传统玩法:
- 你用
--direct规则直接往iptables的核心链里塞配置,完全是手动实现NAT转发的核心逻辑:MASQUERADE本质是动态SNAT,把内网主机的IP替换成外网接口的公网IP,让数据包能正常从外网返回- 两条
FORWARD规则分别放行内网到外网的新连接,以及外网到内网的关联/已建立连接,确保双向流量能通
再看你现在的策略玩法,这其实是firewalld提供的基于zone的高级转发抽象,底层还是依赖iptables,但firewalld帮你做了自动化的规则生成,不过这里有个关键细节你可能没注意到:
为什么没开masquerade还能工作?
你看--info-policy的输出里masquerade: no,是因为masquerade是zone级别的配置,不是策略级别的!策略本身只是负责管控不同zone之间的转发权限,NAT功能还是由zone来提供的。
你可以先检查下你的external zone是否已经开启了masquerade:
firewall-cmd --zone=external --query-masquerade
如果返回yes,那就是zone的masquerade在偷偷干活,策略只是帮你把internal到external的转发流量给放行而已——相当于把你之前手动写的两条FORWARD规则给自动化了,同时复用了zone的NAT配置。
如果确实没开masquerade但转发还能正常跑,那大概率是你的网络拓扑特殊(比如内外网在同一网段,不需要NAT),但这种情况非常少见,优先检查zone配置。
策略的底层到底在做什么?
当你创建internal-external策略,设置ingress-zones=internal、egress-zones=external且target=ACCEPT时,firewalld会在背后自动做这些事:
- 在
filter/FORWARD链中添加规则,允许所有从internalzone到externalzone的转发流量(相当于合并了你之前的两条FORWARD规则) - 如果
externalzone开启了masquerade,firewalld会自动在nat/POSTROUTING链中为internal到external的流量添加SNAT/MASQUERADE规则,不需要你手动写direct命令 - 策略的优先级默认是-1,比普通zone规则优先级更高,确保转发规则能优先匹配
两种方式的核心对比
- 传统direct规则:完全手动操控iptables链,需要精准控制规则顺序和参数,接口变了就得手动改规则,维护成本高
- firewalld策略:基于zone的抽象配置,把接口加到对应zone后,策略自动适配转发规则,NAT功能复用zone配置,扩展性和可维护性强太多
简单来说,策略就是firewalld给你封装的“转发套餐”,把你之前手动做的转发规则和NAT关联给自动化了,不用再自己去凑iptables的零散规则。
备注:内容来源于stack exchange,提问作者Journeyman Geek

