Falls man nicht die Möglichkeit hat Stammzertifikate auf den Clients zu installieren, ist die Konfiguration eines transparenten Proxys schwierig sein. Da mittlerweile fast alle Webseiten nur über HTTPS erreichbar sind, wurden Browser auch sehr empfindlich gegenüber Man-in-the-middle-Attacken.
Folgendes Beispiel kann eine Grundlage für einen transparenten Proxy, der auch HTTPS-Seiten kontrollieren kann.
Um HTTPS-Verbindungen über ACLs zu kontrollieren muss Squid das Server Name Indicator-Feld inspizieren. Daran kann entschieden werden, ob eine Webseite in der Whitelist steht oder nicht. Dazu muss Squid beim Verbindungsaufbau (at_step SslBump1) in die Anfrage hineinschauen (peek).
Die HTTP-Methode CONNECT muss generell freigeschaltet werden, wodurch sich der Client zu Webserver verbinden darf. Aber falls die SNI sich nicht in der Whitelist befindet, dann wird die Verbindung durch Squid terminiert. Ansonsten wird ein TCP-Tunnel für die Verbindung erstellt, ohne dass Squid auf die Inhalte schauen kann.
vim /etc/squid/squid.conf
Einstellungen im letzten Absatz sind für Debugging. Diese können später ausgeschaltet werden.
cache_mgr info@einyakamnil.xyz
visible_hostname firewall
acl whitelist dstdomain "/etc/squid/white.list"
acl whitelist_ssl ssl::server_name "/etc/squid/white.list"
acl CONNECT method CONNECT
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump splice step1 whitelist_ssl
ssl_bump terminate !whitelist_ssl
http_access allow whitelist
http_access allow CONNECT
http_access deny all
http_port 3128
http_port 3129 intercept
https_port 3130 intercept ssl-bump cert=/etc/squid/certs/squid_proxyCA.pem
cache deny all
logformat log_sni %>a %Ss/%03>Hs %<st %rm %ru SNI: %ssl::>sni
access_log /var/log/squid/access.log log_sni
debug_options ALL,2
Über Firewall-Regeln können die Anfragen der Clients auf die Squid-Ports umgeleitet werden. Webseiten auf unkonventionellen Ports können je nach Verbindungstyp hinzugefügt werden.
vim /etc/nftables.conf
...
table inet nat {
chain prerouting {
type nat hook prerouting priority -100;
iif $lan_interface tcp dport { 80, ... } redirect to :3129
iif $lan_interface tcp dport { 443, ... } redirect to :3130
}
}
...
Wenn alles konfiguiert ist, werden die Dienste so am schnellsten neugestartet
systemctl reload squid
systemctl restart nftables