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攻击不断演变,因此保护系统需要定期更新和测试。进行负载测试,分析日志,更新过滤规则,并关注新的攻击方法。
如果您计划构建多层保护系统,建议考虑使用住宅代理来隐藏关键基础设施,以及数据中心代理以高速度处理大量流量。不同类型代理的组合提供了安全性、性能和成本之间的最佳平衡。