Howto: Rootserver als OpenVPN-Gateway nutzen

Im Zeitalter der überall verfügbaren öffentlichen Hotspots und sonstigen Zugangsmöglichkeiten ins Internet habe ich mir schon öfter Gedanken über die Sicherheit gemacht. Aus diesem Grund habe ich nun auf meinem Rootserver ein OpenVPN-Gateway eingerichtet, um bei Bedarf jederzeit eine sichere Verbindung ins Internet herstellen zu können.Dieses Howto bezieht sich auf Debian Etch als Server- und Windows XP als Client-Betriebssystem. Die Authentifizierung des Clients ist standardmäßig zertifikatsbasiert, man kann sich jedoch auch über Login/Passwort (PAM) authentifizieren. Dies hat den Vorteil, dass man, wenn man z.B. die Installations- oder Konfigurationsdateien für OpenVPN auf einem USB-Stick mit sich herumträgt, bei Verlust des Sticks keine Zertifikate preisgibt – im Endeffekt muss dies aber jeder selbst entscheiden.

Die Installation des Servers und der durchzuführenden Schritte zur Erzeugung der Schlüssel und Diffie-Hellman-Parameter ist hier recht gut beschrieben.

server.conf:
# howto: https://knecht.homelinux.net/phpBB2/viewtopic.php?t=449

user nobody
group nogroup

dev tun

local xx.xx.xx.xx
port 443
proto tcp

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh1024.pem

server 10.66.66.0 255.255.255.0
ifconfig-pool-persist ipp.txt

push "redirect-gateway"

client-to-client
keepalive 10 120

comp-lzo

persist-tun
persist-key

verb 3
#log-append /var/log/openvpn/openvpn.log
#status /var/log/openvpn/status.log

# pam-auth
plugin /usr/lib/openvpn/openvpn-auth-pam.so common-auth
client-cert-not-required
username-as-common-name

Der Server lauscht bewusst auf Port tcp/443, da ich auf diesen Port mit sehr großer Wahrscheinlichkeit über jede Internetverbindung zugreifen kann (https). Alle, die jetzt auf die Idee kommen, einen solchen Server zu nutzen, um aus ihrem Firmennetz uneingeschränkten Zugang ins Internet zu erhalten, sei mit diesem Verweis davon abgeraten.

Ich habe außerdem noch die /etc/rc.local auf dem Server um folgende Zeilen ergänzt:

# initialize natting for openvpn
iptables -t nat -F POSTROUTING
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -s 10.66.66.0/24 -j MASQUERADE

Dadurch wird gewährleistet, dass das Masquerading auch nach einem Neustart des Servers noch funktioniert.

Für den Windows-Client habe ich die OpenVPN-GUI verwendet. Stolperfalle: das Programm muss als Admin installiert werden und _mindestens_ als Mitglied der Gruppe “Network Operators” gestartet werden, da ansonsten die benötigten Devices und Routen nicht angelegt werden können.
Die ca.crt vom Server muss auf dem Client vorliegen, damit dieser sicherstellen kann, dass er sich mit dem richtigen Server verbunden hat.

client.ovpn:
client
dev tun
proto tcp
remote xx.xx.xx.xx 443
resolv-retry infinite
nobind
persist-key
persist-tun
auth-user-pass
ca ca.crt
#cert client1.crt
#key client1.key
comp-lzo
verb 3

Nun lässt sich der Tunnel durch einen Doppelklick auf die client1.ovpn oder alternativ über das Kontextmenü der OpenVPN GUI starten.

Nach dem Start sollte ein ipconfig /all einen Eintrag dieser Art vorweisen:
Ethernetadapter LAN-Verbindung xx:

Verbindungsspezifisches DNS-Suffix:
Beschreibung. . . . . . . . . . . : TAP-Win32 Adapter V8
Physikalische Adresse . . . . . . : 00-FF-86-D4-E9-9C
DHCP aktiviert. . . . . . . . . . : Ja
Autokonfiguration aktiviert . . . : Ja
IP-Adresse. . . . . . . . . . . . : 10.66.66.6
Subnetzmaske. . . . . . . . . . . : 255.255.255.252
Standardgateway . . . . . . . . . : 10.66.66.5
DHCP-Server . . . . . . . . . . . : 10.66.66.5
Lease erhalten. . . . . . . . . . : Samstag, 30. Juni 2007 19:19:44
Lease läuft ab. . . . . . . . . . : Sonntag, 29. Juni 2008 19:19:44

route print sollte u.a. Standardgateway: 10.66.66.5 ausgeben. Unter wieistmeineip.de sollte die IP-Adresse eures Rootservers angezeigt werden. Ab jetzt darf sicher gesurft werden!

Ist doch eigentlich ganz einfach oder?

