Quero que o squid escute as portas 3128 e 3129. Quero autenticação na 3129 e nenhuma autenticação na 3128. Por enquanto, tenho esta configuração
# 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
Infelizmente isso não funciona de jeito nenhum. O Squid sempre requer autenticação.
Exemplo de solicitação:
curl -v --proxy http://myproxy.example.com:3128 http://debian.org/
Resposta do Squid:
* 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
<
Pergunta
Como fazer o squid exigir autenticação somente na porta 3129?
Ao usar o tipo ACL
myportname
, você está confiando no nome padrão implícito, ou seja, que seuhttp_port 3128
é realmentehttp_port 3128 name=3128
o mesmo e o mesmo vale para a porta 3129.Talvez tente usar o
myport
tipo ACL, ou seja,acl input_3128 myport 3128
eacl input_3129 myport 3129
?Você também pode tentar classificar as
http_access
diretivas assim:Isso deve permitir que a primeira
http_access
linha corresponda a quaisquer conexões recebidas na porta 3128 sem nem mesmo sugerir que a autenticação pode ser necessária. Se isso não corresponder, a segunda regra corresponderá às conexões na porta 3129, agora com o requisito de autenticação em vigor. A finaldeny all
capturará qualquer coisa que não corresponda a nenhuma das duas primeiras linhas; você não precisa de umahttp_access deny input_3129
linha separada.@telcoM deu uma explicação no segundo comentário. Posto outra solução com base neste comentário.
Em uma linha, todas as condições são
and
ed. Então o problema comé que ele verifica primeiro a
authenticated
condição. Esta condição dispara uma resposta 407 antecipada para qualquer conexão não autenticada, qualquer que seja o número da porta.Agora, se eu usar em vez de
input_3129 authenticated
, por causa do implícitoand
, aauthenticated
condição é tentada somente quando oinput_3129
é atendido. Então, nada de 407 antecipado. O Squid pode prosseguir e tentar a segundahttp_access
regra.