Haproxy:拒绝来自文件的用户代理流量

rau*_*fer 8 access-control-list blocking http-headers haproxy useragent

我正在尝试使用带有 -f 选项的 haproxy ACL 从文件中读取来拒绝来自特定用户代理的连接(通过匹配用户代理标头的子字符串)。但是它不起作用,它运行时好像忽略了配置。

有更多haproxy经验的人可以指出我缺少什么吗?或者关于如何调试这个 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
Run Code Online (Sandbox Code Playgroud)

这是abuser.lst 文件的内容:

# annoying bots
annoyingbot1
annoyingbot2
Run Code Online (Sandbox Code Playgroud)

liq*_*ity 5

这个问题很老,但万一其他人遇到这个问题:

您的问题来自于tcp-request content在 HAProxy 有时间接收/读取任何第 7 层数据之前运行的事实。

如何解决这个问题?

简单:添加一个tcp-request inspect-delay

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
Run Code Online (Sandbox Code Playgroud)

以下是 HAProxy 文档中关于此的重要信息:

请注意,在执行内容检查时,haproxy 将评估每个进入的新块的整个规则,并考虑到这些数据是部分数据的事实。如果在上述延迟之前没有规则匹配,则在到期时执行最后一次检查,这次考虑到内容是确定的。如果未设置延迟,haproxy 将根本不会等待,并会立即根据可用信息做出裁决。显然,这不太可能非常有用,甚至可能会很活泼,因此不建议使用此类设置。