OpenVPN als Internet-Gateway mit zertifikatsbasierter Authentifizierung auf Linux-Server unter Gentoo und Windows-Client einrichten

Vor einigen Tagen habe ich mich intensiv mit Openvpn auseinander gesetzt, da ich meinen Internet Pack M auf den nächst größeren Internet Pack L umgestellt habe und daher diesen nicht mehr nur für gelegentliches surfen, sondern dauerhaft verwenden wollte. Leider läuft die Verbindung mit O2 über einen Zwischenproxy, weshalb mir das ganze etwas suspekt erschien. Nicht zuletzt, weil O2 erst vor kurzem Probleme mit STARTTLS während der AUthentifizierungsphase bei E-Mailversand hatte. Daher habe ich mir vorgestellt, eine gesicherte Verbindung zu meinem Server aufzubauen und darüber zu surfen. Eventuell werde ich in Kürze auch mein NAS mit dran hängen, um jederzeit auf meine Daten zugreifen zu können (Das wird aber ein separates Setup).
Im Folgenden beschreibe ich mein Setup (welches möglicherweise etwas paranoid ist :P) unter Gentoo als Server und Windows XP als Clients.

Werbung


Ich beginne mit der Serverkonfiguration.Zunächst muss man das sogenannte TUN/TAP-Device im Kernel aktivieren, welches sich in der menuconfig unterhalb von „Device Drivers —>“ im Menü „Network device support —>“ unter dem Punkt „[*]Network device support“ unter dem Punkt „<*> Universal TUN/TAP device driver support“ verbirgt.
Anschließend muss man den Kernel natürlich einmal neu kompilieren und diesen starten, um die Änderungen zu übernehmen.

Weiter gehts mit der eigentlichen Installation von OpenVPN:

emerge openvpn

Nun gehen wir zur Erstellung der Zertifikate für die Authentifizierung weiter. Mit Hilfe der sogenannten Easy-RSA von OpenVPN erstellen wir die benötigten Dateien. Dazu wechseln wir in dessen Verzeichnis:

cd /usr/share/openvpn/easy-rsa/

Nun wird die Datei „vars“ editiert und die folgenden Parameter gesetzt (Es darf keine leer bleiben):

  • KEY_SIZE
    Erklärung: Verschlüsselungsstärke, ich habe 2048 gewählt
  • KEY_COUNTRY
    Erklärung: Ländercode
  • KEY_PROVINCE
    Erklärung: Bundesland
  • KEY_CITY
    Erklärung: Stadt
  • KEY_ORG
    Erklärung: Firma oder Organisation
  • KEY_EMAIL
    Erklärung: Mailadresse des Ansprechpartners

Diese Variablen müssen nun geladen und anschließend im Verzeichnis aufgeräumt werden:

source ./vars
./clean-all

Weiter gehts mit der Erstellung der Public-Key-Infrastruktur (PKI) mittels einer Certificate Authority (CA):

./build-ca

Der Output sieht etwa so aus:

Generating a 2048 bit RSA private key
…………++++++
………..++++++
writing new private key to ‚ca.key‘
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‚.‘, the field will be left blank.
—–
Country Name (2 letter code) [DE]:
State or Province Name (full name) [DeinBundesland]:
Locality Name (eg, city) [DeineStadt]:
Organization Name (eg, company) [Privat]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:Irgendwas
Email Address [mail@myhostname.tld]:

Wenn zuvor alles korrekt eingegeben wurde, muss man nur „Common Name“ ausfüllen und mit einem beliebigen Wert (hier „Irgendwas“) füllen.

Weiter gehts mit dem Zertifikat für den Server, diesmal muss aber der Common Name mit „server“ (bitte exakt so schreiben!) gefüllt werden. Zwei weitere Fragen müssen positiv (also mit „y“) beantwortet werden, die da lauten: „Sign the certificate? [y/n]“ aund „1 out of 1 certificate requests certified, commit? [y/n]“. Jetzt zum Befehl:

./build-key-server server

Für jeden Client muss man nun ein Zertifikat erstellen. Auf keinen Fall sollte ein Zertifikat auf zwei Rechner eingesetzt werden. Der Grund dafür ist sehr einfach: Geht ein Rechner verloren oder wird gehackt und man muss das Zertifikat revoken, so sind alle Rechner mit diesem Zertifikat davon betroffen.
Beim folgenden Befehl sollte im Common Name jeweils ein eindeutiger Name für den Rechner stehen, also z.B. ulilaptop oder ulimainframe

./build-key ulilaptop
./build-key ulimainframe

