firewalld实现网段隔离的核心是source绑定优先于接口归属,默认区域为最后回退;需自定义区域、禁用ip转发、清除隐式规则,并通过富规则显式控制跨区访问。

Firewalld 实现不同网段安全隔离,核心不是“给网卡贴多个标签”,而是靠匹配顺序和策略分层:先按源 IP 地址(source)归类,再看接口归属,最后 fallback 到默认区域。关键在于用 source 绑定 + 区域策略 + 显式富规则 三者配合,而不是强行让一个网卡属于多个 zone。
按源网段绑定不同区域
当一张网卡接入多个子网(比如 eth1 同时连 192.168.10.0/24 办公网和 192.168.20.0/24 运维网),就不能只靠 --change-interface。必须用 source 方式区分:
- firewall-cmd --permanent --zone=internal --add-source=192.168.10.0/24
- firewall-cmd --permanent --zone=mgmt --add-source=192.168.20.0/24
- firewall-cmd --reload 激活后,来自这两个网段的流量会自动进入对应区域策略
注意:Firewalld 匹配优先级固定为 source → interface → default zone,所以 source 规则一定生效在接口规则之前。
为不同用途创建专用区域并收紧默认行为
别直接依赖预定义 dmz 或 public,它们策略太宽。生产环境建议自定义区域,明确信任边界:
- 新建区域:firewall-cmd --permanent --new-zone=dmz-web
- 设默认动作为拒绝:firewall-cmd --permanent --zone=dmz-web --set-target=REJECT
- 仅放行必要服务:--add-service=http --add-service=https
- 绑定对应网卡(如 eth2):--change-interface=eth2
类似地,可建 mgmt、db-backup 等区域,每个区域只开最小必要端口,不混用 ssh、mysql 等高危服务。
堵住跨网段访问漏洞
即使区域分开了,若没禁用转发或留了宽松富规则,隔离就形同虚设:
- 检查系统是否开启 IP 转发:sysctl net.ipv4.ip_forward 应为 0;如为 1,需 echo 0 > /proc/sys/net/ipv4/ip_forward 并写入 /etc/sysctl.conf
- 清查隐式放行:firewall-cmd --list-rich-rules,删除无明确业务依据的 rule
- 如需有限互通(例如 DMZ 健康检查访问内网 API),必须用富规则显式声明:
firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="172.16.20.0/24" port port="8080" protocol="tcp" accept'
禁止在 dmz 或 public 区域启用 masquerade,否则可能绕过隔离跳转到内网。
验证与日常维护
配置不是一劳永逸,每次修改后要确认实际效果:
- 查看当前活跃绑定:firewall-cmd --get-active-zones
- 查某区域具体规则:firewall-cmd --info-zone=dmz-web
- 模拟测试:从 192.168.10.100 尝试 telnet 内网 Redis 端口,应被拒绝;从 192.168.20.50 尝试应允许(若该网段绑定了 mgmt 区且开放了对应端口)
- 所有 --permanent 操作后必须 firewall-cmd --reload,否则不生效
不复杂但容易忽略。











