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 比例与趋势。
- 变更前进行灰度与回滚方案准备,避免误杀核心业务流量。