edit:// (25.07.2007)
Ich möchte noch folgendes hinzufügen:
– UDP ist schneller als TCP (proto udp in der server.conf). Es könnte aber sein, dass dies mit manchen Firewalls nicht funktioniert! Daher ist es am besten, mehere OpenVPN-Server auf mehreren Interfaces auf Port 443 laufen zu lassen, die meisten Provider bieten aktuell mehrere verfügbare IP-Adressen an.
– Man sollte dem Client noch Nameserver mitgeben, da ansonsten die lokal bekannten verwendet werden und man somit als Betreiber des unsicheren Netzes zumindest mitbekommt, welche Adressen aufgerufen werden. Das geht mit

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

in der server.conf. Die Nameserver, die ich hier verwende, sind die von OpenDNS.
– dieser Beitrag wurde im Rootforum verlinkt. Danke! 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

25 comments

  1. Hab’ ich letztens schon fuer ‘nen Kunden aufgesetzt und nutze ich selbst auch. Rockt wie Sau! (Vorausgesetzt man waehlt fuer die PKI kein Ablaufdatum von 30 Tagen *pfiffl* 😉

  2. OpenVPN ist der Hammer, stricke damit nahezu jedes VPN zusammen. Besonders reizvoll ist die auswählbare Stärke der Verbindung. Latenz lässt sich übrigens verbessern, wenn Du statt TCP UDP als Protokoll verwendest.
    Auf dem Windows Client solltest Du dem OpenVPN.exe Prozess standardmäßig eine Priorität > “normal” zuweisen, da sonst der VPN anfangen kann zu ‘choken’ (ich liebe DEnglisch 😉 ), wenn ein anderer Prozess sich die Rechenleistung vom mangelhafen Windows Prozess Scheduler klaut.

    Aber btw., wie kommst Du zu nem Windows Client? Dachte, Du wärst auf Ubuntu umgestiegen 😉 Da ist die Konfiguration übrigens ebenso einfach.

    Übrigens ist Deine Verbindung dann logischerweise nur von Deinem Client zum Rootserver verschlüsselt. Von diesem gehts dann ganz normal unverschlüsselt weiter durchs Netz, als hättest Du einen PC beim Server-Anbieter einfach in die Netzwerkdose gesteckt …

  3. Danke für die wertvollen Tipps. Der Windows-Client ist mein Laptop…

    Wer das mit dem “vom Rootserver gehts unverschlüsselt weiter” nicht möchte, muss eben Tor nehmen oder sowas.

  4. Diese Aussage ist nicht ganz korrekt, TOR verschlüsselt ja nicht, sondern verteilt Deine (Surf-) Anfragen nur wild über seine TOR-Proxy-Peers auf viele verschiedene Anschlüsse und verschleiert somit die Herkunft der Pakete.

  5. Wie erwähnt funktioniert das nur mit OpenSSH >= 4.3. Diese Version gibt es bestimmt schon seit einem Jahr, allerdings ist erst bei Debian Etch und Ubuntu Edgy eine entsprechendes Paket im Repository.
    Aber von der VPN Funktion von SSH abgesehen, gibt es auch die Möglichkeit einzelne Ports vom SSH Client zum SSH-Server durchzutunneln, z. B. zu einem Entfernten Proxy 😉

  6. Man lernt ja nie aus – hatte mich das letzte mal aber auch vor 2 Jahren über TOR informiert, da bleibt dann auch schon etwas Information auf der Strecke… 😉
    Das Gefährliche daran ist aber, dass Requests anderer TOR-User dann von Deinem Anschluß / Rootserver abgeschickt werden. Und wenn dann jemand über TOR Kinderpornos oder anderen Schrott irgendwo hochlädt, kann es sein, dass die Polizisten mal freundlich bei Dir anklopfen.
    Und dann hast Du erstmal ein Straf- und kein Entlastungsverfahren am Hals… alleine wegen der Anwaltskosten kaum zu empfehlen…

    Ach ja, Deine Multiple-Post Spamschutz nervt 😉

  7. Deswegen kann man Tor ja mit der Exit-Policy so einstellen, dass der Node nur Traffic an andere Nodes weitergibt und somit nirgends in den Logs erscheint.
    Klar, wenn das jeder macht funktioniert das Netz nicht 🙂

  8. Im ersten Artikel habe ich beschrieben, wie man einen Rootserver als OpenVPN-Gateway konfiguriert. Wer nicht im (legalen) Besitz eines solchen ist, dafür aber eine Fritz!Box als DSL-Router zu Hause rumstehen hat, kann diese genau so gut verwenden, um sich

  9. Ich suche schon lange eine Anleitung wie man mit 2 Servern unter Suse 2 Netzwerke verbinden kann – praktisch ein virtueller Switch. Sowas habe ich bisher noch nirgends in verständlicher Form gefunden. Alle Anleitungen waren entweder unvollständig oder nicht auf Suse sondern Debian oder BSD bezogen. Gibt es das auch?

  10. habs fast erfolgreich installiert.
    mein Problem was ich im moment habe: Ich kann mit der VPN Verbindung auf den rootserver von meinem notebook aus zugreifen, auch auf die webseiten die auf dem rootserver sind, aber raus ins internet komme ich nicht…
    ich vermute eine Firewalleinstellung am rootserver???

  11. Wenn du diese Befehle in die rc.local einfügst (und diese selbstverständlich danach auch ausführst!) dann müsste es aber funktionieren:

    # initialize natting for openvpn
    iptables -t nat -F POSTROUTING
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -s 10.66.66.0/24 -j MASQUERADE

    Sonst fällt mir da auch nix mehr ein 😉

  12. Hi,
    danke für den Artikel. Ich mache ungelogen schon seit gut einem Jahr an der Sache rum, bekomme es aber nicht zum Laufen. Zwischenzeitlich habe ich wirklich geglaubt das das evtl. gar nicht geht. Dieser Artikel hat mir neuen Mut gemacht! Also OpenVPN klappt, es können sich lustig viele Clients einwählen und untereinander Kommunizieren, aber ins Internet komm ich nicht. Ich hab den Root Server bei Strato zusammen mit nem Kumpel gemietet. Er betreibt dabei nebenher etwas Webhosting. Ich hab mir eine zweite IP dazubestellt, die per “ifconfig xx.xx.xx.xx eth0:1” dem eth0 zugewiesen und den Openvpn auf eth0:1 Port 443 lauschen lassen, das klappt auch, aber mein VPN bekomme ich weder auf die erste noch auf die Alias IP Maskiert. Hat mir da jemand evtl. ne Idee?

    BTW. evtl. ist das ein Hosterproblem, bei wem bist Du denn?

    Vielen Dank schon Mal.

    MfG MrXfree11

  13. Vielen dank für das HowTo! Hat auf anhieb bei meinem vServer geklappt.

    Ich habe bei meinem vServer jetzt auch 2 IP Adresse, allerdings weiß ich nicht wie ich OpenVPN bzw. die iptables konfigurieren muss, damit auf beiden interfaces gelauscht wird.

    Ich habe jetzt 2 instanzen von OpenVPN laufen mit unterschiedlichen config dateien. Der einzige unterschied ist das bei instanz A “local XX.XX.XX.10” steht und instanz B “local XX.XX.XX.11”

    Ich weiss ich muss noch die iptables anpassen, nur wie?
    Muss dann jede OpenVPN instanz ein eigenes subnetz haben? Wäre natürlich schön wenn beide das selbe subnetz haben könnten.

    Danke für jeden Tipp.

  14. hätte da ne Frage, hab es eigentlich genauso laufen wie hier beschrieben, allerdings 2 Server einen normalen mit udp auf Port 1194 und einen mit TCP auf Port 443. Das Problem ist das wenn ich:

    iptables -t nat -F POSTROUTING
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -s 10.66.66.0/24 -j MASQUERADE

    ausführe funktioniert das zuvor eingebene

    iptables -t nat -F POSTROUTING
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE

    nicht mehr und umgekehrt, von daher kann ich auch nicht beides in die rc.local eintragen hätte ja den gleichen Effekt :/

    wie könnt ich das lösen?

    Lg Frank

    1. Naja das kann auch nicht funktionieren – du kannst ja nicht auf einem Interface für zwei verschiedene Subnetze NAT machen, bzw. ist mir nicht bekannt wie das funktionieren soll.

      Einfachere Lösung: OpenVPN nur einmal auf Port 1194 laufen lassen und mittels iptables zusätzlich die Anfragen von Port 443 auf den 1194er umbiegen.

  15. danke für die coole anleitung.
    hat prima funktioniert, nur hab ich noch folgende beiden rules gebraucht:

    iptables -I FORWARD -i tun0 -j ACCEPT
    iptables -I FORWARD -o tun0 -j ACCEPT

  16. Hi,

    auch wenn dieser Eintrag schon reichlich alt ist… danke für dieses Howto! Das hat soweit alles ganz gut geklappt.

    Jetzt wollte ich – einfach mal so zum Spaß – den Traffic vom Server über TOR bzw. Polipo umleiten. Sowohl TOR als auch Polipo funktionieren augenscheinlich einwandfrei. Trotzdem mag mein iptables-Eintrag nicht so recht funktionieren (Zeitüberschreitung der Anfragen). Der Eintrag sieht so aus:

    iptables -t nat -A PREROUTING -i tun0 -p tcp –dport 80 -j DNAT –to 127.0.0.1:8118

    (Polipo horcht auf 8118)

    Was mache ich falsch? 🙁

    Danke