firewalld多网卡隔离需接口绑定+源地址分类+显式拒绝三层配合:每网卡绑定对应区域(如eth0→public)、同接口多子网用source绑定(优先级高于接口)、DMZ等场景应自定义区域并禁用ssh等高危服务、精细控制用rich rule、务必开启IP转发。

Linux 用 firewalld 管理多网卡环境,核心不是给每张网卡“配一个区域”就完事,而是靠接口绑定 + 源地址分类 + 显式拒绝三层配合,才能真正实现内网、DMZ、外网的逻辑隔离。
先明确每张网卡的物理归属和默认区域
多网卡服务器(如 eth0、eth1、eth2)必须先理清每张网卡实际接入的网络类型:
- eth0 接公网(如 ISP 线路)→ 绑定到 public 区域,只开放 http/https/ssh 等必要服务
- eth1 接办公内网(如 192.168.10.0/24)→ 绑定到 internal 区域,可保留 ssh、samba-client、mdns
- eth2 接 DMZ(如 172.16.20.0/24,部署 Web 前端)→ 不要用预定义 dmz 区,应新建专用区域(如 dmz-web)
查看当前绑定:`firewall-cmd --get-active-zones`;设置接口归属(示例):
`firewall-cmd --permanent --zone=public --change-interface=eth0`
执行后必须 `firewall-cmd --reload` 才生效。
为 DMZ 或特殊网段创建专用区域并收紧策略
预定义 dmz 区过于宽松(默认放行 ssh),生产环境应自定义区域:
- 新建区域:`firewall-cmd --permanent --new-zone=dmz-web`
- 设默认动作为拒绝:`firewall-cmd --permanent --zone=dmz-web --set-target=REJECT`
- 仅放行必需服务:`firewall-cmd --permanent --zone=dmz-web --add-service=http` 和 `--add-service=https`
- 绑定网卡:`firewall-cmd --permanent --zone=dmz-web --change-interface=eth2`
切记:不要在 dmz-web 中添加 ssh、mysql 等管理或数据库端口——这些应由 internal 区域或跳板机统一管控。
用 source 绑定处理同一接口接入多个子网的情况
一张网卡(如 eth0)若同时接入两个子网(192.168.10.0/24 和 192.168.20.0/24),不能把 eth0 同时加到两个 zone —— firewalld 不允许,会报错 ZONE_ALREADY_SET。正确做法是:
- 把源网段绑定到对应区域:
`firewall-cmd --permanent --zone=internal --add-source=192.168.10.0/24`
`firewall-cmd --permanent --zone=public --add-source=192.168.20.0/24` - Firewalld 匹配顺序为:source → interface → default,所以 source 规则优先级更高
用富规则(rich rule)做跨区域精细控制
当 zone 级别策略不够细(比如 internal 区默认放行所有服务,但你只想让某 IP 访问 3306),就得加 rich rule:
- 只允许 192.168.10.100 访问本机 MySQL 端口,并记录日志:
`firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="192.168.10.100" port port="3306" protocol="tcp" accept log prefix="mysql-access" level="info'` - 注意:该规则只在 internal zone 上下文中生效;如果该 IP 实际走的是 public zone(比如没配 source 绑定),这条规则不会触发
- 日志前缀会出现在
/var/log/messages或journalctl -u firewalld中,方便排查
不复杂但容易忽略:firewalld 默认关闭 IP 转发(net.ipv4.ip_forward=0),而跨子网流量隔离常依赖转发能力,记得按需开启并配置 masquerade 或路由规则。


















