www.fabiankeil.de/blog-surrogat/2006/06/08/von-kopf-bis-fuss-auf-tor-eingestellt.html

Von Kopf bis Fuß auf Tor eingestellt

[Screenshot: Halber E17-Desktop, im einem Eterm im Vordergrund wird eine freedb-Abfrage über Tor abgewickielt] Ein lästiges Problem bei der Tor-Nutzung sind Programme ohne Socks-Unterstützung.

Programme mit Unterstützung für HTTP-Proxys können noch über Privoxy zur Tor-Nutzung überredet werden, doch der Rest erfordert deutlich mehr Arbeit.

Tor bringt dazu das Skript torify mit. Es bringt Programmen die Tor-Nutzung über tsocks bei, muss aber für jedes Programm einzeln aufgerufen werden – sehr umständlich.

Eine deutlich elegantere Lösung ist trans-proxy-tor: ein transparenter Proxy, der zusammen mit OpenBSDs PF oder den auf Kinder-Unixen verfügbaren iptables einfach alle nicht von Tor ausgehenden Verbindungen abfängt und umleitet.

Siehe Screenshot: eine von cdda2wav eingeleitete FreeDB-Verbindung wurde abgefangen und anonymisiert abgewickelt, cdda2wav wurde ganz normal gestartet und bekam davon nichts mit.

trans-proxy-tor unter FreeBSD

FreeBSD wird von trans-proxy-tor 0.0.7 noch nicht unterstützt, in den FreeBSD-Ports ist trans-proxy-tor daher noch nicht enthalten. Abhilfe ist geplant und der Grundstein mit p5-Event-Lib seit heute gelegt – den schneidigen Titel FreeBSD-Contributor gab's gratis dazu.

Den ersten trans-proxy-Patch für FreeBSD habe ich bereits weitergeleitet, ich nehme daher an, dass spätere Versionen FreeBSD auch von Hause aus unterstützen werden. Update: seit trans-proxy-tor 0.0.8 gehört FreeBSD zu den unterstützten Betriebssystemen.

Kleiner Vorgeschmack

Am einfachsten ist es, trans-proxy-tor zusammen mit dem mitgelieferten dns-proxy-tor zu nutzen. Zum Testen habe ich genau das getan, außerdem die mitgelieferte Paket-Filter-Konfiguration aus Beispiel 1 benutzt.

Der Anfang einer von Sylpheed-Claws angeforderten Verbindung zu meinem Mail-Server sieht damit so aus:

fk@TP51 ~/downloads/trans-proxy-tor-0.0.7 $sudo ifconfig lo1 create 127.0.0.2 up
fk@TP51 ~/downloads/trans-proxy-tor-0.0.7 $sudo chown fk /dev/pf
fk@TP51 ~/downloads/trans-proxy-tor-0.0.7 $sudo pfctl -f /etc/transproxy.conf
fk@TP51 ~/downloads/trans-proxy-tor-0.0.7 $./dns-proxy-tor -b 127.0.0.1:5353 -f -t 127.0.0.1:9051 -v debug &\
> ./trans-proxy-tor -b lo:1112 -s 127.0.0.1:9050 -v debug -f
[1] 1703
Proxy bound to 127.0.0.1:5353
Connected to Tor
Test connection succeeded to SOCKS4 server at 127.0.0.1:9050
Proxy listening on 127.0.0.1:1112
Received datagram from 127.0.0.1:63962
id=0xb472 flags=0x0100 qd=0x0001 an=0x0000 ns=0x0000 ar=0x0000
Adding mapaddress to buffer for sslmailpool.ispgateway.de
Adding session for sslmailpool.ispgateway.de
Handling write to Tor control port
Handling read from Tor control port
Resolved sslmailpool.ispgateway.de => 127.192.0.1, sent to 127.0.0.1:63962
Received datagram from 127.0.0.1:54380
id=0xb473 flags=0x0100 qd=0x0001 an=0x0000 ns=0x0000 ar=0x0000
Adding mapaddress to buffer for sslmailpool.ispgateway.de
Adding session for sslmailpool.ispgateway.de
Handling write to Tor control port
Handling read from Tor control port
Resolved sslmailpool.ispgateway.de => 127.192.0.1, sent to 127.0.0.1:54380
Accepting connection from 192.168.0.49:60802
Original destination returned from pf: 127.192.0.1:995
Adding write event for TCP connect to 127.0.0.1:9050 (127.192.0.1:995)
Handling connect to 127.0.0.1:9050 (127.192.0.1:995)
Adding write event for SOCKS4 connect to 127.0.0.1:9050 (127.192.0.1:995)
Handling SOCKS4 connect write to 127.0.0.1:9050 (127.192.0.1:995)
Adding read event for SOCKS4 connect to 127.0.0.1:9050 (127.192.0.1:995)
Handling SOCKS4 connect read from 127.0.0.1:9050 (127.192.0.1:995)
SOCKS4 connected to 127.0.0.1:9050 (127.192.0.1:995)
Adding read event for 192.168.0.49:60802 (127.192.0.1:995)
Handling read from 192.168.0.49:60802 (127.192.0.1:995)
Read 142 bytes from 192.168.0.49:60802 (127.192.0.1:995)
Adding read event for 127.0.0.1:9050 (127.192.0.1:995)
Handling write to 127.0.0.1:9050 (127.192.0.1:995)

