在CentOS服务器上抵御DDoS攻击,核心思路就是用Firewalld做流量层面的精细化过滤,再用SELinux做进程层面的权限加固,两者配合形成纵深防御体系。具体做法是:先通过Firewalld的富规则(Rich Rules)和区域(Zone)策略限制异常流量进入,再通过SELinux的强制访问控制策略阻止被攻破的服务进程横向扩散,最终实现从网络层到应用层的多维度防护。这不是理论,是生产环境验证过的实战方案。

一、为什么单独用防火墙不够,必须加上SELinux

很多运维人员觉得配好Firewalld就万事大吉了,实际上传统防火墙只能管"谁能进来",管不了"进来之后能干什么"。DDoS攻击的变种越来越多,SYN Flood、UDP Flood、HTTP慢速攻击这些流量层面的威胁Firewalld能挡一部分,但一旦有少量恶意请求穿透了防火墙,比如通过80端口的合法连接发起应用层攻击,Firewalld就无能为力了。这时候SELinux的价值就体现出来了——它限制的是进程能访问哪些文件、能绑定哪些端口、能发起什么类型的网络连接。即使Web服务被攻击,SELinux也能把损害控制在最小范围内。

二、Firewalld深度配置:从基础到高级的DDoS防护策略

CentOS 7及以上版本默认使用Firewalld,它基于iptables/nftables但提供了更友好的区域管理机制。第一步,确认Firewalld正在运行:

systemctl status firewalld
systemctl enable firewalld

第二步,设置默认区域为drop或public,并只开放必要端口。生产环境建议把不需要的端口全部关闭:

firewall-cmd --permanent --zone=public --remove-service=ssh
firewall-cmd --permanent --zone=public --add-port=22/tcp
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --reload

第三步,也是最关键的一步——配置富规则来防御DDoS。针对SYN Flood攻击,限制每个IP的并发连接数:

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port="80" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port="443" accept'

但光靠Firewalld本身的规则还不够,需要结合内核参数和连接追踪。在/etc/firewalld/direct.xml中添加直接规则,启用SYN Cookie防护:

<direct>
  <rule ipv="ipv4" table="filter" chain="INPUT" priority="0">-p tcp --syn -m limit --limit 1000/sec --limit-burst 1500 -j ACCEPT</rule>
  <rule ipv="ipv4" table="filter" chain="INPUT" priority="1">-p tcp --syn -j DROP</rule>
</direct>

第四步,针对UDP Flood攻击,Firewalld可以设置ICMP速率限制,防止Ping Flood:

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" protocol value="icmp" drop'
firewall-cmd --reload

第五步,启用Firewalld的IP黑名单功能。对于已知攻击源IP,直接加入deny规则:

firewall-cmd --permanent --zone=drop --add-source=203.0.113.50
firewall-cmd --permanent --zone=drop --add-source=198.51.100.23
firewall-cmd --reload

三、SELinux加固:给进程套上"手铐"

SELinux默认是Enforcing模式,这本身就是一道防线。但默认策略对Web服务的限制比较宽松,需要进一步收紧。首先确认SELinux状态:

getenforce
sestatus

如果显示Permissive,立即切换到Enforcing:

setenforce 1
sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config

接下来针对HTTP服务做策略加固。查看httpd进程当前的SELinux上下文:

ps -eZ | grep httpd

默认情况下httpd_t可以读取/var/www/html下的文件、绑定80和443端口、发起对外连接。为了防止被利用后横向扩散,需要限制它的网络行为。创建自定义策略模块:

audit2allow -a -M my_httpd_hardened < /var/log/audit/audit.log

这会生成my_httpd_hardened.te和my_httpd_hardened.pp两个文件。查看生成的.te文件内容,确认只允许必要的操作,然后编译安装:

semodule -i my_httpd_hardened.pp

更激进的做法是直接把httpd_t的网络权限收紧。编辑/etc/selinux/targeted/src/policy/domains/misc/httpd.te,添加:

# 禁止httpd发起对外TCP连接(防止反弹shell)
dontaudit httpd_t self:tcp_socket { create connect };

然后重新编译整个策略:

cd /etc/selinux/targeted/src/policy
make load

对于SSH服务同样需要加固,防止DDoS期间攻击者通过暴力破解获取权限:

semanage boolean -m --on sshd_use_nfs_home_dirs off
semanage boolean -m --on sshd_write_ssh_home off

四、内核层面的协同防护:让系统本身更抗打

Firewalld和SELinux是应用层和进程层的防护,但DDoS攻击最终消耗的是系统资源,所以内核参数调优同样重要。编辑/etc/sysctl.conf:

# 开启SYN Cookie
net.ipv4.tcp_syncookies = 1
# 减少SYN队列长度
net.ipv4.tcp_max_syn_backlog = 2048
# 缩短TIME_WAIT状态时间
net.ipv4.tcp_fin_timeout = 15
# 开启TCP快速回收
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
# 限制ICMP响应速率
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_ratelimit = 100
# 增加连接跟踪表大小
net.netfilter.nf_conntrack_max = 655360
net.nf_conntrack_max = 655360

应用配置:

sysctl -p

五、监控与自动化响应:不要等被打了才反应

防护不是一次性配置,需要持续监控。推荐部署以下监控手段:第一,用ss命令实时查看连接状态:

ss -ant | awk '{print $4}' | sort | uniq -c | sort -rn | head -20

第二,编写自动化脚本,当某个IP连接数超过阈值时自动加入Firewalld黑名单:

#!/bin/bash
THRESHOLD=200
for ip in $(ss -ant | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | awk -v t=$THRESHOLD '$1 > t {print $2}'); do
    firewall-cmd --permanent --zone=drop --add-source=$ip
done
firewall-cmd --reload

第三,配置auditd监控SELinux违规事件,一旦有进程尝试越权操作立即告警:

ausearch -m avc --start today

六、实战经验总结:几个容易踩的坑

第一,不要把SELinux直接设成Disabled。很多人觉得它麻烦就关掉,这等于把最后一道防线拆了。第二,Firewalld的富规则优先级高于简单规则,配置时注意顺序,deny规则要放在accept前面。第三,内核参数调优要根据服务器硬件配置来,连接跟踪表开太大会吃内存,开太小又挡不住大流量。第四,不要只依赖单一手段,DDoS防护是体系化工程,Firewalld+SELinux+内核调优+监控自动化缺一不可。第五,定期做压力测试,用ab或wrk模拟高并发场景,验证你的防护策略是否真正生效。

这套方案在实际生产环境中经过验证,能有效抵御中小规模的DDoS攻击,同时保证正常业务不受影响。核心逻辑就是:Firewalld在门口拦住大部分恶意流量,SELinux确保即使有漏网之鱼也翻不起大浪,内核参数让系统本身更耐扛。三层防护叠加,才是真正的深度防御。