Squid als Proxy

Aus Debacher-Wiki
Wechseln zu:Navigation, Suche

Schulen in Hamburg müssen sich theoretisch nicht um das Thema Proxy kümmern, da sie alle genötigt sind eine Time-For-Kids Box als Router einzusetzen. So wie der Proxy auf der Box standardmäßig konfiguriert ist bietet sie aber heute keine ausreichende Sicherheit mehr. Im Web gibt es eine Reihe von Anleitungen, wie man die Filterung umgehen kann. Ein transparenter Proxy bietet zumindest heute keine Sicherheit mehr.

Ich versuche hier einmal zusammen zu stellen, was ich meine über den Proxy Squid verstanden zu haben.

Proxy Grundkonfiguration

Beim Einsatz eines Proxy muss man vor allem zwischen transparenten und einem konventionellen Proxy. Der konventionelle Proxy lauscht auf einem speziellen Port, bei Squid ist das in der Standard-Konfiguration der Port 3128. Bei jedem Programm, welches über diesen Proxy zugreifen möchte muss daher eine entsprechende Einstellung vorgenommen werden.

Bei einem transparenten Proxy ist keinerlei Konfiguration auf den Clients notwendig, hier gibt es auf dem Router eine entsprechende Konfiguration, die den Netzverkehr durch den Proxy leitet. Die Grundinstallation ist hier also relativ einfach erledigt.

Der transparente Proxy hat aber einen gravierenden Nachteil, er kann normalerweise keine https-Seiten verarbeiten. Bei einem transparenten Proxy hat man daher nur die Wahl auf eine https-Filterung zu verzichten, oder https generell zu unterbinden. Das geht aber heutzutage nicht mehr, da auch dank letsencrypt der größte Teil aller Webseiten verschlüsselt angeboten wird.

Proxy und https

Das Problem der transparenten Proxies hängt damit zusammen, dass der Proxy eben transparent zwischen Client und Server auf Port 80 bzw. 443 liegt. Und hier wird bei https im ersten Schritt eine verschlüsselte Verbindung aufgebaut, auf der Basis der IP-Adressen. Erst wenn die Verbindung aufgebaut ist, dann wird der Host-Header gesendet, über den der Name des virtuellen Servers übermittelt wird. Damit könnte man hier nur IP-basiert sperren und nicht namensbasiert. Heutzutage liegen aber auf einem Server, einer IP-Adresse, teilweise viele virtuelle Server. So liegen z.B. die Webseiten von https://rlw.schule, https://gymnasium-bornbrook.de und https://hansa-gymnasium.de auf dem gleichen Server. Wollte man eine der Adressen sperren, so wären auch die anderen beiden davon betroffen. Die Einschränkung ist mir aber nicht ganz klar, weil ohne SNI der Server nur ein einziges Zertifikat nutzen könnte.

Der explizite Proxy hat hier den Vorteil, dass der Client ihn explizit nutzt, also von ihm die Webseite anfordert. Dadurch ist dem Proxy auch der Name des Zielrechners bekannt, danach baut er dann zwischen beiden Rechnern einen verschlüsselten Tunnel auf. Der Proxy-Server muss sich hier auch um die Namensauflösung kümmern, da er ja die Verbindung aufbaut. Weitere Informationen, z.B. über die einzelnen aufgerufenen Seiten stehen auch hier nicht zur Verfügung. Hier kann man also schon etwas genauer filtern.

Will man mehr Informationen über die per https aufgerufenen Inhalte haben, also auch gezielter filtern können, so muss man verhindern, dass Squid die Verbindung tunnelt und ihn dazu bringen als "man in the middle" zu agieren. Das erfordert eine Reihe von Änderungen an der Konfiguration.

squid.conf

Im Auslieferungszustand besteht die Konfigurationsdatei aus fast 8.000 Zeilen Text. Der größte Teil der Zeilen ist aber auskommentiert. Betrachtet man nur die aktiven Zeilen, so steht bei mir:

acl localnet src 192.168.0.0/16	# RFC1918 possible internal network

acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localhost manager
http_access deny manager

http_access deny to_localhost

http_access allow localnet
http_access allow localhost

http_access deny all

http_port 3128

access_log daemon:/var/log/squid/access.log combined

strip_query_terms off

coredump_dir /var/spool/squid

refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320

error_default_language de

Fett hervorgehoben sind die von mir vorgenommenen Änderungen. In der Regel habe ich nur das Kommentarzeichen am Anfang der jeweiligen Zeile entfernt.

ToDo

Die Beschreibung ist noch in Arbeit. Hier eine Sammlung von Stichwörtern:

  • /usr/local/sbin/squid -v
  • grep -v "^#" squid.conf.dpkg-old | cat -s


iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 --dport 80 -j DNAT --to 192.168.1.250:3128
iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 --dport 443 -j DNAT --to 192.168.1.250:3129