OpenVPN auf OpenBSD 4.4

In diesem Artikel wird kurz und knapp beschrieben wie man OpenVPN 2.1 rudimentär auf OpenBSD 4.4 zum Laufen bekommt. Grundlegende Einrichtungen, wie z.B. einen funktionierenden DNS-Server usw. werden vorausgesetzt. Die Installation erfolgt auf dem OpenBSD-Server unter Verwendung des Paketsystems mittels:  
pkg_add openvpn-2.1rc7
  Nun ein Verzeichnis anlegen und die Konfigurationsdateien aus dem Sample-Ordner dorthin kopieren:  
mkdir /etc/openvpn
cp -R /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn/
cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn/
  Als nächstes erfolgt die Erzeugung der notwendigen Schlüssel für den Server und einen Client und die Anpassung der Umgebungsvariablen:  
cd /etc/openvpn/easy-rsa/2.0
   
vi vars
...
export KEY_CONFIG="$EASY_RSA/openssl.cnf"
...
export KEY_COUNTRY="DE"
export KEY_PROVINCE="Oberfranken"
export KEY_CITY="Bayreuth"
export KEY_ORG="rs"
export KEY_EMAIL="rs@obsd44.rs.de"
   
source ./vars
./clean-all
./build-ca
  Wenn vars mit den richtigen Variablen "bestückt" wurde können hier einfach alle Vorgaben bestätigt werden- bis auf die Werte "Sign the certificate? [y/n]:" und "1 out of 1 certificate requests certified, commit? [y/n]". Diese beiden müssen mit "y" bestätigt werden.
Dann wird das Server-Cert erzeugt:  
bash-3.2# ./build-key-server server
Generating a 1024 bit RSA private key
.++++++
.............++++++
writing new private key to 'server.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) [Oberfranken]:
Locality Name (eg, city) [Bayreuth]:
Organization Name (eg, company) [rs]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:
Email Address [rs@obsd44.rs.de]:
   
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'DE'
stateOrProvinceName   :PRINTABLE:'Oberfranken'
localityName          :PRINTABLE:'Bayreuth'
organizationName      :PRINTABLE:'rs'
commonName            :PRINTABLE:'server'
emailAddress          :IA5STRING:'rs@obsd44.rs.de'
Certificate is to be certified until Jun 18 10:55:04 2019 GMT (3650 days)
Sign the certificate? [y/n]:y
   

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
  Nun das Ganze für den ersten Client, der als Name einfach mal client1 erhält:  
bash-3.2# ./build-key client1
Generating a 1024 bit RSA private key
......++++++
................++++++
writing new private key to 'client1.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) [Oberfranken]:
Locality Name (eg, city) [Bayreuth]:
Organization Name (eg, company) [rs]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [client1]:
Email Address [rs@obsd44.rs.de]:
   
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'DE'
stateOrProvinceName   :PRINTABLE:'Oberfranken'
localityName          :PRINTABLE:'Bayreuth'
organizationName      :PRINTABLE:'rs'
commonName            :PRINTABLE:'client1'
emailAddress          :IA5STRING:'rs@obsd44.rs.de'
Certificate is to be certified until Jun 18 10:56:00 2019 GMT (3650 days)
Sign the certificate? [y/n]:y
   

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
  Dann die Diffie Hellman Parameter erzeugen:  
bash-3.2# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
..........+......................................................
..............................................+..................
..................+......+............................+..........
.......+.......................................+.................
.............+.........+...................................+.....
+.................+....+.........................................
.....+...........................................................
...........+.....................+...............................
...................................................+.............
....+........+.......+....+......................................
.................................................................
.....+...........................................................
..+..............................................................
...................+...+...........+.........................+...
.............................................................+...
.........................................................+.......
................................+........+...................+...
.........................................................+.......
.......+.........................................................
.......+.........................................................
...........+.....................................+...............
....+....+..........................+..............+.............
................................................................+
+*++*++*
 
