firewalld通过按网卡绑定internal(可信内网)和dmz(仅开放80/443等必要端口)区域实现内网与dmz隔离,再用富规则显式控制跨区访问,禁用masquerade和默认转发确保边界不被绕过。

用 Firewalld 的 Zone 实现内网与 DMZ 隔离,核心是“按网卡绑定不同信任等级的区域”,再配合显式规则控制跨区通信。不靠复杂脚本,靠区域语义和接口归属就能划清边界。
选对区域:internal 和 dmz 各司其职
internal 区域代表可信内网,允许常见服务如 SSH、DHCPv6-client、mdns,适合部署数据库、Redis、内部 API;dmz 区域仅开放极少数对外端口(比如 80/443),默认拒绝所有其他入站连接,且严禁反向访问 internal 网段——它只是缓冲区,不是跳板。
- internal 不等于“全通”,它仍默认拒绝未显式放行的服务(如 MySQL 默认不开放)
- dmz 禁止启用 masquerade 或转发到 internal,否则会绕过隔离
- 避免把后端服务直接部署在 dmz 区域,那是典型配置错误
按网卡绑定区域:物理隔离的第一步
服务器有多张网卡时,每张网卡只能属于一个 zone,这是最干净的网络分段方式。例如:
- ens192 接办公内网 → 绑定 internal:firewall-cmd --permanent --zone=internal --change-interface=ens192
- ens224 接 DMZ 交换机 → 绑定 dmz:firewall-cmd --permanent --zone=dmz --change-interface=ens224
- 执行 firewall-cmd --reload 激活配置
- 用 firewall-cmd --get-active-zones 确认绑定结果
堵住跨区漏洞:禁用默认转发,按需开通
Firewalld 默认禁止跨 zone 转发,但若启用了 IP 转发或配置了富规则,可能意外打通。务必检查并收紧:
- 确认系统未开启全局转发:sysctl net.ipv4.ip_forward 应为 0
- 查是否有隐式允许的富规则:firewall-cmd --list-rich-rules
- 如需从 dmz 访问 internal 的特定服务(如健康检查),必须显式添加富规则,不能依赖区域默认行为
- 示例(仅允许 dmz 网段访问 internal 上的 9200 端口):firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="9200" protocol="tcp" accept'
验证与维护要点
配置完别只信命令返回,要实际验证流量路径:
- 从 DMZ 客户端 telnet 内网某台 DB 的 3306 端口 → 应超时(未放行)
- 从内网客户端 ssh 到 DMZ 主机 → 应成功(internal 默认允许 SSH 出站)
- 检查日志:journalctl -u firewalld -n 50 --no-pager 查丢包记录
- 所有 --permanent 操作后必须 reload,否则重启即失效










