请求编写抵御DDoS攻击的连接数监控与IP封禁脚本
请求编写抵御DDoS攻击的连接数监控与IP封禁脚本
没问题,我来帮你搞定这个脚本,同时给你一些实用建议让它更靠谱。下面是一个基于bash的脚本,完全满足你的需求,我会一步步解释它的逻辑:
完整脚本代码
#!/bin/bash # 定义要排除的IP EXCLUDE_IP="87.91.143.119" # 连接数阈值 THRESHOLD=100 # 使用ss命令获取所有TCP/UDP连接的远程IP(比netstat更高效),统计每个IP的连接数 ss -ntu | awk '{print $5}' | cut -d: -f1 | grep -v '^$' | sort | uniq -c | sort -nr | while read COUNT IP; do # 跳过排除的IP if [ "$IP" == "$EXCLUDE_IP" ]; then continue fi # 如果连接数超过阈值,执行封禁 if [ "$COUNT" -gt "$THRESHOLD" ]; then echo "$(date): Banning IP $IP with $COUNT connections" >> /var/log/ddos_ban.log # 使用iptables封禁IP(如果用firewalld可替换为firewall-cmd相关命令) iptables -A INPUT -s "$IP" -j DROP # 可选:同时封禁出站连接(按需开启) # iptables -A OUTPUT -d "$IP" -j DROP fi done
脚本逻辑解释
- 连接数统计:用
ss -ntu获取所有TCP和UDP的连接(如果只需要TCP可去掉u参数),通过awk、cut提取远程IP,再用uniq -c统计每个IP的连接数,最后按连接数倒序排列。 - 排除特定IP:通过条件判断跳过你指定的
87.91.143.119,不管它的连接数多少都不会被封禁。 - IP封禁与日志:当IP连接数超过阈值时,用
iptables添加DROP规则拦截流量,同时把封禁记录写入/var/log/ddos_ban.log日志文件,方便后续排查。
实用建议
- 优先用ss替代netstat:
ss是netstat的新一代替代工具,性能远高于netstat,在高连接数场景下响应更快。如果你的系统没有ss,可以替换成netstat -ntu,逻辑完全一致。 - 定时运行脚本:把脚本放到cron定时任务里,比如每2分钟运行一次,实现持续监控:
# 编辑cron任务 crontab -e # 添加一行:每2分钟运行一次脚本(假设脚本路径是/usr/local/bin/ddos_ban.sh) */2 * * * * /usr/local/bin/ddos_ban.sh - 添加自动解封机制:长时间封禁可能会误杀正常IP,你可以写个解封脚本,比如每天凌晨自动清空封禁规则:
然后添加到cron:# 解封脚本示例(保存为/usr/local/bin/ddos_unban.sh) #!/bin/bash iptables -F INPUT iptables -F OUTPUT echo "$(date): Unbanned all IPs" >> /var/log/ddos_ban.log0 0 * * * /usr/local/bin/ddos_unban.sh - 测试后再上线:先手动运行脚本,检查日志和iptables规则,确认没有误封禁正常IP后,再放到定时任务里。
- 防火墙规则持久化:如果用iptables,记得安装
iptables-persistent(Debian/Ubuntu)或iptables-services(CentOS/RHEL),防止服务器重启后封禁规则丢失。
额外提醒
如果你的服务器面临大规模DDoS攻击,单纯靠这个脚本可能不够,建议配合专业工具(比如fail2ban)或者联系服务商开启云端DDoS防护服务,这样能更全面地抵御攻击。
备注:内容来源于stack exchange,提问作者MaxIT
相关产品推荐
相关产品推荐