Sylpheed-Claws DNS-Abfragen auf Port 53 wurden von PF auf Port 5353 umgeleitet, vom dort lauschenden dns-proxy-tor an Tor weitergegeben und schließlich mit 127.192.0.1 beantwortet.

Der lokale Tor-Server leitet anschließend Kontaktversuche mit 127.192.0.1 nach 80.67.18.41 (die wirkliche Adresse) um; ohne Tor kommt Sylpheed-Claws nicht ins Internet und der von Tor vergebene Bereich 127.192.0.0/10 macht PF das Leben noch leichter.

Die von PF vorgenommenen Umleitungen:

fk@TP51 ~ $sudo pfctl -sn    
rdr pass on lo1 inet proto tcp all -> 127.0.0.1 port 1112
rdr pass on em0 inet proto tcp from any to ! (em0:network) -> 127.0.0.1 port 1112
rdr pass on lo1 inet proto udp from any to any port = domain -> 127.0.0.1 port 5353
rdr pass on em0 inet proto udp from any to any port = domain -> 127.0.0.1 port 5353

Und die Filter-Regeln:

fk@TP51 ~ $sudo pfctl -sr
scrub in all fragment reassemble
block drop in all
block return out all
pass out quick on lo0 route-to lo1 inet proto tcp from any to 127.192.0.0/10 flags S/SA modulate state
pass out quick on lo0 route-to lo1 inet proto udp from any to any port = domain keep state
pass quick on lo0 all keep state
pass in on em0 inet proto tcp from any to any port = ssh flags S/SA keep state
pass out quick on iwi0 inet proto tcp all user = 1002 flags S/SA modulate state
pass out on iwi0 route-to lo1 inet proto tcp all flags S/SA modulate state
pass out on iwi0 route-to lo1 inet proto udp from any to any port = domain keep state

Fertig ist die Laube.

Zu früh gefreut

Bis auf den Patch habe ich für den Port selbst noch nichts getan. Für das Problem der nur über Tor erreichbaren Website habe ich auch noch keine Patent-Lösung und die Privilege-Separation klappt noch nicht unter FreeeBSD. Ich nehme an, dass es sich dabei um eine Kleinigkeit handelt, der Port sollte in den nächsten zwei Wochen das Tageslicht erblicken.

Update 2006-06-11: Erste Ergebnisse

Die Privilege-Separation erforderte nur einen kleinen Workaround, der in trans-proxy-tor 0.0.9 bereits enthalten ist. Die Ports sind mittlerweile in einem funktionsfähigen Zustand, erfordern aber noch ein paar kosmetische Veränderungen: die Startskripte enthalten noch etwas Gefrickel und bei der Deinstallation bleiben bislang die Log- und Run-Verzeichnisse übrig, da ich noch nicht rausgefunden habe, wie ich aus pkg-plist die Löschung von Dateien außerhalb von PREFIX veranlassen kann.

Die Vorversionen für Abenteuerlustige:

Update 2006-07-22: Die beiden Ports sind offiziell ...

und nach Aktualisierung der Ports-Collection über:

cd /usr/ports/security/trans-proxy-tor
make install clean

zu installieren.