TOR in Kombination mit OpenVPN

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