在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确保即使有漏网之鱼也翻不起大浪,内核参数让系统本身更耐扛。三层防护叠加,才是真正的深度防御。
