
Meus requisitos são:
- O proxy deve ser transparente.
- Devo ser capaz de filtrar sites por nome de domínio.
- Eu façonãodeseja descriptografar o tráfego. Estou procurando uma solução baseada em detecção de SNI - sem instalação de certificados em clientes.
Existem muitas respostas por aí, mas elas estão incorretas (alegando que você precisa descriptografar o tráfego para fazer isso) ou incompletas.
Responder1
A maneira de fazer isso é usar o recurso SSL Peek introduzido no Squid 3.5. Veraquipara uma explicação detalhada. Observe que você precisará ter compilado com --with-gnutls
ou --with-openssl
(verifique squid -v
). Algumas distros os deixam de fora.
Resumindo, a configuração relevante do squid é assim.
acl denylist_ssl ssl::server_name google.com # NOT dstdomain
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump splice !denylist_ssl # allow everything not in the denylist
ssl_bump terminate all # block everything else
https_port 3129 intercept ssl-bump cert=/etc/squid/dummy.pem
(Além disso: não sei por que precisamos apenas dar uma olhada na etapa 1 e não na etapa 2, visto que a etapa 2 envolve apenas o recebimento do certificado do servidor. Os documentos não deixam isso claro. Usar ssl_bump peek all
como eles recomendam faz com que isso pare de funcionar completamente ).
E então faça o redirecionamento usual da porta 443 para 3129 usando iptables (ou faça o squid ouvir diretamente em 443, se preferir).
-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3129
Você pode usar qualquer certificado para o manequim; na verdade, nunca o usamos (porque não estamos descriptografando o tráfego).
Algo assim funciona.
openssl req -new -newkey rsa:4096 -sha256 -days 365 -nodes -x509 -keyout dummy.pem -out dummy.pem
Fontes: