Konfiguration des OpenVPN Servers
Bevor wir beginnen den Server zu konfigurieren, sollten wir uns einige Gedanken machen:
- OpenVPN lauscht per Default auf dem Port 1194. In unserem Netzwerkplan ist aber vorgesehen, dass das Notebook des Chefs von überall aus auf das Netzwerk zugreifen kann. Hierbei kann es auch passieren, dass von einem Hotel aus Zugegriffen werden soll, wo eventuell eine Firewall den Port blockt. Daher habe ich Port 443(https) gewählt.
-
Das Authentifizierungsverfahren, mit dem sich die Clients vorstellen. Wir können uns die möglichen Verfahren wie folgt anzeigen lassen, müssen aber beachten, dass das Verfahren auch auf unseren Clients verfügbar ist:
In unserem Fall wähle ich SHA1.
TTY
# openvpn --show-digests
The following message digests are available for use with
OpenVPN. A message digest is used in conjunction with
the HMAC function, to authenticate received packets.
You can specify a message digest as parameter to
the --auth option.
MD2 128 bit digest size
MD5 128 bit digest size
RSA-MD2 128 bit digest size
RSA-MD5 128 bit digest size
SHA 160 bit digest size
RSA-SHA 160 bit digest size
SHA1 160 bit digest size
RSA-SHA1 160 bit digest size
DSA-SHA 160 bit digest size
DSA-SHA1-old 160 bit digest size
MDC2 128 bit digest size
RSA-MDC2 128 bit digest size
DSA-SHA1 160 bit digest size
RSA-SHA1-2 160 bit digest size
DSA 160 bit digest size
RIPEMD160 160 bit digest size
RSA-RIPEMD160 160 bit digest size
MD4 128 bit digest size
RSA-MD4 128 bit digest size
-
Wie wollen wir verschlüsseln? Auch hier müssen wir wieder darauf achten, dass die Clients das Verfahren unterstützen. Die Möglichen Verfahren können wir uns wieder anzeigen lassen:
Hier wähle ich AES-256-CBC.
TTY
# openvpn --show-ciphers
The following ciphers and cipher modes are available
for use with OpenVPN. Each cipher shown below may be
used as a parameter to the --cipher option. The default
key size is shown as well as whether or not it can be
changed with the --keysize directive. Using a CBC mode
is recommended.
DES-CBC 64 bit default key (fixed)
IDEA-CBC 128 bit default key (fixed)
RC2-CBC 128 bit default key (variable)
DES-EDE-CBC 128 bit default key (fixed)
DES-EDE3-CBC 192 bit default key (fixed)
DESX-CBC 192 bit default key (fixed)
BF-CBC 128 bit default key (variable)
RC2-40-CBC 40 bit default key (variable)
CAST5-CBC 128 bit default key (variable)
RC5-CBC 128 bit default key (variable)
RC2-64-CBC 64 bit default key (variable)
AES-128-CBC 128 bit default key (fixed)
AES-192-CBC 192 bit default key (fixed)
AES-256-CBC 256 bit default key (fixed)
-
Die mtu(MaximmumTransmissionUnit) des tun Interfaces.
Da OpenVPN die TCP/UDP Pakete in eigene verschlüsselte Pakete kapselt muss OpenVPN ca 150Byte zu einem Paket hinzufügen. Wir sollten also Mittels ifconfig prüfen, welcher mtu Wert auf den physischen Netzwerkkarten aktiv ist. Bei Unserem aktuellen Server steht die mtu auf 1492. Sinnvoll wäre nun 1300 für das tun Device, um auf der sicheren Seite zu sein. Mit diesem Wert sollte man ein wenig spielen, um den besten Datendurchsatz zu erhalten. Wir gehen allerdings einen anderen, besserern Weg. Wir setzen dit mtu für das tun Device ebenfalls auf 1492 und weisen OpenVPN an, alles Pakete, die grösser sind als 1300 zu fragmentieren. Mehr dazu in der Konfigurationsdatei...
Laden des Kernelmoduls für das tap Device
Während der Testphase werde ich das Modul per Hand in den Kernel laden, was wir aber später automatisieren können. Bei der Installation von OpenVPN wurde das Script mit dem irritierenden Namen /usr/local/etc/rc.d/openvpn.sh.sample installiert. Das Script startet nicht den OpenVPN Server, sondern läd nur das Kernel Modul, was wir jetzt erst mal händisch erledigen werden:
TTY
# kldload if_tap
#
Die Konfigurations Datei des OpenVPN Servers
Bei der Installation wurden nur Beispiele installiert. Wir werden die Konfiguration im Verzeichnis /usr/local/etc/openvpn anlegen. Das Verzeichnis existiert noch nicht, also legen wir es an und kopieren die Beipieldatei für den Server hinein:
TTY
# mkdir /usr/local/etc/openvpn
# cd /usr/local/etc/openvpn
# cp /usr/local/share/doc/openvpn/sample-config-files/server.conf ./server.conf
# Port
port 443
# TCP oder UDP?
proto udp
# tun oder tap?
# Das tun Device erstellt einen IP Tunnel,
# während das tap Device einen Ethernet Tunnel erstellt.
dev tun
# Die ermittelte mtu für das tun Interface.
# Wir fügen die Optionen fragment und
# mssfix hinzu, um ein Aushandeln der
# Paketgroessen zu ermoeglichen
tun-mtu 1492
fragment 1300
mssfix
# Die Pfade zu den Keys und Zertifikaten.
# Ich kopiere die Pärchen später in das
# openvpn Verzeichnis, um Wirrwarr vorzubeugen.
ca /usr/local/etc/openvpn/vpn-ca.pem
cert /usr/local/etc/openvpn/servercert.pem
key /usr/local/etc/openvpn/serverkey.pem
# der Pfad zu den Diffie-Hellmann Parametern.
# Auch diese werde ich später ins openvpn
# Verzeichnis kopieren.
dh /usr/local/etc/openvpn/dh1024.pem
# Durch die Angabe von server veranlassen
# wir openvpn im Servermodus zu lauern.
# Hier übergeben wir auch den Adressbereich
# und die Netzwerkmaske für das virtuelle
# Netzwerk. Der Server wird automatisch
#auf der ersten IP lauschen - also 10.8.0.1
server 10.8.0.0 255.255.255.0
# Wir können einen Pool für die Virtuellen
# Adressen angeben. Falls ein Client die
# Verbindung beendet, bekommt er bei der
# nächsten Verbindung automatisch die selbe
# IP zugewiesen.
ifconfig-pool-persist ipp.txt
# Mit dem push Befehl können wir die
# Clients veranlassen ihre Routing Tabellen
# automatisch beim Verbindungsaufbau neu
# zu schreiben. Wir veranlassen also die Clients
# die Route in den Adressbereich
# 192.168.0.0 automatisch über vpn zu routen
push "route 192.168.0.0 255.255.255.0"
# Mit keepalive können wir uns
# informieren, ob die Gegenstelle noch
# erreichbar ist. Wir setzen alle 10 Sekunden
# ein ping ähnliches Paket ab und gehen
# davon aus, dass die Gegenstelle weg ist,
# wenn nach 120 Sekunden keine Antwort kommt.
keepalive 10 120
# Unsere Authentifizierungsmethode
auth SHA1
# Unsere Verschlüsselungsmethode
cipher AES-256-CBC
# Wir wollen komprimierten Datenverkehr
comp-lzo
# Wir reduzieren die Rechte, mit dem der
# Server läuft nach dem Verbindungsaufbau.
# Dies wird allerdings zur Folge haben, dass er keine Berechtigung mehr hat die
# Routing Tabelle in den ursprünglichen
# Zustand zu versetzen, was hier aber kein
# Problem darstellt.
user nobody
group nobody
# Die persist Optionen werden die Keys
# und Zertifikate im Speicher behalten,
# so dass sie auch noch gelesen werden
# können nachdem Gruppe und User
# gewechselt wurden.
persist-key
persist-tun
# Für unsere Versuche setzen wir die Geschwätzigkeit
# auf Level 3
verb 3
Jetzt können wir die Zertifikate, dh Parameter und Keys in das openvpn Verzeichnis kopieren. Dem Server Key entziehen wir danach noch sämtliche Leseberechtigungen.
TTY
# cp /usr/local/openssl/dh1024.pem ./dh1024.pem
# cp /usr/local/openssl/vpn-ca.pem ./vpn-ca.pem
# cp /usr/local/openssl/private/serverkey.pem ./serverkey.pem
# cp /usr/local/openssl/certs/servercert.pem ./servercert.pem
# chmod 0600 serverkey.pem
Start des OpenVPN Servers
Der spannende Augenblick ist gekommen, wir starten den Server und übergeben ihm den Pfad zu unserer Konfigurationsdatei.
TTY
# openvpn --config /usr/local/etc/openvpn/server.conf
Tue Apr 26 11:21:27 2005 OpenVPN 2.0 i386-portbld-freebsd4.11 [SSL] [LZO]
built on Apr 24 2005
Tue Apr 26 11:21:27 2005 Diffie-Hellman initialized with 1024 bit key
Tue Apr 26 11:21:28 2005 TLS-Auth MTU parms
[ L:1558 D:138 EF:38 EB:0 ET:0 EL:0 ]
Tue Apr 26 11:21:28 2005 gw 192.168.0.1
Tue Apr 26 11:21:28 2005 TUN/TAP device /dev/tun0 opened
Tue Apr 26 11:21:28 2005 /sbin/ifconfig tun0
10.8.0.1 10.8.0.2 mtu 1500 netmask 255.255.255.255 up
Tue Apr 26 11:21:28 2005 /sbin/route add
-net 10.8.0.0 10.8.0.2 255.255.255.0
add net 10.8.0.0: gateway 10.8.0.2
Tue Apr 26 11:21:28 2005 Data Channel MTU parms
[ L:1558 D:1450 EF:58 EB:23 ET:0 EL:0 AF:3/1 ]
Tue Apr 26 11:21:28 2005 GID set to nobody
Tue Apr 26 11:21:28 2005 UID set to nobody
Tue Apr 26 11:21:28 2005 UDPv4 link local (bound): [undef]:443
Tue Apr 26 11:21:28 2005 UDPv4 link remote: [undef]
Tue Apr 26 11:21:28 2005 MULTI: multi_init called, r=256 v=256
Tue Apr 26 11:21:28 2005 IFCONFIG POOL: base=10.8.0.4 size=62
Tue Apr 26 11:21:28 2005 Initialization Sequence Completed
Weiter mit Automatischer Start des Servers