Jetzt brauchen wir noch den Diffie Hellman Parameter, der leider bei 2048 Bit recht lang zu generieren braucht (kann schon mal ein paar Minuten dauern).

./build-dh

Zuletzt generiere ich noch ein tls-auth key-file für die Authentifizierung am Server:

openvpn --genkey --secret keys/ta.key

Schützenswert sind vor allem nun im Verzeichnis „keys“ die Dateien, welche auf *.key enden, da diese die privaten Teile der Zertifikate darstellen.

Wir kopieren nun die erstellten Dateien ins OpenVPN-Verzeichnis:

mkdir -p /etc/openvpn/securenet/
mv /usr/share/openvpn/easy-rsa/keys/* /etc/openvpn/securenet/
chmod 700 /etc/openvpn/securenet

Und ein Backup aller erstellten Keys (nur zur Sicherheit):

tar cfzp /root/openvpn-securenet.tar.gz /etc/openvpn/securenet/
chmod 700 /root/openvpn-securenet.tar.gz

Kommen wir zur Konfiguration des Servers. Zunächst muss die Datei „/etc/openvpn/openvpn.conf“ editiert werden. Mein VPN-Netz bekommt den IP-Bereich 10.13.37.0 und wird maximal 5 Clients zulassen. Der VPN-Server lauscht auf Port 4242 (UDP) auf einem TUN-Device.

port 4242
verb 3
proto udp
dev tun
ca /etc/openvpn/securenet/ca.crt
cert /etc/openvpn/securenet/server.crt
key /etc/openvpn/securenet/server.key
dh /etc/openvpn/securenet/dh2048.pem
server 10.13.37.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
keepalive 10 120
cipher AES-256-CBC
comp-lzo
user openvpn
group openvpn
persist-key
persist-tun
resolv-retry infinite
status /etc/openvpn/openvpn-status.log
chroot /etc/openvpn/chroot
push "redirect-gateway"
client-to-client
max-clients 5
tls-auth /etc/openvpn/securenet/ta.key 0

Damit ist die Serverkonfiguration fast abgeschlossen. Nun muss man noch das chroot-Verzeichnis erstellen:

mkdir /etc/openvpn/chroot

Und die passende User-/Nutzergruppenkombination erstellen:

useradd -M -s /bin/false -U openvpn

Ab besten sollte man nun den Server einmal starten:

/etc/init.d/openvpn start

Wenn alles geklappt hat, sollte man die Änderungen permanent machen:

rc-update add openvpn default

Nun muss man das IP-Forwarding einschalten (Danke an Sven für den Hinweis!). Dazu öffnet man die Datei /etc/sysctl.conf und sucht folgende Zeilen:

# Disables packet forwarding
net.ipv4.ip_forward = 0

Diese ersetzt man durch (also v.a. 0 => 1):

# Enables packet forwarding
net.ipv4.ip_forward = 1

Dies funktioniert NUR, wenn im Kernel „Sysctl support“ eingeschalten ist!

Damit der Server hinterher auch den Internet-Traffic durchroutet, muss man einige IPTables-Regeln festlegen:

iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth0 -s 10.13.37.0/24 -j MASQUERADE

Man will jedoch nicht, dass der Server den Netbios-Traffic auch ins Internet schickt, daher zusätzlich:

# Block outgoing NetBios
iptables -A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP

Damit diese Regeln beim Systemstart auch gesetzt werden, habe ich diese am Ende von /etc/rc.conf angefügt, welche bei jeden Systemstart aufgerufen wird.

Kommen wir zur Konfiguration der Clients. Unter Windows installiert man am Klügsten das Paket von openvpn.se, da dort eine graphische Oberfläche zur Benutzung von OpenVPN (inklusive eines Taskleistenprogramms) verfügbar ist.
Nun müssen die Schlüssel zu den Clients transportiert werden. Die fünf Dateien sollten am besten über einen SICHEREN Weg transportiert werden (beispielsweise SCP). Diese werden benötigt (hier beispielhaft für „ulilaptop“:

  • dh2048.pem
  • ulilaptop.crt
  • ca.crt
  • ulilaptop.key
  • ta.key

Herunterladen und im Verzeichnis „config“ der OpenVPN-Installation abgelegen. Im gleichen Verzeichnis muss eine Datei namens client.ovpn mit folgendem Inhalt angelegt werden:

client
dev tun
proto udp
remote YOURSERVER 4242
resolv-retry infinite
nobind
cipher AES-256-CBC
persist-key
persist-tun
ca ca.crt
cert ulilaptop.crt
key ulilaptop.key
comp-lzo
verb 3
mute 20
ns-cert-type server
tls-auth ta.key 1

Hierbei müsssen YOURSERVER mit dem Hostnamen des Servers und jeweils die Zertifikatsnamen mit deinen vergebenen Namen ausgetauscht werden.

Damit sollte Client-Configuration ageschlossen sein. Jetzt einfach mal versuchen zu verbinden. Wenn alles funktioniert hat und in der Taskleiste das Icon grün leuchtet, sollte man mal die eigene IP herausbekommen. Dazu gibt es viele verschiedene Seiten (Suchmaschine befragen), ich habe mir eine eigene in PHP schnell zusammengestrickt 😉 Mit diesem Setup fahre ich momentan problemlos 😉

Veröffentlicht von

Uli

IT-Nerd und Admin

25 Gedanken zu „OpenVPN als Internet-Gateway mit zertifikatsbasierter Authentifizierung auf Linux-Server unter Gentoo und Windows-Client einrichten“

  1. Super schöne Anleitung und sehr gut beschrieben. Ich war mir erst nicht einig, ob ich den langen Weg über OpenSSL bevorzugen sollte, habe dann aber doch den hier beschriebenen genutzt und funktioniert auf Anhieb sehr gut. Nur mit den Firewallregeln muss ich noch mal schauen, da spontan gar kein Internet mehr ging. Liegt jedoch vielleicht auch an meiner Konfiguration: ClientRouterServer ?!?

  2. Hallo Uli,
    ich würde gerne mit OpenVPN ins Internet (mit Windows), bin was OpenVPN angeht .. Neuling. Zu meiner Ausgangssituation:
    Ich habe einen Vertrag bei „O2 Mobile Flat“ (HSDPA) das Problem besteht darin, das O2 eine Nat-Firewall vor die Privaten IP’s geschaltet hat. Die Ip nach außen ins www ist die 82.113.121.1 die internen Private IP von O2 ist die 10.**.252.99.

    Ich möchte nun über OpenVPN ins Internet, zu meiner eigenen Sicherheit.

    Muß ich nur den Client konfigurieren, oder wie geht man vor?

    MfG

    SAMIOL

    1. Hi Swen,

      ich mach das exakt genauso wie du. Du brauchst einen Server, um das durchzuführen. Nur der Client nutzt dir leider nix 😉 Ansonsten einfach der obigen Anleitung folgen 🙂

      Viele Grüße
      Uli

  3. Hallo Uli,

    noch mal eine klärende Frage!

    Baue ich hier nur zwischen meinem Linux Server und meinen Laptop einen Tunnel, oder geht der Tunnel durch die NAT Firewall von O2?

    MfG

    SAMIOL

  4. hi,

    das mit OpenVpn will ich ja auch noch hinbekommen… aber!

    Ich hab was Geiles gefunden, kennst Du den NCP Client?
    O2 sagt das nur Businesskunden eine Lösung für VPN angeboten bekommen. Jetzt hab ich durch mehrmaliges Anrufen und Nachhaken herausbekommen das Sie den obne genannten Clienten nutzen.

    Es gibt eine 30 Tage Testversion die für jeden User super leicht zu konfigurieren ist.

    Ich denke das es echt super wäre wenn man das allen O2 Mobile Kunden zugänglich machen könnte.

    Würde das auch übernehmen ;).

    MfG

    SAMIOL

    1. Ich weiß nicht, wozu der NCP-Client als Ersatz dienen sollte, vielleicht kann ich aber auch einfach nicht folgen.

      Wenn du O2 nicht deine Daten anvertrauen willst, so nehme man selbst einen Server sowie einen Client, dem man vertraut und baut mittels der obenstehenden Anleitung einen sicheren Tunnel.

      Wenn du jetzt statt deinem eigenem Server einen von O2 nimmst, welche Vorteil hätte dies dann gegenüber gänzlich fehlender Verschlüsselung?

      Viele Grüße
      Uli

    1. Hi,
      prinzipiell tut es jedes Linux-Betriebssystem, sofern man die möglichkeit eines Shellzugriffs hat. Bei Ubuntu geht es beispielsweise auch. Hast du einen Server im Internet stehen? Wenn ja mit welchem OS?
      Viele Grüße
      Uli

    1. Dann würde ich mich mal im Netz nach VPN-Anbietern umschauen. Du musst wohl in den sauren Apfel beissen und dir einen Zugangspunkt mieten. Einen Server ohne Vorwissen zu mieten ist nicht nur sehr umständlich, sondern auch relativ verantwortungslos (diese werden meist aufgrund wenig Wissens über die Systeme schnell gehackt).

  5. Du schreibst das Du O2 verwendest. Ich habe in ganz Liechtenstein noch kein O2 gesehen. Kannst Du mir bitte sagen, wie ich das hier bekomme, da ich kein Telekom-FL mehr sehen kann.

  6. Hi Uil 🙂
    Erstmal Super Blog! 😀
    Habe mir jetzt auch eine ch3Mnas zugelegt und dank deiner Seite
    schon ffp und darauf einige dienste installiert.
    allerdings wäre ich um eine Hilfestellung zum openvpn server
    auf und mldonkey auf der ch3mnas dankbar.

    habe das Problem, dass bei openvpn mir der daemon unter anderem sagt:
    „OpenVPN 2.1_rc19 arm-unknown-linux-uclibc [SSL] [LZO2] [EPOLL] built on Aug 20 2009“
    und verweigert den start..
    bei mldonkey habe ich noch keinen funktionierenden client gefunden..

    wäre echt nett von dir mir dabe zu helfen 😉

    MfG
    Stefan

  7. hallo Uli hab jetzt seit längerem den MlDonkey am laufen aber mit openvpn klappt es noch nicht wirklich…
    könntest du den openvpn-server in deine repro für die ch3mnas aufnehmen?

  8. Hi, ich hab da ein Problem, wenn cih dem Guie folge auf Ubuntu 10.04 erhalten ich folgende Fehlermeldung beim IPTABLES Teil:
    Bad argument `10.13.37.0/24′

    Folglich wird mein traffic natürlich auch geblockt und ich kann nicht übers vpn ins Internet. Hat sich rezent etwas an der iptables syntax geändert, falls ja, wie wäre das angepasste commando ? Ich hab es mit:
    sudo iptables -t nat -A POSTROUTING -o eth0 –source 10.13.37.0/24 -j MASQUERADE
    versucht, das geht auch ohne Fehlermeldung durch, jedoch kann ich noch immer nicht mit meinem client ins internet über openvpn :/

  9. Hallo,

    danke für die super Anleitung, hat auf Anhieb geklappt! Hier eine Anregung, und zugleich eine Frage.

    Zuerst die Anregung: die Client-Seite lässt sich problemlos auf einen Router mit DD-WRT (mit vpn) verfrachten. So erhält man eine stromsparende, elegante, transparente Black-Box-Lösung, an die man sein unverändertes LAN anschließen kann wie an jeden „normalen“ Router bzw. WAN-Anschluss auch. Jeder PC im Netz nutzt automatisch den Tunnel, ohne dass dort Client-Software installiert werden müsste.

    Um die Dinge besser zu überblicken, habe ich fürs VPN nicht das WEB-GUI von DD-WRT verwendet. Dort bleiben also alle VPN-Funktionen deaktiviert. Statt dessen habe ich alles von Hand aufgebaut; ein Startscript erzeugt beim Booten alle benötigten Dateien für OpenVPN und startet es dann. Die Laufzeitsituation ist also exakt so, wie sie auch auf einem großen Linux-Rechner wäre. Lief, wie gesagt, auf Anhieb.

    Es gibt aber ein Problem, welches ich noch nicht überblicke, aber als SICHERHEITSKRITISCH einstufen würde: clientseitig kann openvpn offenbar in einen Zustand geraten, wo es den Tunnel, falls er zusammenbricht, nicht selbst repariert (so wie es wohl gedacht ist). Dann bleibt es in diesem Zustand hängen, und der ganze weitere Datenverkehr geht einfach ungetunnelt ins Netz!!! Das merkt man nicht auf Anhieb, weil die Anbindung ja weiterhin funktioniert (halt nur am Tunnel vorbei).
    Ich habe es durch ein Überwachungsskript herausgefunden, welches in regelmäßigen Abständen überprüft (und loggt), mit welcher IP man im Netz unterwegs ist. Wenn es eine IP des Providers und nicht mehr die IP des eigenen Rootservers ist, ist halt was faul…

    Ich erwarte hier jetzt keine Lösung (sonst müsste ich ja Logs posten usw…), nur mal die Frage: hat jemand ähnliche Erfahrungen gemacht?

    Der Grund für die Anwendung ist bei mir übrigens der gleiche – außer dass es nicht 02 ist.

  10. Hey, mich würde es interessieren ob es hierfür auch eine IPV6 variante gibt.

    Habe zwar einiges probiert, doch wirklich fündig bin ich noch nicht geworden.

    Wäre nett wenn man von hier etwas erfahren könnte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.