Nun sollte alles da sein:  
bash-3.2# ls -al keys/
total 92
drwx------  2 root  wheel   512 Jun 20 12:57 .
drwxr-xr-x  3 root  wheel   512 Jun 20 12:52 ..
-rw-r--r--  1 root  wheel  3800 Jun 20 12:55 01.pem
-rw-r--r--  1 root  wheel  3683 Jun 20 12:56 02.pem
-rw-r--r--  1 root  wheel  1168 Jun 20 12:52 ca.crt
-rw-------  1 root  wheel   891 Jun 20 12:52 ca.key
-rw-r--r--  1 root  wheel  3683 Jun 20 12:56 client1.crt
-rw-r--r--  1 root  wheel   664 Jun 20 12:56 client1.csr
-rw-------  1 root  wheel   887 Jun 20 12:56 client1.key
-rw-r--r--  1 root  wheel   245 Jun 20 12:57 dh1024.pem
-rw-r--r--  1 root  wheel   201 Jun 20 12:56 index.txt
-rw-r--r--  1 root  wheel    21 Jun 20 12:56 index.txt.attr
-rw-r--r--  1 root  wheel    21 Jun 20 12:55 index.txt.attr.old
-rw-r--r--  1 root  wheel   100 Jun 20 12:55 index.txt.old
-rw-r--r--  1 root  wheel     3 Jun 20 12:56 serial
-rw-r--r--  1 root  wheel     3 Jun 20 12:55 serial.old
-rw-r--r--  1 root  wheel  3800 Jun 20 12:55 server.crt
-rw-r--r--  1 root  wheel   664 Jun 20 12:55 server.csr
-rw-------  1 root  wheel   887 Jun 20 12:55 server.key
  Als nächstes machen wir und daran die Files zu verteilen: Files, die der Server braucht:  
cp ca.crt dh1024.pem server.crt server.key /etc/openvpn
bash-3.2# ls -al /etc/openvpn/
total 56
drwxr-xr-x   3 root  wheel   512 Jun 20 13:01 .
drwxr-xr-x  20 root  wheel  2560 Jun 15 09:04 ..
-rw-r--r--   1 root  wheel  1168 Jun 20 13:01 ca.crt
-rw-r--r--   1 root  wheel   245 Jun 20 13:01 dh1024.pem
drwxr-xr-x   4 root  wheel   512 Jun 20 12:33 easy-rsa
-r--r--r--   1 root  wheel  9974 Jun 20 12:34 server.conf
-rw-r--r--   1 root  wheel  3800 Jun 20 13:01 server.crt
-rw-------   1 root  wheel   887 Jun 20 13:01 server.key
  Files, die der Client braucht:  
mkdir client1
cp ca.crt client1.crt client1.key client1
  Dieses gesamte Verzeichnis "client1" dann auf den Client kopieren. Nun wird auf dem Server das tun0-Device für Routing-Mode eingerichtet:  
bash-3.2# echo "up" > /etc/hostname.tun0
bash-3.2# sh /etc/netstart
WARNING: /etc/hostname.tun0 is insecure, fixing permissions
bash-3.2# ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33204
        groups: lo
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
        inet 127.0.0.1 netmask 0xff000000
vic0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:0c:29:21:d4:98
        description: intern
        groups: egress
        media: Ethernet autoselect
        status: active
        inet6 fe80::20c:29ff:fe21:d498%vic0 prefixlen 64 scopeid 0x1
        inet 192.168.1.78 netmask 0xffffff00 broadcast 192.168.1.255
enc0: flags=0<> mtu 1536
tun0: flags=11<UP,POINTOPOINT> mtu 1500
        groups: tun
  Dann die aus den Samples kopierte server.conf anpassen. Das einzige was hier vorerst mal zu ändern ist ist der Name des Tun- Interfaces (siehe oben), der bei uns tun0 und nicht tun ist.
Also: die Zeile
dev tun
in
dev tun0
ändern und die server.conf speichern. Nun kann der Server mittels  
cd /etc/openvpn; openvpn server.conf
  gestartet werden.
