我试图实施一个系统来阻止 ips 如果他们恶意行事。它似乎在测试中工作,但我在我的生活环境中得到了一些好坏参半的结果。
我尝试做的是阻止连接,如果它们的错误率 > 10、错误计数 > 50 或请求率 > 150。
首先,我的前端代理具有以下配置:
stick-table type ip size 100k expire 30s store http_err_rate(10000),http_err_cnt,http_req_rate(10000)
tcp-request connection track-sc0 src
tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
tcp-request connection reject if { sc0_http_err_rate gt 10 }
tcp-request connection reject if { sc0_http_err_cnt gt 50 }
tcp-request connection reject if { sc0_http_req_rate gt 150 }
我最近有一个 ip 进行扫描,它没有被 haproxy 阻止,在被 ip-tables 阻止之前,我检查了 IP 上的统计信息,结果显示:
echo "show table clientsecure key x.x.x.x" | socat stdio /var/run/haproxy.stat
# table: clientsecure, type: ip, size:102400, used:23
xx: key=x.x.x.x use=8 exp=0 http_req_rate(10000)=144 http_err_cnt=34235 http_err_rate(10000)=150
我觉得我对 haproxy 配置有一个根本的误解。
我是否通过以下 tcp-request 连接规则正确使用了stick-table?
如果一条规则匹配,“tcp-request 连接拒绝”会阻止传入连接,还是它们都需要匹配?
编辑:
经过进一步测试,我发现规则仅在新连接上检查。因此,使用“option httpclose”将在人们达到限制后立即阻止他们。由于速度原因显然不是理想的,所以要尝试保持活动超时。