DDoS(分布式拒绝服务)和 DOS(拒绝服务)攻击通过耗尽服务器资源(带宽、CPU、连接数)使服务瘫痪。Linux 系统可通过以下多层防护策略有效缓解此类攻击。
一、基础防护措施
1. 启用内核级防护
Linux 内核提供内置的抗 SYN Flood 和连接限制功能:
# 启用 SYN Cookie 防御(防 SYN Flood) echo 1 > /proc/sys/net/ipv4/tcp_syncookies # 减少 SYN 连接超时时间(加速回收半连接) echo 30 > /proc/sys/net/ipv4/tcp_synack_retries # 限制单个 IP 的最大连接数 echo "net.ipv4.netfilter.ip_conntrack_max = 65536" >> /etc/sysctl.conf sysctl -p
2. 防火墙配置(iptables/nftables)
限制新建连接速率
# 允许已建立的连接通过 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 限制单个 IP 的并发连接数 iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 -j DROP # 限制每秒新连接数(防 CC 攻击) iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
封禁恶意 IP
# 手动封禁 IP iptables -A INPUT -s 攻击者IP -j DROP # 自动封禁频繁连接 IP(通过 fail2ban,见后文)
二、应用层防护
3. Web 服务器优化(Nginx/Apache)
Nginx 限流配置
http { limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s; server { # 限制单个 IP 并发连接数 limit_conn conn_limit_per_ip 20; # 限制请求速率(防 CC 攻击) limit_req zone=req_limit_per_ip burst=30 nodelay; } }
Apache 防护模块
# 启用 mod_evasive(防高频请求) <IfModule mod_evasive20.c> DOSHashTableSize 3097 DOSPageCount 2 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 </IfModule>
4. 使用 Fail2Ban 自动封禁
Fail2Ban 监控日志并自动封禁恶意 IP:
# 安装 apt install fail2ban # Debian/Ubuntu yum install fail2ban # CentOS/RHEL # 配置 SSH 防护(/etc/fail2ban/jail.local) [sshd] enabled = true maxretry = 3 bantime = 1h
三、网络层防护
5. 启用 SYN Proxy 或 TCP 拦截
# 使用 iptables 的 SYN Proxy iptables -t raw -A PREROUTING -p tcp --syn -j CT --notrack iptables -A INPUT -p tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
6. 启用 Cloudflare 或 DDoS 防护服务
-
免费方案:Cloudflare(开启 “Under Attack Mode”)
-
企业方案:AWS Shield、阿里云 DDoS 防护
四、系统资源加固
7. 限制进程资源(防资源耗尽)
# 使用 ulimit 限制用户进程 ulimit -n 65535 # 最大文件描述符数 ulimit -u 500 # 最大用户进程数 # 使用 cgroups 限制服务资源 systemd-run --unit=limit-service --scope -p MemoryLimit=1G -p CPUQuota=50% /path/to/service
8. 禁用不必要服务
# 关闭 ICMP 响应(减少 Ping Flood 影响) echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 停用 IPv6(若无需使用) sysctl -w net.ipv6.conf.all.disable_ipv6=1
五、监控与应急响应
9. 实时监控工具
# 查看当前连接数 netstat -ant | awk '{print $6}' | sort | uniq -c # 检测高流量 IP iftop -n -P # 实时流量监控 vnstat -l # 带宽统计 # 使用 ntopng 分析流量 ntopng -i eth0 -w 3000
10. 应急脚本(自动封禁攻击 IP)
#!/bin/bash # 自动封禁 1 分钟内访问超过 100 次的 IP netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n | tail -10 | while read line do ip=$(echo $line | awk '{print $2}') count=$(echo $line | awk '{print $1}') if [ $count -gt 100 ]; then iptables -A INPUT -s $ip -j DROP echo "$(date) Banned $ip ($count connections)" >> /var/log/ddos.log fi done
六、总结:防御矩阵
攻击类型 | 防护措施 | 工具/命令 |
---|---|---|
SYN Flood | 启用 SYN Cookie + 限制半连接 | sysctl -w net.ipv4.tcp_syncookies=1 |
CC 攻击 | Web 服务器限速 + Fail2Ban | Nginx limit_req ,fail2ban |
UDP Flood | 禁用无关 UDP 服务 | iptables -A INPUT -p udp -j DROP |
DNS 放大攻击 | 限制 DNS 查询速率 | iptables -A INPUT -p udp --dport 53 -m limit --limit 5/s -j ACCEPT |
IP 欺骗 | 启用反向路径过滤(RPF) | sysctl -w net.ipv4.conf.all.rp_filter=1 |
关键建议:
-
多层防护:结合网络层(iptables)、应用层(Nginx/Apache)、服务层(Cloudflare)防御。
-
持续监控:使用
vnstat
、ntopng
等工具分析流量异常。 -
自动化响应:通过 Fail2Ban 或自定义脚本快速封禁攻击源。
通过以上措施,Linux 服务器可有效抵御大多数 DDoS/DOS 攻击,保障服务稳定性。