在Rocky Linux 9中通过firewalld配置DMZ时,我的实践经验分为以下六个关键步骤,并附带了实际部署中遇到的挑战:
-
区域架构设计
创建三个自定义区域:external(绑定公网接口)、dmz(绑定独立接口或子接口)、internal(绑定内网接口)。实践中发现需通过firewall-cmd --new-zone=dmz --permanent
显式定义新区域,避免与默认的public区域混淆导致安全漏洞。 -
服务隔离配置
在dmz区域仅开放必要服务(如HTTP/HTTPS),使用firewall-cmd --zone=dmz --add-service=http --permanent
。曾遇到WebSocket服务异常,后发现需单独开放TCP 8080并添加--add-port=8080/tcp
。 -
策略路由配置
通过富规则限制访问路径:
firewall-cmd --zone=dmz --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
实际部署中发现需要先禁用反向路径过滤(sysctl net.ipv4.conf.all.rp_filter=0)。 -
NAT穿透配置
使用目标地址转换将公网请求转发至DMZ:
firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=80:toaddr=10.0.0.2 --permanent
调试时发现必须同时启用IP转发(sysctl net.ipv4.ip_forward=1)和伪装功能。 -
多区域接口绑定
使用nmcli connection modify eth1 connection.zone dmz
绑定物理接口时,遇到NetworkManager与firewalld规则冲突,解决方案是禁用NetworkManager对防火墙的控制:
echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-eth1
-
安全加固
在internal区域启用严格模式:
firewall-cmd --zone=internal --set-target=DROP --permanent
但导致SNMP监控异常,需添加例外规则:firewall-cmd --zone=internal --add-source=192.168.100.50 --permanent
典型挑战案例:某次生产环境中DMZ的HTTPS流量异常,最终发现是firewalld未正确加载NSS模块处理TLS 1.3,通过update-crypto-policies --set LEGACY
临时解决,后升级至firewalld 1.2.1彻底修复。另一个常见问题是区域优先级冲突,需通过firewall-cmd --set-default-zone=external
明确默认区域,避免自动接口分配导致规则失效。