我想让 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 上需要身份验证?


最佳答案
2

当您使用 ACL 类型时myportname,您依赖于隐式默认名称,即,您的http_port 3128名称确实http_port 3128 name=3128与端口 3129 相同。

也许尝试使用myportACL 类型,即acl input_3128 myport 3128acl input_3129 myport 3129

另外,您可以尝试http_access按如下方式对指令进行排序:

http_access allow input_3128
http_access allow authenticated input_3129
http_access deny all

这样,第一http_access行就可以匹配任何进入端口 3128 的连接,甚至无需提示可能需要身份验证。如果不匹配,第二条规则将匹配端口 3129 的连接,此时身份验证要求生效。最后一条规则将捕获任何不匹配前两行的内容;您根本deny all不需要单独的一行。http_access deny input_3129

4

  • 有几件事。我不知道隐式命名;可能在文档中错过了。感谢提供的信息。myport localport。我们 localport也试过了,但也没有用。但是,http_access首先将 重新排序为未经身份验证的 ,可以工作。我不确定我理解为什么,但这回答了这个问题。非常感谢。


    – 

  • 1
    据我了解,authenticatedhttp_access行上的 ACL 的存在会触发 407 响应,并且一旦发送该响应,代理将无法说“呃……没关系,毕竟我不需要您的身份验证”。因此,您可以通过首先接受到端口 3128 的连接而不提及身份验证来获得所需的行为;如果第一http_access行匹配,则根本不会处理该连接的后续http_access行,因此不会触发 407 响应。


    – 


  • 你真是个天才。pb 是authenticated。我们必须记住,条件是anded。所以我的行读起来像“如果经过身份验证并且….则接受”,但第二个条件当然从未被检查,因为逻辑短路,并且只要条件authenticated不满足,一切都会失败;端口号永远没有机会被测试。如果我以另一种方式编写条件:“如果端口 3129 也经过身份验证,那么 ok”,那就完全是另一回事了。我会添加一个答案,只是因为在评论中阅读它很痛苦。


    – 

  • @exore 我必须承认,我已经很久没有使用 Squid 了,对于如何在一行中组合 ACL 的http_access实际操作有些模糊,但当然,这是一种简化的 AND 操作,可以优化速度。感谢你给了我一个机会来刷新我的记忆。


    – 

@telcoM 在第二条评论中给出了解释。我根据这条评论发布了另一个解决方案。

在一条线上,所有条件都是anded。因此,

http_access allow authenticated input_3129

是它首先检查authenticated条件。此条件会为任何未经身份验证的连接触发早期 407 应答,无论端口号如何。

现在,如果我改用input_3129 authenticated,由于隐含的andauthenticated只有满足 时才会尝试条件input_3129。所以不会出现早期的 407。Squid 可以继续尝试第二条http_access规则。

http_access allow input_3129 authenticated
http_access allow input_3128
http_access deny all