返回博客

如何在15分钟内通过代理保护服务器免受DDoS攻击

详细指南:使用代理保护Web服务免受DDoS攻击,包括Nginx和HAProxy的设置、负载均衡和恶意流量过滤。

📅2026年2月23日
```html

DDoS攻击能够在短短几分钟内瘫痪任何网络服务。攻击者从不同的IP地址发送成千上万的请求,超载服务器,使其对真实用户不可用。代理服务器是有效的保护工具之一,它可以过滤恶意流量、分配负载并隐藏您服务器的真实IP地址。

在本指南中,我们将讨论如何设置代理以保护DDoS,使用哪些类型的代理以及如何构建多层安全系统。材料面向系统管理员、网络服务所有者和DevOps专家。

DDoS攻击是如何工作的,代理如何提供帮助

DDoS(分布式拒绝服务)是一种分布式拒绝服务攻击。攻击者使用一个由成千上万的受感染设备组成的僵尸网络,同时向您的服务器发送请求。目标是耗尽服务器的资源(CPU、内存、带宽),使其对合法用户不可用。

主要的DDoS攻击类型:

  • 体积攻击(Volumetric attacks) — 用大量流量填满带宽(DNS放大、UDP洪水)
  • 协议攻击(Protocol attacks) — 利用网络协议中的漏洞(SYN洪水、死亡回声)
  • 应用层攻击(Application layer attacks) — 模拟对Web应用程序的合法请求(HTTP洪水、Slowloris)

代理服务器通过以下几种方式帮助防御DDoS:

  • 隐藏服务器的真实IP地址 — 攻击者只能看到代理的IP,而不是您的主服务器
  • 过滤恶意流量 — 代理分析请求并阻止可疑请求
  • 负载分配 — 多个代理服务器在后端服务器之间分配流量
  • 速率限制 — 限制来自单个IP地址的请求数量
  • 缓存静态内容 — 减轻主服务器的负担

重要的是要理解,代理并不是所有类型DDoS的万灵药。强大的体积攻击可能会填满到代理服务器的带宽。因此,代理在与其他保护方法结合时最为有效:CDN、云反DDoS服务(Cloudflare、AWS Shield)、防火墙。

DDoS保护的代理类型:反向代理与正向代理

用于DDoS保护的主要代理服务器有两种类型:

反向代理(Reverse Proxy)

反向代理位于您的Web服务器前面,接收来自客户的所有传入请求。客户只与代理互动,而不知道您服务器的真实IP地址。这是防御DDoS的主要工具。

流行的反向代理解决方案:

  • Nginx — 快速且轻量的Web服务器,具有反向代理功能
  • HAProxy — 专用负载均衡器,具有强大的过滤能力
  • Apache mod_proxy — Apache的模块,性能低于Nginx
  • Varnish — 专注于缓存的HTTP加速器

正向代理(Forward Proxy)

正向代理用于客户端的传出请求。在DDoS保护的上下文中,它们使用较少,但可以用于:

  • 在访问外部API时隐藏您的服务器IP地址
  • 通过多个IP地址分配传出流量
  • 在收集潜在攻击信息时绕过阻止

对于这些任务,适合使用住宅代理 — 它们具有真实家庭用户的IP地址,看起来像普通流量,这使得它们难以被发现和阻止。

代理类型 DDoS保护的应用 优点
反向代理(Nginx、HAProxy) 接收传入流量、过滤、负载分配 隐藏服务器的真实IP,过滤攻击,缓存内容
住宅代理 隐藏基础设施、监控威胁 真实IP,难以阻止
数据中心代理 额外的保护层,快速处理 高速度,低成本

在Nginx上设置反向代理以保护服务器

Nginx是创建反向代理的最流行工具之一。它快速处理传入请求,支持速率限制,并可以过滤可疑流量。

反向代理的基本设置

在单独的服务器上安装Nginx,该服务器将接收所有传入流量。真实的Web服务器应隐藏在代理后面,仅接受来自代理的请求。

# /etc/nginx/nginx.conf

http {
    # 限制来自单个IP的连接数
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    limit_conn conn_limit 10;

    # 请求数量限制(速率限制)
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    limit_req zone=req_limit burst=20 nodelay;

    # 防止Slowloris的超时设置
    client_body_timeout 10s;
    client_header_timeout 10s;
    keepalive_timeout 5s 5s;
    send_timeout 10s;

    upstream backend {
        # 您真实Web服务器的IP
        server 192.168.1.100:80;
        # 可以添加多个服务器进行负载均衡
        # server 192.168.1.101:80;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            # 将请求转发到后端
            proxy_pass http://backend;
            
            # 转发客户端的原始IP
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            
            # 代理的超时设置
            proxy_connect_timeout 5s;
            proxy_send_timeout 10s;
            proxy_read_timeout 10s;
        }
    }
}

阻止可疑的User-Agent

许多DDoS攻击使用具有特征的User-Agent的机器人。添加规则以阻止它们:

# 阻止已知的机器人
map $http_user_agent $bad_bot {
    default 0;
    ~*bot 1;
    ~*crawler 1;
    ~*spider 1;
    ~*scraper 1;
    "" 1; # 空的User-Agent
}

server {
    listen 80;
    server_name example.com;

    if ($bad_bot) {
        return 403;
    }

    location / {
        proxy_pass http://backend;
    }
}

地理阻止不受欢迎的国家

如果您的服务仅适用于特定国家,可以使用GeoIP模块阻止来自其他地区的流量:

# 安装GeoIP模块
# apt-get install nginx-module-geoip

load_module modules/ngx_http_geoip_module.so;

http {
    geoip_country /usr/share/GeoIP/GeoIP.dat;

    # 仅允许来自俄罗斯和乌克兰的流量
    map $geoip_country_code $allowed_country {
        default no;
        RU yes;
        UA yes;
    }

    server {
        listen 80;
        server_name example.com;

        if ($allowed_country = no) {
            return 403;
        }

        location / {
            proxy_pass http://backend;
        }
    }
}

HAProxy用于负载均衡和流量过滤

HAProxy是一个强大的负载均衡器,具有高级流量过滤功能。它支持复杂的ACL(访问控制列表)以阻止应用层的攻击。

HAProxy的基本配置

# /etc/haproxy/haproxy.cfg

global
    maxconn 50000
    # 日志记录
    log /dev/log local0
    log /dev/log local1 notice

defaults
    mode http
    log global
    option httplog
    option dontlognull
    
    # 超时设置
    timeout connect 5s
    timeout client 30s
    timeout server 30s
    
    # 请求大小限制(防止POST洪水)
    maxconn 3000

frontend http_front
    bind *:80
    
    # 速率限制:每个IP每10秒最多100个请求
    stick-table type ip size 100k expire 30s store http_req_rate(10s)
    http-request track-sc0 src
    http-request deny if { sc_http_req_rate(0) gt 100 }
    
    # 阻止没有Host头的请求
    acl has_host hdr(host) -m found
    http-request deny if !has_host
    
    # 阻止可疑的User-Agent
    acl bad_bot hdr_sub(User-Agent) -i bot crawler spider scraper
    http-request deny if bad_bot
    
    # 转发到后端
    default_backend web_servers

backend web_servers
    balance roundrobin
    option httpchk GET /health
    
    # 后端服务器列表
    server web1 192.168.1.100:80 check
    server web2 192.168.1.101:80 check
    server web3 192.168.1.102:80 check

通过ACL保护HTTP洪水

HTTP洪水是一种攻击,攻击者发送大量合法的HTTP请求。HAProxy允许创建复杂的规则来检测它们:

frontend http_front
    bind *:80
    
    # 跟踪来自单个IP的请求数量
    stick-table type ip size 100k expire 30s store http_req_rate(10s),conn_cur
    http-request track-sc0 src
    
    # 超过限制时阻止请求
    acl too_many_requests sc_http_req_rate(0) gt 50
    acl too_many_connections sc_conn_cur(0) gt 10
    
    http-request deny deny_status 429 if too_many_requests
    http-request deny deny_status 429 if too_many_connections
    
    # 阻止对不存在路径的请求(扫描)
    acl valid_path path_beg /api /static /login /
    http-request deny if !valid_path
    
    default_backend web_servers

信任IP地址的白名单

为信任的IP(例如,您的办公室地址或合作伙伴)创建白名单,这些IP不会受到速率限制:

frontend http_front
    bind *:80
    
    # 信任IP的白名单
    acl whitelist src 203.0.113.0/24 198.51.100.50
    
    # 仅对非白名单IP进行速率限制
    stick-table type ip size 100k expire 30s store http_req_rate(10s)
    http-request track-sc0 src if !whitelist
    http-request deny if { sc_http_req_rate(0) gt 100 } !whitelist
    
    default_backend web_servers

使用住宅代理隐藏基础设施

除了在您的服务器前使用反向代理外,还可以使用住宅代理来额外保护基础设施。这在您需要时尤其重要:

  • 隐藏您的监控服务器的IP地址 — 如果您跟踪DDoS攻击或收集威胁信息,住宅代理将帮助隐藏您的活动
  • 在不暴露基础设施的情况下访问外部API — 您的服务器可以通过住宅代理发出请求,这将使其更难被发现
  • 测试DDoS防护 — 模拟来自不同IP地址的攻击以检查过滤器的有效性

住宅代理具有真实家庭用户的IP地址,使其与普通流量无异。这使得它们难以被阻止,并且能够绕过地理限制。

示例:通过住宅代理监控威胁

假设您想跟踪可能攻击您服务的僵尸网络的活动。使用住宅代理,您可以收集信息,而不暴露您服务器的IP地址:

import requests

# 设置住宅代理
proxies = {
    'http': 'http://username:password@residential-proxy.com:8080',
    'https': 'http://username:password@residential-proxy.com:8080'
}

# 收集潜在威胁的信息
threat_sources = [
    'http://suspicious-site1.com',
    'http://suspicious-site2.com'
]

for source in threat_sources:
    try:
        response = requests.get(source, proxies=proxies, timeout=5)
        # 分析响应以识别攻击模式
        print(f"状态: {response.status_code}, IP: {response.headers.get('X-Your-IP')}")
    except Exception as e:
        print(f"访问{source}时出错: {e}")

过滤规则:如何区分攻击和合法流量

在应用层(L7)防御DDoS的主要难点是区分恶意流量和合法流量。现代攻击模拟真实用户的行为,这使得它们难以被发现。

DDoS攻击的迹象

  • 请求数量的急剧增长 — 在短时间内比正常情况多出2-10倍
  • 相同的User-Agent请求 — 机器人通常使用相同的User-Agent
  • 缺少Referer — 直接请求,没有从其他页面跳转
  • 单一类型的请求 — 针对同一URL的请求,变化极小
  • 缺少JavaScript — 机器人不会在页面上执行JS代码
  • 页面停留时间短 — 机器人在收到响应后立即关闭连接
  • 可疑的IP范围 — 来自同一子网的大量请求

多层过滤

有效的保护使用多个过滤层:

第1层:IP声誉

根据已知的僵尸网络、代理服务器、VPN数据库检查IP地址。阻止声誉不佳的IP。

第2层:速率限制

限制来自单个IP的请求数量。例如,普通用户每分钟不超过50个请求。

第3层:行为分析

检查User-Agent、Referer、cookies、JavaScript执行。阻止缺少这些参数的请求。

第4层:CAPTCHA

对于可疑流量,显示CAPTCHA。机器人无法通过,合法用户只需通过一次。

示例:Nginx中的JavaScript挑战

过滤机器人的简单方法是要求执行JavaScript来设置cookie:

server {
    listen 80;
    server_name example.com;

    # 检查cookie的存在
    set $has_cookie 0;
    if ($http_cookie ~* "verified=true") {
        set $has_cookie 1;
    }

    # 如果没有cookie,显示JS挑战
    location / {
        if ($has_cookie = 0) {
            return 200 '
                <html>
                <head><title>验证</title></head>
                <body>
                <script>
                    document.cookie = "verified=true; path=/";
                    window.location.reload();
                </script>
                <noscript>请启用JavaScript</noscript>
                </body>
                </html>
            ';
        }

        proxy_pass http://backend;
    }
}

实时监控和响应DDoS攻击

有效的DDoS防护需要持续监控流量并快速响应异常。设置监控系统,跟踪关键指标:

  • 每秒请求数量 — 急剧增长可能表明正在进行攻击
  • 唯一IP地址的数量 — DDoS通常来自多个IP
  • 4xx/5xx错误的百分比 — 错误的增加可能是过载的迹象
  • 服务器响应时间 — 延迟增加表明存在问题
  • 资源消耗 — CPU、内存、网络流量

监控工具

工具 用途 特点
Prometheus + Grafana 收集指标和可视化 灵活的警报设置,美观的仪表板
ELK Stack(Elasticsearch、Logstash、Kibana) 实时日志分析 强大的日志搜索,模式识别
Netdata 系统资源监控 简单安装,实时指标
Fail2ban 自动阻止IP 分析日志并阻止可疑IP

在Prometheus中设置警报

创建规则以在发现异常时自动通知:

# prometheus_alerts.yml

groups:
  - name: ddos_detection
    interval: 10s
    rules:
      # 请求数量急剧增加时的警报
      - alert: HighRequestRate
        expr: rate(nginx_http_requests_total[1m]) > 1000
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "检测到高请求率"
          description: "请求率为{{ $value }} req/s"

      # 5xx错误增加时的警报
      - alert: HighErrorRate
        expr: rate(nginx_http_requests_total{status=~"5.."}[5m]) > 10
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "高5xx错误率"
          description: "5xx错误:{{ $value }} req/s"

      # CPU使用率高时的警报
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU使用率高"
          description: "CPU使用率为{{ $value }}%"

使用Fail2ban自动响应

Fail2ban分析日志并自动阻止超过请求限制的IP地址:

# /etc/fail2ban/jail.local

[nginx-req-limit]
enabled = true
filter = nginx-req-limit
logpath = /var/log/nginx/access.log
maxretry = 100
findtime = 60
bantime = 3600
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]

# /etc/fail2ban/filter.d/nginx-req-limit.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*"
ignoreregex =

多层保护:将代理与其他方法结合

代理服务器是防御DDoS的重要组成部分,但它们在与其他方法结合时最为有效。让我们看看多层保护的架构:

第1层:网络保护(L3/L4)

  • 云反DDoS服务 — Cloudflare、AWS Shield、Google Cloud Armor在流量到达您的服务器之前进行过滤
  • 硬件防火墙 — 专用设备用于过滤网络流量
  • BGP黑洞 — 在提供商级别将恶意流量重定向到“黑洞”

第2层:CDN和缓存

  • CDN(内容分发网络) — 将静态内容分发到多个服务器,减少源服务器的负担
  • 代理缓存 — Varnish、Nginx缓存热门页面并直接提供,而无需请求后端
  • 内容优化 — CSS/JS的最小化,图像压缩减少流量

第3层:代理和负载均衡(L7)

  • 反向代理 — Nginx、HAProxy在应用层过滤请求
  • 负载均衡 — 在多个后端服务器之间分配负载
  • 速率限制 — 限制来自单个IP的请求数量
  • WAF(Web应用防火墙) — ModSecurity、AWS WAF阻止对Web应用的攻击

第4层:后端优化

  • 数据库优化 — 索引、请求缓存、只读副本
  • 异步处理 — 重任务在后台通过队列(RabbitMQ、Redis)执行
  • 水平扩展 — 在负载增加时添加新服务器

架构示例

客户
  ↓
Cloudflare(反DDoS L3/L4,CDN)
  ↓
Nginx反向代理(速率限制,过滤)
  ↓
HAProxy(负载均衡)
  ↓
后端服务器(Web应用程序)
  ↓
数据库(带复制)

这样的架构在所有层面提供保护:网络层、传输层、应用层。即使攻击通过了一个层级,下一层也会阻止它。

使用数据中心代理作为额外层

在某些情况下,添加数据中心代理作为CDN与您的服务器之间的中间层是有意义的。它们提供高处理速度,并可以执行额外的流量过滤。数据中心代理比住宅和移动代理便宜,使其成为处理大量流量的经济解决方案。

结论

使用代理服务器保护DDoS攻击是一种有效的方法,可以过滤恶意流量,隐藏服务器的真实IP地址并分配负载。基于Nginx或HAProxy的反向代理提供灵活的过滤规则设置、速率限制和可疑请求的阻止。

我们讨论的关键点:

  • 反向代理(Nginx、HAProxy)是应用层(L7)防护的主要工具
  • 速率限制和基于User-Agent、IP声誉的过滤有助于筛选大多数攻击
  • 住宅代理对隐藏监控基础设施和收集威胁信息很有用
  • 多层保护(CDN + 代理 + WAF + 后端优化)提供最大抵御能力
  • 监控和自动响应对快速发现和阻止攻击至关重要

请记住,DDoS攻击不断演变,因此保护系统需要定期更新和测试。进行负载测试,分析日志,更新过滤规则,并关注新的攻击方法。

如果您计划构建多层保护系统,建议考虑使用住宅代理来隐藏关键基础设施,以及数据中心代理以高速度处理大量流量。不同类型代理的组合提供了安全性、性能和成本之间的最佳平衡。

```