以下是一个用于检查服务器是否可能遭受DDoS攻击的Shell脚本示例,该脚本会分析网络连接状态并给出潜在攻击警告:
#!/bin/bash
# DDoS攻击检查脚本
# 设置日志文件路径
LOG_FILE="/var/log/ddos_check.log"
# 阈值设置(可根据实际情况调整)
IP_CONNECTIONS_LIMIT=100 # 单个IP的最大连接数
SYN_RECV_LIMIT=50 # SYN_RECV状态连接阈值
TOTAL_CONNECTION_LIMIT=500 # 总连接数阈值
# 获取当前时间戳
timestamp() {
date +"%Y-%m-%d %T"
}
# 检查异常IP连接
check_ip_connections() {
echo "[$(timestamp)] 正在检查高并发连接IP..."
# 使用ss或netstat获取连接信息
if command -v ss &> /dev/null; then
cmd="ss -ntu | awk '{print \$6}' | cut -d: -f1 | sort | uniq -c | sort -nr"
else
cmd="netstat -ntu | awk '{print \$5}' | cut -d: -f1 | sort | uniq -c | sort -nr"
fi
eval $cmd | while read count ip; do
if [[ "$count" -gt $IP_CONNECTIONS_LIMIT && "$ip" != "Address" ]]; then
echo "[$(timestamp)] 警告! 疑似异常IP: $ip 当前连接数: $count" | tee -a $LOG_FILE
fi
done
}
# 检查SYN_RECV状态连接(SYN洪水攻击特征)
check_syn_flood() {
echo "[$(timestamp)] 正在检查SYN_RECV状态连接..."
if command -v ss &> /dev/null; then
syn_count=$(ss -n state syn-recv | wc -l)
else
syn_count=$(netstat -n -t | grep SYN_RECV | wc -l)
fi
if [[ $syn_count -gt $SYN_RECV_LIMIT ]]; then
echo "[$(timestamp)] 警告! SYN_RECV连接数异常: $syn_count" | tee -a $LOG_FILE
fi
}
# 检查总连接数
check_total_connections() {
echo "[$(timestamp)] 正在检查总连接数..."
if command -v ss &> /dev/null; then
total=$(ss -s | grep "TCP:" | awk '{print $2}')
else
total=$(netstat -ant | wc -l)
fi
if [[ $total -gt $TOTAL_CONNECTION_LIMIT ]]; then
echo "[$(timestamp)] 警告! 总连接数异常: $total" | tee -a $LOG_FILE
fi
}
# 执行所有检查
main() {
echo "==== 开始DDoS检查 ===="
check_ip_connections
check_syn_flood
check_total_connections
echo "==== 检查完成 ===="
}
# 以root权限运行
if [[ $EUID -ne 0 ]]; then
echo "错误: 需要root权限运行此脚本" >&2
exit 1
fi
main | tee -a $LOG_FILE
使用说明
- 保存脚本为
ddos_check.sh
- 赋予执行权限:
chmod +x ddos_check.sh
- 以root权限运行:
sudo ./ddos_check.sh
功能说明
-
异常IP检测:
- 检查单个IP的并发连接数
- 默认阈值:100个连接(通过
IP_CONNECTIONS_LIMIT
调节)
-
SYN洪水攻击检测:
- 监控
SYN_RECV
状态连接数 - 默认阈值:50个(通过
SYN_RECV_LIMIT
调节)
- 监控
-
总连接数监控:
- 监控服务器总连接数
- 默认阈值:500(通过
TOTAL_CONNECTION_LIMIT
调节)
-
自动日志记录:
- 所有警告信息会记录到
/var/log/ddos_check.log
- 包含时间戳记录
- 所有警告信息会记录到
建议增强措施
-
定时监控:
# 每5分钟执行一次检查 */5 * * * * root /path/to/ddos_check.sh
-
自动阻止可疑IP(谨慎使用):
# 在检查到异常IP时自动封锁(需要iptables) iptables -A INPUT -s $ip -j DROP
-
集成专业工具:
- 使用
fail2ban
进行自动封锁 - 部署Cloudflare等专业DDoS防护服务
- 使用
nload
或iftop
进行实时流量监控
- 使用
注意事项
- 阈值设置需要根据服务器实际负载调整
- 本脚本只能检测基础攻击特征,复杂攻击需要专业方案
- 生产环境建议使用专业DDoS防护设备/服务
- 频繁检查可能影响服务器性能,建议合理设置检查间隔
建议结合网络监控工具(如Zabbix、Nagios)实现更全面的监控方案。