我们的服务器不断遭到某人的袭击。 它不是DDOS。 只有一个IP每秒超过200次的url。 目前我正在通过ip表阻止用户。 我们正在使用HAproxy进行负载平衡。 有没有办法限制一个用户的基础上,他的IP和url被击中?
我不想阻止基于IP,因为NAT的用户可能会受到影响。 假设我想显示503错误页面,如果一个特定的IP在5分钟内击中了像www.example.com/somepage.php?some=option&other=option2超过3000次的相同的url? 这意味着相同的IP可以访问其他url,如www.example.com/somepage.php?another=someotheroption。
这个解决scheme至less需要haproxy 1.6。
首先,将以下内容添加到前端:
http-request set-header X-DOS-Protect %[src];%[req.fhdr(host)]%[capture.req.uri]
然后,将以下内容添加到后端:
stick-table type integer size 1m expire 5m store http_req_rate(5m) tcp-request inspect-delay 5s tcp-request content track-sc0 req.fhdr(X-DOS-Protect),crc32(1) if HTTP http-request tarpit if { sc0_http_req_rate gt 3000 }
我无法find前端跟踪的方法,因为我没有find一种方法将转换器应用到组成X-DOS-Protect标头的连接string上。
我正在使用散列函数,以确保您不会在stick-table中存储巨大的string,因为它很容易导致拒绝服务。 如果你认为这个散列函数由于碰撞太多而不适合你,你也可以通过将crc32应用到每个连接的组件来使它更大(当然,当存储数据并切换到更大的粘贴表存储),如下所示:
http-request set-header X-DOS-Protect %[src,crc32(1)];%[req.fhdr(host),crc32(1)]%[capture.req.uri,crc32(1)]
stick-table type string len 30 size 1m expire 5m store http_req_rate(5m) tcp-request inspect-delay 5s tcp-request content track-sc0 req.fhdr(X-DOS-Protect) if HTTP http-request tarpit if { sc0_http_req_rate gt 3000 }
请注意,对于stick表中的每个条目,这个最后的解决scheme将使用比第一个更多的7倍的内存。 当然,碰撞风险也会小得多。