我想让 squid 监听端口 3128 和 3129。我想在 3129 上进行身份验证,在 3128 上不进行身份验证。目前我有以下配置
# auth_param not shown but working
http_port 3128
http_port 3129
acl input_3128 myportname 3128
acl input_3129 myportname 3129
acl authenticated proxy_auth REQUIRED
http_access allow authenticated input_3129
http_access deny input_3129
http_access allow input_3128
http_access deny all
不幸的是,这根本不起作用。Squid 总是需要身份验证。
示例请求:
curl -v --proxy http://myproxy.example.com:3128 http://debian.org/
鱿鱼反应:
* processing: http://debian.org/
10.1.2.3:3128...
* Connected to myproxy.example.com (10.1.2.3) port 3128
> GET http://debian.org/ HTTP/1.1
> Host: debian.org
> User-Agent: curl/8.2.1
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 407 Proxy Authentication Required
< Server: squid/5.9
< Mime-Version: 1.0
< Date: Wed, 23 Oct 2024 10:15:01 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 3511
< X-Squid-Error: ERR_CACHE_ACCESS_DENIED 0
< Vary: Accept-Language
< Content-Language: en
< Proxy-Authenticate: Basic realm="Squid proxy-caching web server"
< X-Cache: MISS from myproxy
< X-Cache-Lookup: NONE from myproxy:3129
< Via: 1.1 myproxy (squid/5.9)
< Connection: keep-alive
<
问题
如何让 squid 仅在端口 3129 上需要身份验证?
当您使用 ACL 类型时
myportname
,您依赖于隐式默认名称,即,您的http_port 3128
名称确实http_port 3128 name=3128
与端口 3129 相同。也许尝试使用
myport
ACL 类型,即acl input_3128 myport 3128
和acl input_3129 myport 3129
?另外,您可以尝试
http_access
按如下方式对指令进行排序:这样,第一
http_access
行就可以匹配任何进入端口 3128 的连接,甚至无需提示可能需要身份验证。如果不匹配,第二条规则将匹配端口 3129 的连接,此时身份验证要求生效。最后一条规则将捕获任何不匹配前两行的内容;您根本deny all
不需要单独的一行。http_access deny input_3129
@telcoM 在第二条评论中给出了解释。我根据这条评论发布了另一个解决方案。
在一条线上,所有条件都是
and
ed。因此,是它首先检查
authenticated
条件。此条件会为任何未经身份验证的连接触发早期 407 应答,无论端口号如何。现在,如果我改用
input_3129 authenticated
,由于隐含的and
,authenticated
只有满足 时才会尝试条件input_3129
。所以不会出现早期的 407。Squid 可以继续尝试第二条http_access
规则。