firewalld通过地址伪装(SNAT)、端口转发(DNAT)和富规则实现源/目标地址转换与精细访问控制:地址伪装用于内网共享出口IP,端口转发映射公网请求至内网服务,富规则支持多维度策略,直接规则适用于特殊iptables需求。

firewalld 支持通过组合地址伪装(masquerade)、端口转发(forward-port)和富规则(rich rules)实现复杂的源地址与目标转换,关键在于区分场景:源地址转换对应 SNAT 类行为(如内网共享出口 IP),目标地址转换对应 DNAT 类行为(如公网访问内网服务),而富规则用于精细化控制访问权限。
启用地址伪装(IPv4 源地址转换)
适用于内网主机通过网关访问外网,将多个私有 IP 的流量统一“伪装”成网关的公网出口 IP。该功能仅对 IPv4 有效,且默认在 external 区域启用。
- 临时开启当前 external 区域的地址伪装:
firewall-cmd --zone=external --add-masquerade - 永久生效(重启后仍有效):
firewall-cmd --permanent --zone=external --add-masquerade - 确认是否已启用:
firewall-cmd --zone=external --query-masquerade - 注意:必须同时开启系统内核转发:
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-ipforward.conf && sysctl -p
配置端口转发(目标地址+端口转换)
把到达本机某接口的指定端口流量,转发到另一台主机(或本机其他端口),本质是 DNAT。常用于将公网请求映射到内网 Web、SSH 等服务。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 将公网 IP 收到的 TCP 8080 请求,转发给内网 192.168.10.5 的 80 端口:
firewall-cmd --permanent --zone=external --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.10.5 - 转发 UDP 53 到本地 1053 端口(本机端口映射):
firewall-cmd --permanent --zone=public --add-forward-port=port=53:proto=udp:toport=1053 - 查看所有转发规则:
firewall-cmd --zone=external --list-forward-ports - ⚠️ 转发前需确保对应服务端口已在目标主机开放,且防火墙放行(如目标主机 firewalld 允许 80)
用富规则精细控制源/目标条件
当需要基于源 IP、目标端口、协议、服务甚至时间等多维度做策略时,rich rule 是首选。它比直接规则更安全、可维护性更高,且自动适配区域生命周期。
- 拒绝来自 192.168.200.100 的 SSH 访问:
firewall-cmd --zone=external --add-rich-rule='rule family="ipv4" source address="192.168.200.100" service name="ssh" reject' - 仅允许 10.0.0.0/24 网段访问本机 HTTPS,并记录日志:
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="443" protocol="tcp" log prefix="https-allow" level="info" accept' - 限制某 IP 每分钟最多 5 个新连接(限速):
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.20" limit value="5/m" accept'
必要补充:直接规则处理特殊需求
富规则和区域级配置无法覆盖时(例如需插入 raw 表、自定义链、ebtables),可用 direct interface。它绕过 firewalld 抽象层,直写 iptables 规则,但优先级最高、调试难度大,应谨慎使用。
- 添加一条 raw 表规则拦截特定子网并打日志:
firewall-cmd --direct --add-rule ipv4 raw PREROUTING 0 -s 172.16.0.0/12 -j LOG --log-prefix "RAW_DROP "
firewall-cmd --direct --add-rule ipv4 raw PREROUTING 1 -s 172.16.0.0/12 -j DROP - 创建自定义链并引用:
firewall-cmd --direct --add-chain ipv4 filter myblock
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -j myblock - ⚠️ 直接规则不随 --reload 自动持久化,需加 --permanent 或手动保存到 /etc/firewalld/direct.xml

















