在Web集群环境中,防火墙主机作为整个系统的第一道防线,其配置的合理性和安全性直接关系到后端服务器的安危。我见过太多因为防火墙配置不当导致的安全事故——从简单的端口暴露到整个集群被攻陷,往往都始于初始配置阶段的疏忽。
防火墙初始化不是简单地开启几个端口那么简单。它需要根据业务流量特征、服务架构特点和安全等级要求进行针对性设计。比如电商类Web集群需要重点保护支付接口,而内容类站点则更关注防CC攻击。我在金融行业做安全加固时,就遇到过因为SYN Cookie参数未调优导致促销期间网关崩溃的情况。
推荐使用CentOS Stream或Rocky Linux 9作为防火墙主机系统,这些发行版对firewalld的支持更完善。安装时务必选择"Minimal Install"模式,我习惯在安装完成后手动移除不必要的包:
bash复制dnf remove -y chrony avahi* cups* fprintd*
特别注意:不要安装图形界面!X11相关组件会引入大量安全隐患。曾经有客户的防火墙因为保留了GNOME导致被利用CVE-2023-43641提权。
典型Web集群防火墙应配置三个区域接口:
建议使用nmtui工具配置网络,比手动改配置文件更可靠。关键配置示例:
bash复制nmcli con mod eth0 connection.zone external
nmcli con mod eth1 connection.zone dmz
nmcli con mod eth2 connection.zone internal
删除默认的public区域,创建业务专用区域更安全:
bash复制firewall-cmd --permanent --delete-zone=public
firewall-cmd --permanent --new-zone=web_protect
firewall-cmd --permanent --zone=web_protect --set-target=DROP
设置合理的默认策略:
Web集群典型端口开放方案:
| 方向 | 端口 | 协议 | 用途 | 建议限制 |
|---|---|---|---|---|
| 入站 | 443 | TCP | HTTPS | 源IP限公司出口 |
| 入站 | 80 | TCP | HTTP重定向 | 全球开放 |
| 出站 | 3306 | TCP | MySQL | 仅限内网IP |
使用rich rule实现精细控制:
bash复制firewall-cmd --permanent --zone=external \
--add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" port port="443" protocol="tcp" accept'
DNAT配置示例(将公网IP的443转到内网LB):
bash复制firewall-cmd --permanent --zone=external \
--add-forward-port=port=443:proto=tcp:toport=8443:toaddr=192.168.1.100
SNAT配置(内网服务器出站):
bash复制firewall-cmd --permanent --zone=internal \
--add-masquerade
启用连接限制保护SSH:
bash复制firewall-cmd --permanent --zone=external \
--add-rich-rule='rule service name="ssh" limit value="3/m" accept'
SYN洪水防护(适合高并发场景):
bash复制sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
将拒绝的日志记录到单独文件:
bash复制firewall-cmd --permanent --zone=external \
--set-log-denied=all
日志轮转配置(/etc/logrotate.d/firewalld):
code复制/var/log/firewalld {
weekly
missingok
rotate 12
compress
delaycompress
notifempty
}
使用Ansible实现多防火墙配置同步:
yaml复制- name: Deploy firewalld rules
hosts: firewalls
tasks:
- name: Reload firewalld
ansible.builtin.command: firewall-cmd --reload
notify:
- Save firewalld rules
handlers:
- name: Save firewalld rules
ansible.builtin.command: firewall-cmd --runtime-to-permanent
Keepalived配置示例(/etc/keepalived/keepalived.conf):
conf复制vrrp_script chk_firewall {
script "/usr/libexec/keepalived/firewalld-check"
interval 2
weight 50
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secure123
}
virtual_ipaddress {
203.0.113.100/24
}
track_script {
chk_firewall
}
}
快速开放调试端口(30分钟后自动关闭):
bash复制timeout 30m firewall-cmd --zone=external --add-port=8080/tcp
查看实时连接:
bash复制watch -n 1 'conntrack -L | grep -E "dst=192.168.1.100"'
将firewalld配置纳入Git管理:
bash复制cd /etc/firewalld
git init
git add zones/ services/
git commit -m "Initial firewall config"
建议每次变更后执行:
bash复制firewall-cmd --runtime-to-permanent
cd /etc/firewalld && git diff
针对高流量Web集群的优化建议:
bash复制# 连接跟踪表大小(根据内存调整)
sysctl -w net.netfilter.nf_conntrack_max=2000000
# TIME_WAIT快速回收(LB节点必备)
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=30
# 提高firewalld处理性能
echo "NETFILTER_OPTIONS='-j HASH-LIMIT --hashlimit-above 500/sec --hashlimit-mode srcip --hashlimit-name httplimit'" >> /etc/sysconfig/firewalld
每日自动备份配置(/etc/cron.daily/firewalld-backup):
bash复制#!/bin/bash
tar czf /backup/firewalld-$(date +%Y%m%d).tar.gz /etc/firewalld/ \
&& find /backup/ -name "firewalld-*.tar.gz" -mtime +30 -delete
当配置错误导致断网时的恢复步骤:
systemctl stop firewalldcp /backup/firewalld-last-good/* /etc/firewalld/iptables -P INPUT ACCEPTsystemctl start firewalld建议在维护窗口期测试此流程,我曾遇到过因为SELinux上下文问题导致备份配置无法加载的情况。