Bash DDoS防御助手
《Bash DDoS防御助手》是一款基于Shell脚本编写的轻量级DDoS攻击缓解工具,它主要运行于Linux环境,通过实时监控服务器网络流量,自动识别并过滤异常的高并发请求和恶意数据包,该脚本通常结合iptables等防火墙工具,对恶意IP进行快速拦截与阻断,防止服务器因资源耗尽而宕机,其核心优势在于无需安装复杂软件,部署灵活、响应迅速,适用于个人站长或中小企业作为应急响应和基础网络安全防护的有效补充方案。
实用DDoS防御脚本编写与应用指南
在当今的互联网环境中,分布式拒绝服务攻击是目前最常见、也最具破坏性的网络威胁之一,攻击者通过控制大量僵尸网络向目标服务器发送海量请求,耗尽服务器带宽或系统资源,导致正常用户无法访问,虽然市面上有众多昂贵的高防IP和云清洗服务,但对于中小型站长和企业来说,在服务器前端部署一套轻量级的“DDoS防御脚本”往往是性价比极高的第一道防线。
本文将深入探讨DDoS防御脚本的工作原理,并提供实用的脚本示例,帮助你在面对突发流量时守住阵地。
DDoS防御脚本的核心逻辑
DDoS防御脚本并非万能药,它主要针对应用层(Layer 7)和部分传输层(Layer 4)的中小规模洪水攻击,其核心逻辑可以概括为以下三步:
- 监控与检测:实时分析服务器网络连接状态(如通过
netstat或ss命令),或者检查Web服务器访问日志,统计每个IP的并发连接数或请求频率。 - 阈值判定:设定安全阈值(如单IP并发连接超过100个,或每秒请求超过50次),一旦某IP的统计数据突破该阈值,即判定为可疑攻击源。
- 动态拦截:将恶意IP写入防火墙规则(如iptables、firewalld或ipset)中进行阻断,并设置封禁时间,过期后自动解封,以防误杀正常用户。
实战:基于Shell与iptables的基础防御脚本
以下是一个在Linux环境下广泛使用的轻量级防御脚本,它通过监控TCP连接数,自动封禁异常IP,非常适合防御基础的SYN Flood或HTTP Get Flood攻击。
# 配置区
MAX_CONNECTION=150 # 单IP最大允许并发连接数
BAN_TIME=3600 # 封禁时间(秒),这里为1小时
WHITE_LIST="127.0.0.1 8.8.8.8" # 白名单IP,空格隔开
LOG_FILE="/var/log/ddos_defender.log"
while true; do
# 获取当前所有TCP连接中状态为 ESTABLISHED 和 SYN_RECV 的IP及其连接数
# 按连接数从大到小排序
IPS=$(netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 20)
echo "$IPS" | while read -r line; do
COUNT=$(echo $line | awk '{print $1}')
IP=$(echo $line | awk '{print $2}')
# 跳过空行和本地回环
if [[ -z "$IP" ]]; then
continue
fi
# 检查是否在白名单中
IS_WHITE=0
for WHITE_IP in $WHITE_LIST; do
if [[ "$IP" == "$WHITE_IP" ]]; then
IS_WHITE=1
break
fi
done
if [[ $IS_WHITE -eq 1 ]]; then
continue
fi
# 如果连接数超过阈值,且该IP尚未被封禁,则执行封禁
if [[ $COUNT -gt $MAX_CONNECTION ]]; then
if ! iptables -C INPUT -s $IP -j DROP &>/dev/null; then
iptables -I INPUT -s $IP -j DROP
echo "$(date '+%Y-%m-%d %H:%M:%S') - [BANNED] IP: $IP, Connections: $COUNT" >> $LOG_FILE
# 使用at或systemd timer设定期解封,简单起见这里用后台sleep实现
(sleep $BAN_TIME && iptables -D INPUT -s $IP -j DROP && echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNBANNED] IP: $IP" >> $LOG_FILE) &
fi
fi
done
# 检测间隔,建议不要太频繁以免占用CPU
sleep 30
done
使用方法:
将上述代码保存为ddos_defender.sh,赋予执行权限chmod +x ddos_defender.sh,并使用nohup ./ddos_defender.sh &在后台运行。
进阶:基于Nginx日志的应用层防御脚本
对于HTTP Flood攻击,监控网络连接数有时不够精准,因为攻击者可能使用慢速攻击(Slowloris)或维持极少的连接数但疯狂发送HTTP请求,分析Nginx访问日志是更好的选择。
#!/usr/bin/env python3
# DDoS防御脚本 - 基于Nginx日志的频率分析
import re
import subprocess
from collections import defaultdict
import time
LOG_FILE = "/var/log/nginx/access.log"
MAX_REQ = 100 # 单IP每分钟最大请求数
BAN_CMD = "iptables -I INPUT -s {ip} -j DROP"
def get_ip_counts(log_file):
ip_counts = defaultdict(int)
# 正则匹配IP地址
ip_pattern = re.compile(r'^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')
# 检查最近60秒内的日志
cutoff_time = time.time() - 60
try:
with open(log_file, 'r') as f:
for line in f:
# 简化处理:通过文件读取时间戳对比(实际生产中需更精确的日志解析)
match = ip_pattern.match(line)
if match:
ip = match.group(1)
ip_counts[ip] += 1
except FileNotFoundError:
print("Nginx日志文件未找到")
return ip_counts
def ban_ip(ip):
try:
subprocess.run(BAN_CMD.format(ip=ip), shell=True, check=True)
print(f"已封禁恶意IP: {ip}")
except Exception as e:
print(f"封禁IP {ip} 失败: {e}")
if __name__ == "__main__":
ip_data = get_ip_counts(LOG_FILE)
for ip, count in ip_data.items():
if count > MAX_REQ:
print(f"警告: IP {ip} 在一分钟内请求 {count} 次,触发阈值!")
ban_ip(ip)
脚本防御的局限性及优化建议
尽管上述“DDoS防御脚本”能在关键时刻发挥奇效,但我们必须清醒地认识到其局限性:
- 性能瓶颈:
netstat或日志分析本身会消耗服务器CPU和IO资源,当攻击流量极大时,脚本自身的运行可能反而加剧服务器负载。 - 无法防御纯带宽攻击:如果攻击者采用大流量ICMP Flood或UDP反射攻击直接打满你的服务器入口带宽,任何服务器内部的脚本都无法解决问题,流量根本进不了服务器。
- 误杀风险:NAT网络(如学校、大型企业出口)下,大量正常用户可能共享同一个公网IP,简单的阈值封禁容易导致误杀。
优化建议:
- 优先使用
ipset替代频繁增删iptables规则,ipset在处理大规模IP黑名单时性能远优于直接操作iptables。 - 结合
Fail2Ban等成熟工具,它们拥有更完善的正则匹配和规则管理机制。 - 将脚本作为应急响应手段之一,定期配合高防机房、CDN(内容分发网络)和云WAF进行全网演练。
编写一个高效的“DDoS防御脚本”是每位运维工程师和站长的必备技能,它不仅能帮助你抵御日常的自动化扫描和中小规模CC攻击,更是深入理解Linux网络栈和安全机制的绝佳实践,但在面对真正的大规模DDoS攻击时,切勿单打独斗,及时接入云端清洗服务才是万全之策,安全防护是一场持久战,脚本只是你武器库中的一把锋利的匕首。

