firewalld默认不开启IP转发且拒绝转发流量,因内核ip_forward=0且各区域forward设为no;需手动启用ip_forward并显式配置masquerade或端口转发规则才允许转发。

firewalld 默认不开启 IP 转发,也不默认放行转发流量;它本身不控制内核的 net.ipv4.ip_forward 开关,但会通过区域策略决定是否允许 FORWARD 链上的数据包通过。所谓“默认拒绝转发策略”,本质是:内核转发功能关闭 + firewalld 的 forward 规则默认为 deny。
确认并关闭内核 IP 转发(如非路由器场景)
firewalld 不自动修改内核参数。若你不需要做 NAT 或网关,应确保系统不转发流量:
- 查看当前状态:
sysctl net.ipv4.ip_forward(返回0表示关闭) - 临时关闭:
sudo sysctl -w net.ipv4.ip_forward=0 - 永久关闭:编辑
/etc/sysctl.conf,确保含net.ipv4.ip_forward = 0,然后运行sudo sysctl -p
firewalld 区域对转发行为的实际影响
firewalld 的转发控制取决于 zone 的 forward 设置,默认所有预置 zone(如 public、external)的 forward 值均为 no,即禁止转发 —— 这就是“默认拒绝”的核心体现。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 查当前 active zone 的 forward 状态:
firewall-cmd --get-active-zones→ 查看对应 zone 的forward: no(例如public (active) ... forward: no) - 显式确认:
firewall-cmd --zone=public --query-forward(返回no即生效) - 即使你手动设为
yes,也需配合 masquerade 或 port forwarding 规则才真正生效;单纯开forward不等于放行所有转发包
加固:确保无意外放行转发规则
有些 zone(如 external)默认启用 masquerade,这会隐式允许转发并做 SNAT。若你明确要“拒绝所有转发”,必须清理这类配置:
- 检查是否启用了伪装:
firewall-cmd --zone=external --query-masquerade - 禁用伪装(以 external zone 为例):
sudo firewall-cmd --permanent --zone=external --remove-masquerade - 移除任何已添加的端口转发或富规则:
firewall-cmd --list-forward-ports、firewall-cmd --list-rich-rules,逐条删除 - 执行
sudo firewall-cmd --reload使变更生效
验证转发确实被阻断
测试不能仅靠 ping —— FORWARD 链只处理经本机路由的包(非本机 destination)。可结合以下方式验证:
- 从另一台机器尝试访问本机未监听的端口(如
telnet 其他服务器 8080),若该请求经过本机中转,应超时或被拒 - 查看内核日志:
sudo dmesg | grep -i "drop\|reject",或启用 firewalld 日志后查journalctl -u firewalld | grep DROP - 直接检查 netfilter 规则:
sudo iptables -t filter -L FORWARD -v,应看到policy DROP且无 ACCEPT 条目(firewalld 会将其映射至此)

