Das sieht dann in etwa so aus:  
bash-3.2# openvpn server.conf
Sat Jun 20 13:13:48 2009 OpenVPN 2.1_rc7 i386-unknown-openbsd4.4 [SSL] [LZO1] built on Aug 12 2008
Sat Jun 20 13:13:48 2009 Diffie-Hellman initialized with 1024 bit key
Sat Jun 20 13:13:48 2009 TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Sat Jun 20 13:13:48 2009 gw 192.168.1.4
Sat Jun 20 13:13:48 2009 /sbin/ifconfig tun0 destroy
Sat Jun 20 13:13:48 2009 /sbin/ifconfig tun0 create
Sat Jun 20 13:13:48 2009 NOTE: Tried to delete pre-existing tun/tap instance -- No Problem if failure
Sat Jun 20 13:13:48 2009 /sbin/ifconfig tun0 10.8.0.1 10.8.0.2 mtu 1500 netmask 255.255.255.255 up
Sat Jun 20 13:13:48 2009 TUN/TAP device /dev/tun0 opened
Sat Jun 20 13:13:48 2009 /sbin/route add -net 10.8.0.0 10.8.0.2 -netmask 255.255.255.0
add net 10.8.0.0: gateway 10.8.0.2
Sat Jun 20 13:13:48 2009 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Sat Jun 20 13:13:48 2009 Socket Buffers: R=[41600->65536] S=[9216->65536]
Sat Jun 20 13:13:48 2009 UDPv4 link local (bound): [undef]:1194
Sat Jun 20 13:13:48 2009 UDPv4 link remote: [undef]
Sat Jun 20 13:13:48 2009 MULTI: multi_init called, r=256 v=256
Sat Jun 20 13:13:48 2009 IFCONFIG POOL: base=10.8.0.4 size=62
Sat Jun 20 13:13:48 2009 IFCONFIG POOL LIST
Sat Jun 20 13:13:48 2009 Initialization Sequence Completed
  Nun zum Client:
In meinem Fall ist das ein Windows XP Rechner. Hier habe ich openvpn-2.0.9-gui-1.0.3-install.exe von openvpn.se installiert. Dieses Paket enthält alles was ein Windows Client für OpenVPN braucht- eigentlich sogar mehr- aber das ist für einen ersten Test jetzt erstmal irrelevant.
Aus dem Verzeichnis C:\Programme\OpenVPN\sample-config die Datei client.ovpn nach C:\Programme\OpenVPN\config kopieren und anpassen:  
remote obsd44.rs.de 1194
  Nun noch die vorher auf dem Server erzeugten Schlüssel für den Client (siehe oben) in das gleiche Verzeichnis kopieren und die Datei client.ovpn entsprechend anpassen:  
ca ca.crt
cert client1.crt
key client1.key
  Dann zum Testen mit der rechten Maustaste auf die Datei client.ovpn klicken und aus dem Kontextmenü den Punkt "Start OpenVPN on this config file" wählen. Im Terminalfenster bzw. auf der Console des Servers sollte nun Bewegung zu sehen sein- zumindest wenn bis hierher alles glatt gelaufen ist. Auch im Fenster des Windows Rechners sollten Ausgaben zu sehen sein, die auf eine erfolgreiche Verbindung hinweisen. Der Tunnel steht! Nun auf dem Windows Rechner das "DOS-Fenster" schliessen. Damit schliesst sich auch wieder der Tunnel.
Unten bei der Uhr sollte seit der Installation ein neues Icon hinzugekommen sein. Hierauf rechts klicken und
"Connect" wählen. Es sollte kurz mal ein Fenster aufgehen und dann die Meldung "client is now connected, Assigned IP: 10.8.0.6" erscheinen. Zum Trennen der Verbindung kann wieder die gleiche Methode, diesmal "disconnect" verwendet werden. Es sollte nun möglich sein von der Windows-Seite aus den OpenBSD-Rechner unter der IP 10.8.0.1 anzupingen. Ebenso sollte der OpenBSD Rechner die Windows-Welt unter der IP 10.8.0.6 zu erreichen. Das wars erstmal zur Grundeinrichtung. Alles weitere sind Anpassungen, wie z.B. die Server Verifizierung und ähnliches und das Einbinden weiterer Clients. Abschliessend müssen wir noch dafür sorgen, dass der OpenVPN Server auf dem OpenBSD Rechner automatisch startet. Hierzu in die Datei /etc/rc.local folgendes eintragen:  
if [ -x /usr/local/sbin/openvpn ]; then
  echo -n ' openvpn ';
  cd /etc/openvpn; /usr/local/sbin/openvpn server.conf &
fi