Erstmals veröffentlicht am 2012-01-10.
Die Installation eines Proxy-Servers im lokalen Netzwerk ermöglicht:
eine schnellere Internetnutzung durch lokale Speicherung und anschließende Auslieferung aus dem Cache häufig angeforderter Ressourcen (Seiten, Bilder, CSS);
die Konfiguration der Werbeblockierung (oder anderer unerwünschter Inhalte) an einer zentralen Stelle, sofort für alle Benutzer des lokalen Netzwerks.
Ein transparenter HTTP-Proxy wird so genannt, weil alle Clients, die aus dem internen Netzwerk auf externe Webserver zugreifen, automatisch durch ihn geleitet werden, ohne dass Änderungen an den Einstellungen auf ihrer Seite vorgenommen werden müssen (es muss kein expliziter Proxy in allen verwendeten Programmen angegeben werden, von denen einige möglicherweise überhaupt keine Proxy-Unterstützung bieten).
Lassen Sie uns nun betrachten, wie wir diese sehr praktische Transparenz sowohl für IPv4 als auch für IPv6 gewährleisten können.
In den folgenden Beispielen wird vorausgesetzt:
Sie verwenden einen Router auf Basis von GNU/Linux;
darauf ist der Proxy-Server Squid 3.1+ installiert (die Beschreibung der Installation und Konfiguration von Squid geht über den Rahmen dieses Artikels hinaus);
das Betriebssystem verwendet den Linux-Kernel der Version 2.6.37+ und das Paket iptables 1.4.10+;
der interne Schnittstellenname des Routers lautet eth0.
IPv4
IPv4-Verbindungen werden mit Hilfe des NAT-Mechanismus auf den Proxy umgeleitet. Das sieht ziemlich einfach aus:
iptables
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8084
Fügen Sie diese Zeile in Ihr bereits verwendetes iptables-Skript ein.
Squid
Auf der Squid-Seite muss in /etc/squid3/squid.conf Folgendes hinzugefügt werden:
http_port 8084 transparent
Der Port kann nach Belieben gewählt werden, solange er von nichts anderem belegt ist und sowohl in der iptables-Regel als auch in der Squid-Konfiguration derselbe ist.
IPv6
Da ip6tables kein NAT unterstützt, wird der transparente Proxy für IPv6 auf etwas andere Weise implementiert. Die Konfiguration sieht etwas komplexer aus, jedoch wird dank der fehlenden Notwendigkeit von NAT ein wichtiger Vorteil erreicht: Obwohl die Verbindungen durch den Proxy laufen, sieht der entfernte Webserver als Client-Adresse die IPv6-Adresse des Endgeräts und nicht die Adresse des Proxies.
iproute & ip6tables
#!/bin/sh
# === Entfernen vorheriger Einstellungen (falls vorhanden) ===========
ip -6 route flush table 64
ip -6 rule del from all fwmark 0x6
ip6tables -t mangle -F
ip6tables -t mangle -X DIVERT
# === Einfügen der neuen Konfiguration =====================
ip -6 route add local default dev lo table 64
ip -6 rule add from all fwmark 0x6 lookup 64
ip6tables -t mangle -N DIVERT
ip6tables -t mangle -A DIVERT -j MARK --set-mark 6
ip6tables -t mangle -A DIVERT -j ACCEPT
ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
ip6tables -t mangle -A PREROUTING -p tcp -i eth0 --dport 80 -j TPROXY --tproxy-mark 0x6 --on-port 8086
Die Werte table 64 und fwmark 0x6 wurden hier willkürlich gewählt; wenn in Ihrem System bereits mehrere Routing-Tabellen und Firewall-Regeln mit Markierungen verwendet werden (z. B. zur Unterstützung mehrerer WAN-Verbindungen), stellen Sie sicher, dass dieses Skript nicht mit Ihren bestehenden Einstellungen in Konflikt steht.
Squid
In /etc/squid3/squid.conf muss Folgendes hinzugefügt werden:
http_port 8086 tproxy
Wie im oben beschriebenen Konfigurationsprozess für IPv4 kann auch hier ein anderer Port gewählt werden.
Anwenden der Einstellungen
Um die Änderungen in der squid.conf zu übernehmen, reicht es, Squid anzuweisen, diese Datei neu zu laden; beispielsweise unter Debian-basierten Distributionen genügt der Aufruf von /etc/init.d/squid3 reload.
Die Einstellungen für ip/iptables/ip6tables treten sofort nach der Ausführung der entsprechenden Befehle in Kraft. Damit sie bei jedem Systemstart angewendet werden, fügen Sie sie in Ihr Firewall-Skript ein (bei dem von mir verwendeten arno-iptables-firewall können benutzerdefinierte Ergänzungen in /etc/arno-iptables-firewall/custom-rules eingetragen werden), oder fügen Sie sie einfach in /etc/rc.local ein.
Überprüfung
Führen Sie von einem beliebigen Rechner im lokalen Netzwerk (aber nicht vom Server selbst) Folgendes aus:
curl -I4 http://version6.ru/
curl -I6 http://version6.ru/
In beiden Fällen sollten in der Ausgabe von curl die folgenden Zeilen erscheinen:
X-Cache: MISS from IhrProxy
X-Cache-Lookup: MISS from IhrProxy:Port
Wenn diese nicht vorhanden sind oder die Verbindung nicht hergestellt werden kann, ist etwas falsch konfiguriert. Falls Sie die Konfiguration nicht hinbekommen, kommen Sie in unseren IRC-Kanal, vielleicht kann Ihnen dort jemand helfen.
