在当今的数字世界中,服务器安全性成为了每个企业或个人都必须面对的重要议题。特别是当面对如DoS(拒绝服务)攻击等网络威胁时,一个有效的防范措施显得尤为关键。本文将探讨如何通过自动屏蔽攻击IP来增强您的服务器抵御DoS攻击的能力,并提供一个实用的Bash脚本作为参考。

理解DoS攻击

DoS攻击是一种恶意行为,通过向目标服务器发送大量无用的请求,耗尽其资源,使合法用户无法访问服务。这种攻击不仅影响服务器的正常运行,还可能导致数据丢失、系统崩溃等严重后果。

自动屏蔽攻击IP的策略

为了有效应对DoS攻击,我们需要一个能够实时监控服务器流量,并自动识别和屏蔽攻击IP的系统。以下是实现这一目标的基本步骤:
  1. 监控服务器日志:通过分析Nginx等服务器的访问日志,我们可以识别出异常流量模式,如短时间内来自同一IP的大量请求。
  2. 识别攻击IP:使用脚本或工具对日志数据进行处理,提取出那些行为异常的IP地址。
  3. 自动屏蔽:一旦发现攻击IP,立即使用iptables等防火墙工具将其加入黑名单,阻止其进一步的访问。
  4. 记录和报告:将屏蔽的IP地址和时间记录在日志文件中,以便后续分析和报告。

实用Bash脚本

下面是一个基于上述策略的Bash脚本示例。请注意,此脚本应在具有相应权限的服务器上运行,并且可能需要根据您的实际环境进行调整。
#!/bin/bash  

# 定义日志文件路径和临时黑名单文件路径  
LOG_FILE=/usr/local/nginx/logs/demo2.access.log  
BLACKLIST_FILE=/tmp/blacklist.txt  
DROP_LOG=/tmp/drop_ip.log  
  
# 获取当前时间并格式化为日期  
DATE=$(date +"%d/%b/%Y:%H:%M")  
  
# 从日志文件中提取异常IP地址(这里假设每分钟超过10个请求的IP为异常)  
tail -n 5000 $LOG_FILE | grep "$DATE" | awk '{print $1, $4}' | sort -n | uniq -c | awk '$1 > 10 {print $2}' > $BLACKLIST_FILE  
  
# 读取黑名单文件,并屏蔽这些IP地址  
while IFS= read -r IP; do  
    if ! iptables -vnL INPUT | grep -q "$IP"; then  
        iptables -I INPUT -s "$IP" -j DROP  
        echo "$(date +'%F_%T') $IP" >> $DROP_LOG  
        echo "Blocked IP: $IP"  
    fi  
done < $BLACKLIST_FILE  
  
# (可选)清理过时的iptables规则,避免规则过多导致性能下降  
# 这里可以根据需要添加逻辑来定期清理旧的屏蔽规则
  • 脚本首先定义了所需的文件路径和日期格式。
  • 使用tailgrep命令结合当前时间从Nginx访问日志中提取最近的访问记录。
  • 通过awksort命令处理这些记录,识别出每分钟请求次数超过10次的IP地址,并将它们写入临时黑名单文件。
  • 脚本接着读取黑名单文件中的每个IP地址,并使用iptables命令将它们加入INPUT链的DROP目标中,从而屏蔽这些IP的访问。同时,将屏蔽操作记录在日志文件中。
  • 最后,您可以根据需要添加额外的逻辑来定期清理iptables中的旧规则,以保持防火墙的性能。

请注意,此脚本是一个基本示例,可能需要根据您的服务器配置、日志格式和安全策略进行定制。在实际使用中,还应考虑脚本的性能影响、错误处理和日志管理等方面的问题。