我尝试使用 haproxy ACL 和 -f 选项从文件中读取数据,以拒绝来自特定用户代理的连接(通过匹配用户代理标头的子字符串)。但是它不起作用,它运行时就像配置被忽略一样。
有经验的人能指出我遗漏了什么吗?或者一些关于如何调试此 haproxy 配置的提示?
我正在运行 haproxy 1.4.18。
这是 haproxy.cfg 的摘录:
listen http 0.0.0.0:80
acl abuser hdr_sub(user-agent) -f /etc/haproxy/abuser.lst
tcp-request content reject if abuser
mode http
server www1 127.0.0.1:8080 maxconn 10000
这是 abuser.lst 文件的内容:
# annoying bots
annoyingbot1
annoyingbot2
答案1
这个问题很老了,但万一其他人遇到这个问题:
您的问题源于tcp-request content
HAProxy 在有时间接收/读取任何第 7 层数据之前运行。
如何解决这个问题?
简单:添加tcp 请求检查延迟:
listen http 0.0.0.0:80
tcp-request inspect delay 15s
acl abuser hdr_sub(user-agent) -f /etc/haproxy/abuser.lst
tcp-request content reject if abuser
mode http
server www1 127.0.0.1:8080 maxconn 10000
以下是 HAProxy 文档中关于此问题的重要内容:
请注意,在执行内容检查时,haproxy 将评估每个新进入的块的整个规则,同时考虑到这些数据是部分的。如果在上述延迟之前没有规则匹配,则在到期时执行最后一次检查,这次检查认为内容是确定的。如果没有设置延迟,haproxy 将不会等待,并会立即根据可用信息做出判定。显然这不太可能很有用,甚至可能很不雅,所以不推荐这样的设置。