Squid 返回 400 到 GET / HTTP/1.1 和主机头

Squid 返回 400 到 GET / HTTP/1.1 和主机头

我需要演示和测试 Squid 设置,默认情况下应将其列入黑名单,并仅允许来自已知网络的白名单 URL 的请求。它目前在我的临时环境中运行,并且工作正常,但我想根据需要对其进行测试和演示,并获得比 curl 更好的反馈。

我已经部署了 Redbot (https://github.com/mnot/redbot),我已将其设置为通过 Squid 代理发送所有 HTTP 请求

使用curl -xRedbot 机器,我的所有测试都通过了,但使用该应用程序,无论发生什么情况,Squid 都会返回 400。所有请求都发给 Squid,我看到了每个请求,但没有返回 403 和X-Squid-Error: ERR_ACCESS_DENIED 0,也没有允许请求,而是每个请求都得到 400 和X-Squid-Error: ERR_INVALID_URL 0

深入研究日志和 tcpdump,我发现的主要区别是 Redbot 发送了以下形式的请求:

GET / HTTP/1.1
Host: chess.com

Curl 发送:

GET http://chess.com/ HTTP/1.1
Host: chess.com

从 RFC 来看,Redbot 的请求似乎完全有效,因此我觉得 Squid 应该做正确的事情,从主机头推断出 Redbot 想要什么,然后检查其 ACL。但是,它只是报错:

HTTP/1.1 400 Bad Request
Server: squid/3.5.27
Mime-Version: 1.0
Date: Mon, 23 Apr 2018 11:50:23 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3465
X-Squid-Error: ERR_INVALID_URL 0
X-Cache: MISS from proxy.redaction.com
Via: 1.1 proxy.redaction.com (squid/3.5.27)

这看起来像是 Squid 配置问题吗?还是我需要让 Redbot 像 Curl 那样发出请求?

更新:

添加intercept指令后http_port,Host 标头会进入 URL,但现在 Squid 给出了 403,即使 ACL 应该允许这样做:

z1524498993.558      0 10.8.0.33 TCP_MISS/403 3985 GET
http://www.openstreetmap.com/ - HIER_NONE/- text/html
1524498993.559      0 10.8.2.19 TCP_MISS/403 4077 GET
http://www.openstreetmap.com/ - ORIGINAL_DST/10.8.0.33 text/html


acl cluster src 10.8.0.0/16
acl streetmap dstdomain .openstreetmap.com
http_access allow cluster streetmap
http_access deny all

相关内容