O truque é usar o Squid com usuários autenticados. O tráfego SSL não pode ser intermediado por proxy se você estiver executando um proxy transparente. O Squid pode ser executado nos dois sentidos ao mesmo tempo (em portas diferentes):
http_port <ip>:3128 transparent
http_port <ip>:8080
Você obviamente teria que adicionar algumas regras para permitir e impedir que usuários autenticados naveguem onde é permitido ou proibido. Ainda assim, os usuários que estão acessando a Web de forma transparente, serão proibidos de acessar o HTTPS se ele estiver bloqueado em seu firewall.
A outra maneira (mais suja) seria obter os sites permitidos em um arquivo, obter seus registros de DNS e atualizar / remover regras, algo como:
Defina uma regra como esta:
iptables -N SSL_FORWARD
iptables -A FORWARD -s <NET> -p tcp --dport 443 -j SSL_FORWARD
iptables -A FORWARD -s <NET> -p tcp --dport -j DROP
Isto criaria uma nova cadeia SSL_FORWARD, e envia pacotes vindos da sua rede destinados à porta 443 para serem avaliados nesta nova cadeia. Se o pacote não corresponder a nenhuma regra dentro dessa cadeia, ele será descartado.
Em seguida, execute este pequeno script regularmente:
# Flush SSL_FORWARD chain
iptables -F SSL_FORWARD
# Iterate through each line of this file, and then get
# it DNS records
for domain in 'cat /path/to/allowed.domains'; do
for line in 'dig ${domain} +short' ; do
[ -z "'echo ${line} | grep '^[0-9.]*$''" ] && continue
iptables -A SSL_FORWARD -s <NET> -d ${line} -p tcp --dport 443 -j ACCEPT
done
done