我正在配置一个 squid 代理,作为流量出口的一种网关。部署该代理的环境有一个客户端,它通过负载平衡器发出请求,然后将其发送到 squid 代理。为了不混淆原始客户端 ip,负载平衡器使用代理协议。Squid (3.5+)“支持”代理协议并允许在 acl 中使用它。我见过的允许代理协议访问的有效配置如下:
acl localnet src 10.0.0.0/8
http_port 3128 require-proxy-header
http_port 3128
proxy_protocol_access allow localnet
但是,这不允许我根据 dstdomain 过滤后续请求。我也尝试过
acl allowed dstdomain .google.com
acl localnet src 10.0.0.0/8
http_port 3128 require-proxy-header
http_port 3128
proxy_protocol_access allow localnet allowed
但这会导致我的 curl 请求返回错误 53 空请求。我试过了
acl allowed dstdomain .google.com
http_port 3128 require-proxy-header
http_port 3128
proxy_protocol_access allow allowed
这与上面的行为相同。我也试过了
acl localnet src 10.0.0.0/8
http_port 3128 require-proxy-header
http_port 3128
proxy_protocol_access allow localnet
acl allowed dstdomain .google.com
http_access allow allowed
http_access deny all
这样就允许所有流量出去了。(我也尝试交换这两个块,结果相同。
我是不是漏掉了什么?有人有可以进行域名过滤的有效配置吗?和代理协议?
答案1
在仔细查看之后,我能够修复配置,以便它能够正常工作。这有效:
acl localnet src 10.0.0.0/8
http_port 3128 require-proxy-header
http_port 3128
proxy_protocol_access allow localnet
acl allowed dstdomain .google.com .yahoo.com
http_access allow allowed
http_access deny all
http_access deny all
尽管我之前尝试过这个,但是我遇到了上面列出的障碍。
proxy_protocol_access 只是确定了从哪里可以接受代理协议。在重新加载时查看 cache.log 时,似乎表明 proxy_protocol_access 中的任何 dstdomain 过滤实际上都是不允许的。
需要注意的是:规则按照配置中出现的顺序应用,匹配的规则才会应用。因此,如果上面出现拒绝,则请求被拒绝。
debug_options
可以使用专门debug_options 3,28
用于配置文件故障排除的附加日志信息来提供故障排除信息。(更多信息请点击此处:http://wiki.squid-cache.org/KnowledgeBase/DebugSections)
http://www.squid-cache.org/Doc/config/proxy_protocol_access/
答案2
有点晚了,但是对于那些使用 Squid 作为正向代理(即出口到互联网)的人来说,在 Squid 和你的工作负载之间有负载平衡器,你可能想以这种方式尝试一下。
当客户端位于 AWS 网络负载均衡器后面时,我无法在 Squid 转发代理上找到我的客户端 IP 地址。相反,NLB 的 IP 地址被记录并在 Squid 转发代理上检测到,导致我的域过滤出现问题。
为了解决这个问题,我为 NLB 和 Squid 都启用了代理协议。
在 Squid 配置中:
acl localnet src 10.0.0.0/20
acl loadbalancers src 10.0.16.0/27 10.0.16.32/27
其中 localnet 是您的 vpc 或子网,您的工作负载托管于此。而 loadbalancers 是您的 NLB 的 IP。如果您使用的是 AWS NLB,请启用代理协议 V2,这会将代理协议标头附加到请求中 - 通知下游服务器留意您的客户端 IP 地址。
http_port 3128 require-proxy-header
#http_port <some-other-port-if-required>
对于您的 http 侦听器端口和模式,只需为此端口声明一次即可。您需要模式 require-proxy-header,因为 squid 随后会查找负载均衡器后面的客户端 IP。如果您两次公开同一个端口,您将在访问日志中收到重复侦听器错误。
proxy_protocol_access allow loadbalancers
根据文档,您需要在启用 require-proxy-header 模式时使用 来声明这一点。本质上说,您的负载均衡器是代理,并将发送代理标头,请留意客户端 IP。
acl mydomains dstdomain .google.com .yahoo.com
http_access allow mydomains localnet
http_access deny all
照常营业,设置所需目标 URL 的 ACL 映射,以便从您的本地网络资源访问或阻止。