用 Shell 写一个DOS攻击防范 自动屏蔽攻击IP的代码

以下是一个用于防范 DOS 攻击并自动屏蔽攻击 IP 的 Shell 脚本。这个脚本通过监控系统连接状态,识别异常 IP 并使用 iptables 进行屏蔽。

脚本代码:

#!/bin/bash

# DOS攻击防范脚本 - 自动监控并屏蔽异常IP连接
# 版本: 1.0
# 创建日期: 2025-06-25

# 配置参数
LOG_FILE="/var/log/dos_attack.log"        # 日志文件路径
MAX_CONNECTIONS=100                       # 单个IP最大连接数阈值
CHECK_INTERVAL=30                         # 检查间隔(秒)
BAN_TIME=3600                             # 封禁时间(秒)
IPT_SAVE="/sbin/iptables-save"            # iptables保存命令路径
IPT_RESTORE="/sbin/iptables-restore"      # iptables恢复命令路径
IPTABLES="/sbin/iptables"                 # iptables命令路径

# 确保脚本以root权限运行
if [ "$(id -u)" != "0" ]; then
   echo "此脚本必须以root权限运行" 1>&2
   exit 1
fi

# 初始化日志文件
init_log() {
    if [ ! -f "$LOG_FILE" ]; then
        touch "$LOG_FILE"
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 日志文件已创建" > "$LOG_FILE"
    fi
}

# 记录日志
log() {
    local message="$1"
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> "$LOG_FILE"
}

# 创建封禁IP的链
setup_iptables() {
    # 检查是否已存在DOS防御链
    $IPTABLES -L DOS_BLOCK 2>/dev/null | grep -q 'Chain DOS_BLOCK'
    if [ $? -ne 0 ]; then
        # 创建新链
        $IPTABLES -N DOS_BLOCK
        # 在INPUT链中添加对DOS_BLOCK链的引用
        $IPTABLES -A INPUT -j DOS_BLOCK
        log "创建新的DOS防御链"
    fi
}

# 检查并屏蔽可疑IP
check_and_block() {
    log "开始检查异常连接..."
    
    # 获取连接数超过阈值的IP列表
    suspicious_ips=$(netstat -anp | grep :80 | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | awk -v max="$MAX_CONNECTIONS" '$1 > max {print $2}')
    
    for ip in $suspicious_ips; do
        # 检查IP是否已经被屏蔽
        $IPTABLES -L DOS_BLOCK | grep -q "$ip"
        if [ $? -ne 0 ]; then
            # 屏蔽IP
            $IPTABLES -A DOS_BLOCK -s "$ip" -j DROP
            log "屏蔽异常IP: $ip (连接数超过阈值: $MAX_CONNECTIONS)"
            
            # 设置自动解封
            (sleep "$BAN_TIME"; $IPTABLES -D DOS_BLOCK -s "$ip" -j DROP; log "解封IP: $ip") &
        fi
    done
    
    log "检查完成"
}

# 保存当前防火墙规则
save_firewall_rules() {
    $IPT_SAVE > /etc/iptables/rules.v4
    log "防火墙规则已保存"
}

# 主函数
main() {
    log "===== DOS攻击防范脚本已启动 ====="
    init_log
    setup_iptables
    
    # 主循环
    while true; do
        check_and_block
        save_firewall_rules
        sleep "$CHECK_INTERVAL"
    done
}

# 启动脚本
main    

使用说明

1.脚本功能:

  • 监控系统 TCP 连接,检测异常连接数的 IP
  • 自动使用 iptables 屏蔽可疑 IP 地址
  • 记录所有操作到日志文件
  • 设置自动解封机制,避免永久封禁

2.安装与配置:

    # 将脚本保存为 dos_defense.sh
    chmod +x dos_defense.sh
    sudo mv dos_defense.sh /usr/local/sbin/
    
    # 修改配置参数(可选)
    sudo nano /usr/local/sbin/dos_defense.sh

    3.启动脚本:

    sudo /usr/local/sbin/dos_defense.sh

    4.设置为系统服务(推荐):

    创建服务文件:

    sudo nano /etc/systemd/system/dos-defense.service

    内容如下:

    [Unit]
    Description=DOS Attack Defense Service
    After=network.target
    
    [Service]
    ExecStart=/usr/local/sbin/dos_defense.sh
    Restart=always
    User=root
    
    [Install]
    WantedBy=multi-user.target

    启用并启动服务:

    sudo systemctl enable dos-defense
    sudo systemctl start dos-defense

    5.查看日志:

    tail -f /var/log/dos_attack.log

    6.自定义配置:

    你可以根据实际需求修改脚本开头的配置参数,如调整连接数阈值、检查间隔时间等。

    注意事项

    • 此脚本需要 root 权限运行
    • 确保系统已安装 netstat 工具(通常包含在 net-tools 包中)
    • 建议在测试环境验证后再部署到生产环境
    • 屏蔽 IP 会影响正常用户访问,请根据实际情况调整阈值
    • 如需永久封禁某些 IP,可在脚本外部手动添加 iptables 规则

    这个脚本通过监控系统连接状态,能够有效识别并防范 DOS 攻击,减轻服务器压力,保障服务的可用性。

    未经允许不得转载:云端研习社 » 用 Shell 写一个DOS攻击防范 自动屏蔽攻击IP的代码