Hallo Leute,
auf Anfrage gibt es einen kleinen Artikel, wie man TOR in Kombination mit OpenVPN nutzen kann. Dabei werden der TOR-Daemon und der OpenVPN-Daemon auf einem Server aufgesetzt. Aller Traffic, welcher von Clients des OpenVPN-Servers kommt, wird dann übers TOR-Netzwerk geschickt.
Die Installation
Offensichtlich benötigt man auf einem Server den TOR- bzw. OpenVPN-Daemon. Zusätzlich werden wir noch die Iptables brauchen. Diese sollte man leicht über die Paketverwaltung installieren können:
sudo apt-get install openvpn-server tor iptables
Ich werde hier nicht weiter erläutern, wie man OpenVPN konfiguriert. Dazu verweise ich auf das gute Tutorial auf ubuntuusers.de. Im Folgendem werde ich von dieser OpenVPN-Konfiguration ausgehen:
- 10.10.0.1/24-Subnetz
- tun0-Interface
Konfiguration von TOR
Die Default-Konfiguration des TOR-Daemons ist brauchbar. Wir möchten später den Traffic, welcher von den OpenVPN Nutzern kommt über TOR schicken. Dazu bietet uns TOR drei Optionen an:
- DNS-Proxy (Wird benötigt, um *.onion aufzulösen)
- Socks-Proxy (Falls man nur Socks benötigt)
- Transparenter-Proxy (Falls man allen Traffic tunneln möchte)
Wir interessieren uns vor allem für den DNS-Proxy und den transparenten Proxy. Folgende Einstellungen müssen in die /etc/tor/torrc übernommen werden:
VirtualAddrNetwork 10.192.0.0/10 AutomapHostsOnResolve 1 DNSPort 10.10.0.1:53530 TransPort 10.10.0.1:9040
In Kombination mit „AutomapHostsOnResolve“ muss ein beliebiges „privates“ Subnetz als VirtualAddrNetwork zugewiesen werden. Andererseits werden die Daten ans Loopback geroutet und das möchten wir nicht.
Nach dem Speichern muss Tor einmal neugestartet werden:
sudo service tor restart
Ob die Ports richtig zugewiesen sind und korrekt laufen, kann man mit netstat überprüfen:
gehaxelt@VPNBox ~ % sudo netstat -tulpen | grep tor [sudo] password for gehaxelt: tcp 0 0 10.10.0.1:9040 0.0.0.0:* LISTEN 0 3964140 1525/tor tcp 0 0 127.0.0.1:9051 0.0.0.0:* LISTEN 0 3964141 1525/tor udp 0 0 10.10.0.1:53530 0.0.0.0:* 0 3964139 1525/tor
Damit ist die Konfiguration von TOR soweit abgeschlossen.
Konfiguration der IPtables
Den Großteil der Arbeit nehmen uns die IPtables ab. Mit deren Hilfe werden wir den eingehenden Traffic auf dem OpenVPN-Device „tun0“ durch unseren transparenten TOR-Proxy schicken. Folgende IPtables-Regeln solltet ihr hinzufügen:
export IPTABLES=/sbin/iptables export OVPN=tun0 ###Transparent Tor Proxy $IPTABLES -A INPUT -i $OVPN -s 10.10.0.0/24 -m state --state NEW -j ACCEPT $IPTABLES -t nat -A PREROUTING -i $OVPN -p udp --dport 53 -s 10.10.0.0/24 -j DNAT --to-destination 10.10.0.1:53530 $IPTABLES -t nat -A PREROUTING -i $OVPN -p tcp -s 10.10.0.0/24 -j DNAT --to-destination 10.10.0.1:9040 $IPTABLES -t nat -A PREROUTING -i $OVPN -p udp -s 10.10.0.0/24 -j DNAT --to-destination 10.10.0.1:9040
Mit der ersten Regel erlauben wir eingehenden Traffic auf dem OpenVPN-Server. Als nächstes leiten wir mit Hilfe eines Destination-NATs den DNS-Traffic von Port 53 auf den DNS-Proxy von Tor (53530) um. Die beiden letzten Regeln könnte man zusammenfassen, jedoch finde ich die Trennung in UDP+TCP übersichtlicher. Diese Regeln leiten dem restlichen Traffic auf den transparenten TOR-Proxy um.
Die Auftrennung zwischen DNS und restlichem Traffic müssen wir machen, damit sich TOR um die Auflösung der *.onion-Adressen kümmern kann. Damit das ordentlich funktioniert müssen die Clients ihre DNS-Requests nach Außen zum VPN-Server schicken. Das klappt entweder durch pushen einer Konfiguration über den OpenVPN-Server oder durch manuelles Eintragen eines öffentlichen DNS-Servers (z.B. 8.8.8.8) in der /etc/resolv.conf.
Fazit
Meiner Meinung nach ist das eine ganz einfache Möglichkeit zentral einen TOR-Daemon zu betreiben und anderen Geräten einfach nur einen VPN-Zugang zu verpassen. Zu beachten ist aber, das der Traffic zwischen dem OpenVPN-Server und dem TOR-Proxy mitgeschnitten werden kann.
~ Sebastian