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(at)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 |