【发布时间】:2021-06-10 01:30:57
【问题描述】:
我正在尝试设置 HAProxy 以拒绝来自用户代理黑名单的请求,但它不起作用。
我正在按照答案中的说明进行操作:https://serverfault.com/a/616974/415429(这是官方 HAProxy 文档中给出的示例:http://cbonte.github.io/haproxy-dconv/1.8/configuration.html#7)
官方文档中的例子是:acl valid-ua hdr(user-agent) -f exact-ua.lst -i -f generic-ua.lst test
我创建了一个演示来模拟用户代理在某种条件下不工作的问题:
defaults
timeout connect 5s
timeout client 30s
timeout server 30s
frontend frontend
mode http
bind :80
acl is_blacklisted_ua hdr(User-Agent) -f /path/to/ua-blacklist.lst
http-request deny deny_status 403 if is_blacklisted_ua
http-request deny deny_status 404
然后,如果我在 localhost:8080 访问浏览器,它会返回状态 404 而不是 403(haproxy 位于将端口 8080 转发到 80 的 docker 容器中)
文件/path/to/ua-blacklist.lst 只是:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36
localhost:8080
其中第一行是我的用户代理(第二行是使用Host 标头进行测试,如下所述)。我可以在 Chrome 检查器中看到它,如果我在 haproxy 中捕获 user-agent 标头并记录它,我也可以看到它(完全一样)。
但如果我改变(仅用于测试目的):
acl is_blacklisted_ua hdr(User-Agent) -f /path/to/ua-blacklist.lst
收件人:
acl is_blacklisted_ua hdr(Host) -f /path/to/ua-blacklist.lst
使用Host 标头。然后它给出403 状态码(它有效,因为它与第二行匹配)。
然后,如果我将文件中的第二行 localhost:8080 更改为 localhost:8081,它会给出 404(如预期的那样)。
所以,似乎用户代理标头没有正确检索,或者与提供的值不匹配(我什至尝试捕获它以查看是否有一些差异,但无济于事)。 Host 标头很有效。
我还尝试使用hdr(user-agent)(小写),以及一些组合,如hdr_sub而不是hdr,以及不区分大小写的-i选项,但所有这些尝试都没有奏效.我确定文件中的user-agent 值是正确的。
更新(2021-03-12)
我能够定义用户代理字符串并使用该用户代理运行 curl:
$ curl -o /dev/null -s -w "%{http_code}\n" -H "user-agent: test-ua" http://localhost:8080
403
我还尝试了一个带有空格 test-ua space 的用户代理,它也可以工作,但是使用用户代理 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36 并没有返回 403。
我会尝试更多地挖掘它,看看我是否能解决。
有什么建议吗?
【问题讨论】:
标签: haproxy