DDoS 攻击,深入浅出理解拒绝服务攻击

前言

近过年时间,DeepSeek 大火,自古以来,树大招风,引来了 DDoS(Distributed Denial of Service)攻击,造成服务一顿中断。DDoS 攻击是一个复杂的技术话题,但我们可以通过从 DoS(Denial of Service)攻击的基础入手,逐步深入理解 DDoS。这里我们将以 DoS 攻击为起点,逐步解释其概念、工作原理以及演变,最终帮助大家全面了解 DDoS 攻击的方式与防御策略。通过深入浅出的讲解,大家可以更清晰地认识到 DDoS 攻击背后的技术细节和潜在威胁,同时也能学习如何有效防范这种日益严重的安全风险。

DDoS又名分布式拒绝服务攻击,在解释这个概念之前,我们先来了解一下什么是DoS攻击。

预防DDos

使用 Cloudflare/CDN 进行流量清洗。 配置 iptables 限速,防止单个 IP 过度访问:

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

使用 iptables 防止某个 IP 在短时间内建立大量连接:

iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 20 -j DROP

该规则表示:若某 IP 在 60 秒内创建了超过 20 次连接,则直接丢弃后续请求。

2. 拒绝伪造来源 IP(SYN Flood 防御)

# 丢弃不合法的新连接请求(非 SYN)
iptables -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

# 拒绝恶意扫描包
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

3. 自动封锁恶意 IP(结合 fail2ban)

安装 fail2ban:

sudo apt install fail2ban -y

配置 /etc/fail2ban/jail.d/nginx-ddos.conf

[nginx-dos]
enabled = true
port = http,https
filter = nginx-dos
logpath = /var/log/nginx/access.log
maxretry = 100
findtime = 60
bantime = 3600

过滤规则 /etc/fail2ban/filter.d/nginx-dos.conf

[Definition]
failregex = ^<HOST> -.*"(GET|POST).*
ignoreregex =

fail2ban 会在单位时间内访问过多时自动封锁该 IP。

二、应用层防御:Web Server 限速配置

1. Nginx 限速防止 HTTP Flood

配置 Nginx 的请求速率控制:

http {
    limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;

    server {
        location / {
            limit_req zone=perip burst=10 nodelay;
        }
    }
}

该配置表示每个 IP 每秒最多请求 5 次,超过部分会被限速或拒绝。

2. 控制连接并发数

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location / {
            limit_conn addr 10;
        }
    }
}

此规则限制每个 IP 同时最多建立 10 个并发连接。

3. 屏蔽恶意 User-Agent

map $http_user_agent $block_ua {
    default 0;
    "~*curl" 1;
    "~*bot" 1;
    "~*scanner" 1;
}

server {
    if ($block_ua) {
        return 403;
    }
}

三、DNS 放大攻击防护(适用于自建 DNS 服务)

1. 禁用递归解析

以 BIND 为例,修改 /etc/bind/named.conf.options

options {
    recursion no;
    allow-query { trusted_ips; };
};

仅允许内部授权 IP 查询 DNS,避免被放大攻击滥用。

四、使用 Cloudflare 或高防服务商进行流量清洗

1. 启用代理防御

将域名接入 Cloudflare 后,将 DNS 记录状态设置为“Proxied”,即启用代理流量保护。

2. 配置防火墙规则

通过 Cloudflare 面板添加规则:

  • 限制来源国家或 IP
  • 根据 UA 筛选请求
  • 按路径或参数进行条件过滤

示例表达式:

(http.request.uri.path contains "/login") and (ip.src ne 1.2.3.4)

执行动作设置为 Challenge 或 Block。

五、实时监控与报警机制

1. 使用 Netdata 进行资源监控

安装 Netdata:

bash <(curl -Ss https://my-netdata.io/kickstart.sh)

通过浏览器访问 http://<服务器IP>:19999,查看网络流量、连接数、CPU 使用情况等实时数据。

2. Prometheus + Grafana 构建可视化告警系统

  • 使用 Node Exporter 采集系统级别指标
  • 配置 Prometheus 定期拉取指标数据
  • 使用 Grafana 构建图形化仪表盘
  • 配置 Alertmanager 将告警推送至邮件、钉钉、飞书等平台

六、紧急封堵脚本(批量封禁高连接数 IP)

编写脚本 /usr/local/bin/ddos-block.sh

#!/bin/bash

block_ip() {
    ip=$1
    echo "$(date) 阻断 $ip" >> /var/log/ddos_block.log
    iptables -I INPUT -s $ip -j DROP
}

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | \
awk '$1 > 200 {print $2}' | while read ip; do
    block_ip $ip
done

加上执行权限:

chmod +x /usr/local/bin/ddos-block.sh

通过定时任务定期执行:

*/2 * * * * root /usr/local/bin/ddos-block.sh

七、安全策略汇总建议

防护场景 推荐措施
带宽洪水攻击 使用 CDN / 高防 IP 清洗
SYN/UDP Flood 设置 iptables 限制并发连接
应用层请求泛滥 Nginx 限流、防 UA、防并发
DNS 放大攻击 禁止递归,仅允许授权 IP
实时监控与预警 Netdata 或 Prometheus 系统
持续性主动阻断 fail2ban + iptables 自动化策略

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 DDoS攻击 》

本文链接:http://0.0.0.0:3015/tech/ddos-deepseek.html

本文最后一次更新为 天前,文章中的某些内容可能已过时!