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.

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:

1
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:

1
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:

1
2
source ./vars
./clean-all

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

1
./build-ca

Der Output sieht etwa so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
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:

1
./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

1
2
./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).

1
./build-dh

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

1
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:

1
2
3
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):

1
2
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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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:

1
mkdir /etc/openvpn/chroot

Und die passende User-/Nutzergruppenkombination erstellen:

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

Ab besten sollte man nun den Server einmal starten:

1
/etc/init.d/openvpn start

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

1
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:

1
2
# Disables packet forwarding
net.ipv4.ip_forward = 0

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

1
2
# 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:

1
2
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:

1
2
3
4
5
# 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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 ;)