13.6.6 防护与加固实践(限流、黑白名单、抗攻击)

在 HAProxy 的 SSL 终止场景中,防护与加固需要与访问控制、连接管理协同设计,核心目标是降低暴露面、限制异常流量、抵御常见攻击并确保服务稳定。本节给出可执行配置、命令验证、排错与练习。

原理草图:限流/黑白名单/抗攻击协同

文章图片

安装与基础准备(示例)

# 以 Debian/Ubuntu 为例
sudo apt update
sudo apt install -y haproxy

# 校验版本与编译选项
haproxy -vv | head -n 20
# 预期:显示 OpenSSL 支持、版本号、编译参数

限流策略示例(连接数、速率、慢速攻击)
配置文件:/etc/haproxy/haproxy.cfg

global
  log /dev/log local0
  maxconn 50000
  tune.ssl.default-dh-param 2048

defaults
  mode http
  log global
  option httplog
  timeout connect 5s
  timeout client  30s
  timeout server  30s
  timeout http-request 10s

frontend fe_https
  bind *:443 ssl crt /etc/haproxy/certs/site.pem alpn h2,http/1.1
  maxconn 20000

  # 连接级限流:超过连接数时排队,队列满则拒绝
  # 解释:maxconn 控制前端连接上限
  # 预期:并发过高时返回 503
  default_backend be_app

  # 请求速率限流:基于源 IP 统计 10s 内请求
  stick-table type ip size 200k expire 10s store http_req_rate(10s),conn_rate(10s)
  http-request track-sc0 src
  acl abuse_req_rate  sc_http_req_rate(0) gt 200
  acl abuse_conn_rate sc_conn_rate(0) gt 60
  http-request deny status 429 if abuse_req_rate or abuse_conn_rate

  # 慢速攻击防护:限制请求头未完成时间
  timeout http-request 5s

backend be_app
  balance roundrobin
  server app1 10.0.0.11:8080 check maxconn 5000
  server app2 10.0.0.12:8080 check maxconn 5000

黑白名单与访问控制示例

frontend fe_https
  bind *:443 ssl crt /etc/haproxy/certs/site.pem
  # 白名单:仅允许管理后台网段访问
  acl is_admin_path path_beg /admin
  acl admin_net src 10.0.0.0/24 192.168.1.0/24
  http-request deny status 403 if is_admin_path !admin_net

  # 黑名单:阻断已知恶意 IP 列表
  acl bad_ip src -f /etc/haproxy/blacklist.ip
  http-request deny status 403 if bad_ip

  # 方法与Header限制
  acl bad_method method TRACE TRACK
  http-request deny status 405 if bad_method

黑名单文件示例:/etc/haproxy/blacklist.ip

203.0.113.10
198.51.100.0/24

抗攻击与安全加固示例(tarpit、请求体大小、异常路径)

frontend fe_https
  bind *:443 ssl crt /etc/haproxy/certs/site.pem

  # 限制请求体大小(防止大包攻击)
  http-request deny status 413 if { req.hdr(Content-Length) -m int gt 10485760 }

  # 过滤高风险路径
  acl risky_path path_reg -i ^/(wp-admin|phpmyadmin|\.git)
  http-request deny status 404 if risky_path

  # 对扫描行为进行 tarpit(延迟响应)
  acl scanner hdr_sub(User-Agent) -i "nmap" "sqlmap" "masscan"
  http-request tarpit if scanner

命令解释与验证方法

# 配置语法检查
haproxy -c -f /etc/haproxy/haproxy.cfg
# 预期:Configuration file is valid

# 重载配置
sudo systemctl reload haproxy

# 查看运行状态
sudo systemctl status haproxy --no-pager

# 统计被限流/拒绝请求(从日志统计)
# 解释:统计 429/403/413/404 以验证策略命中
sudo awk '{print $9}' /var/log/haproxy.log | sort | uniq -c

排错要点(常见问题与定位)
- 连接被误封:检查 stick-table 阈值、expire 是否过短;降低 http_req_rate 阈值或加白名单。
- 返回 503/429 过多:检查 maxconn 与后端 server maxconn 是否过小;检查是否存在连接泄漏或上游超时。
- tarpit 导致延迟:确认匹配条件是否过于宽泛;针对可疑 UA 精确匹配。
- 日志为空:确认 rsyslog/journald 是否接收 haproxy 日志;global log 是否配置正确。

练习
1. 将请求速率阈值改为 100/10s,使用压测工具验证 429 的命中比例。
2. 新增 /api/pay 路径白名单,仅允许 10.10.0.0/16 访问。
3. 配置黑名单文件并动态更新后重载,观察是否即时生效。
4. 将 Content-Length 上限从 10MB 调整为 2MB,验证 413 返回。

补充:限流测试命令(示例)

# 使用 ab 触发速率限制
ab -n 2000 -c 200 https://your.domain.test/

# 使用 curl 验证管理后台访问限制
curl -I https://your.domain.test/admin
# 预期:非白名单来源返回 403

安全联动建议
- 结合上游 WAF 或云防护服务进行 DDoS 清洗,HAProxy 侧做精细化限流与 ACL。
- 将命中日志接入监控告警,关注 403/429/413 比例与趋势。
- 变更前进行灰度与回滚方案准备,避免误杀核心业务流量。