在Web集群环境中,防火墙主机作为整个系统的第一道防线,其配置的合理性和安全性直接决定了后端服务的可靠性。记得去年我们团队遭遇过一次DDoS攻击,当时就因为防火墙规则配置存在疏漏,导致整个集群瘫痪了近两小时。那次事件后,我花了三个月时间系统研究了防火墙的最佳实践方案。
防火墙初始化配置的核心目标有三个:建立基础防护屏障、规范访问控制策略、确保日志可追溯。这三个目标看似简单,但在实际部署中往往存在诸多细节需要注意。
我强烈推荐使用CentOS Stream或Rocky Linux作为防火墙主机的操作系统。这两个发行版都提供了长期支持,并且与RHEL保持高度兼容。在安装时务必选择"Minimal Install"模式,只安装最基本的软件包。
安装完成后立即执行:
bash复制yum update -y && yum install -y epel-release
systemctl disable firewalld
systemctl stop firewalld
注意:这里我们禁用系统自带的firewalld是因为它与我们后续要配置的iptables服务存在冲突。在专业防火墙部署中,我们更倾向于使用原生的iptables/netfilter框架。
典型的Web集群防火墙至少需要配置三个网络区域:
配置文件示例(/etc/sysconfig/network-scripts/ifcfg-eth0):
code复制DEVICE=eth0
BOOTPROTO=static
IPADDR=203.0.113.1
NETMASK=255.255.255.0
GATEWAY=203.0.113.254
ONBOOT=yes
下面是我在多个生产环境中验证过的基础规则模板:
bash复制# 清空现有规则
iptables -F
iptables -X
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许ICMP (ping)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 保存规则
service iptables save
systemctl enable iptables
针对Web集群环境,我们需要特别关注以下流量:
bash复制# 允许HTTP/HTTPS流量从外网到DMZ
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 443 -j ACCEPT
# 允许DMZ到内网的数据库连接
iptables -A FORWARD -i eth1 -o eth2 -p tcp --dport 3306 -j ACCEPT
# 限制SSH访问
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
bash复制# 限制新建连接速率
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# 防止SYN洪水攻击
iptables -N SYN_FLOOD
iptables -A SYN_FLOOD -m limit --limit 10/s --limit-burst 20 -j RETURN
iptables -A SYN_FLOOD -j LOG --log-prefix "SYN flood: "
iptables -A SYN_FLOOD -j DROP
iptables -A INPUT -p tcp --syn -j SYN_FLOOD
这是一种隐蔽服务访问方式:
bash复制iptables -N KNOCKING
iptables -A INPUT -j KNOCKING
# 定义敲门序列 (示例:1000,2000,3000)
iptables -A KNOCKING -m recent --name STAGE1 --remove -j DROP
iptables -A KNOCKING -p tcp --dport 1000 -m recent --name STAGE1 --set -j DROP
iptables -A KNOCKING -m recent --rcheck --name STAGE1 -p tcp --dport 2000 -m recent --name STAGE2 --set -j DROP
iptables -A KNOCKING -m recent --rcheck --name STAGE2 -p tcp --dport 3000 -m recent --name STAGE3 --set -j DROP
iptables -A KNOCKING -m recent --rcheck --name STAGE3 -p tcp --dport 22 -j ACCEPT
bash复制# 记录被拒绝的包
iptables -A INPUT -j LOG --log-prefix "IPTABLES_INPUT_DROP: " --log-level 4
iptables -A FORWARD -j LOG --log-prefix "IPTABLES_FORWARD_DROP: " --log-level 4
# 日志轮转配置(/etc/logrotate.d/iptables)
/var/log/iptables.log {
weekly
rotate 12
compress
delaycompress
missingok
notifempty
create 640 root adm
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
推荐使用以下工具组合:
安装命令:
bash复制yum install -y iptraf-ng iftop
wget https://github.com/mrash/psad/archive/master.zip
unzip master.zip
cd psad-master && ./install.pl
经过一段时间运行后,可以通过以下命令分析规则使用情况:
bash复制iptables -L -v -n --line-numbers
输出示例:
code复制Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 120K 18M ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 45M 3857M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
建议创建自动化维护脚本(/usr/local/bin/fw_maintain.sh):
bash复制#!/bin/bash
# 规则备份
iptables-save > /etc/iptables.rules.backup-$(date +%Y%m%d)
# 日志分析
grep "IPTABLES" /var/log/messages | awk '{print $1,$2,$3}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -20
# 连接数统计
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10
当出现连接超时时,按以下步骤排查:
iptables -L -n --line-numbersdmesg | grep DROPtelnet 目标IP 端口对于高流量环境,建议:
bash复制echo 1 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose
我个人的经验是,防火墙配置不是一劳永逸的工作。每次业务架构调整或安全威胁变化时,都需要重新评估防火墙规则的有效性。建议建立一个检查清单,包含至少20个关键检查项,每次变更时逐一核对。