Hi @ll,
ursprünglich schon einmal erstellt und von Madd kritisiert, hier nun die neue Variante des Howto…
Vorweg sei gesagt, dass in dieser Anleitung zwei Varianten benannt werden.
1) Anmeldung über Zertifikate
2) Anmeldung über Zertifikate und Zugangsdaten (Benutzername/Passwort)
Der Unterschied liegt lediglich in den Konfigurationsdateien von Server und Client, daher werde ich erst an der entsprechenden Stelle darauf hinweisen.
Betriebssystem
Um dieses Howto zu erstellen habe ich ein Ubuntu 8.04 Server unter Xen 3.0.3 über debootstrap installiert.
Zusätzliche Pakete
Nach dem ersten Start sollten noch die folgenden Pakete installiert werden:
- openssh-server (nur zu administrativen Zwecken / ich habe die OpenVPN-Konfiguration darüber durchgeführt)
- openvpn (zur Einwahl via OpenVPN… o_O )
- openssl (zur Zertifikatserstellung benötigt)
- iptables (für IP-Masquerading benötigt)
Erstellung der Zertifikate
Zunächst in den richtigen Ordner wechseln:
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/
Dier muss die Datei vars editiert werden. Dabei bitte (mindestens) die folgenden Zeilen anpassen:
export KEY_COUNTRY=DE
export KEY_PROVINCE=NRW
export KEY_CITY=Paderborn
export KEY_ORG=”7bf”
export KEY_EMAIL=”c@7bf.de”
Die Werte sind natürlich entsprechend eurer Umgebung anzupassen.
Durch Eingabe der folgenden drei Kommandozeilen wird das CA-Zertifikat (für die Erstellung von Server- und Client-Zertifikat erforderlich) erstellt:
. ./vars
./clean-all
./build-ca
Bei Ausführung von ./build-ca werden einige Informationen abgefragt, welche entsprechend eurer Daten angegeben werden sollten.
Bis auf den folgenden Eintrag sollten alle Werte bereits durch eure Angaben in der Datei vars passen.
Common Name (eg, your name or your server’s hostname) [7bf CA]:servername.7bf.de
Jetzt wird das Server-Zertifikat durch Aufrufen der folgenden Kommandozeile erstellt:
./build-key-server server
An dieser Stelle werden erneut einige Abfragen erfolgen, von denen wieder einige manuell Beantwortet werden müssen:
Common Name (eg, your name or your server’s hostname) [server]:servername.7bf.de
A challenge password []: <– MUSS NICHT ANGEGEBEN WERDEN!!
An optional company name []:7bf
Nun erstellen wir die Diffie Hellmann Parameter.
Warum dies erforderlich ist, habe ich leider noch nicht feststellen können, bin aber für jeden Hinweis dankbar
Ich habe nur festgestellt, dass es ohne nicht funktioniert.
./build-dh
Als letztes Zertifikat muss noch ein Client-Zertifikat erstellt werden.
Der Einfachkeit halber nenne ich das hier einmal client1, kann aber jegliche Form von Namen haben (abgesehen von Leer- und Sonderzeichen, da kann es zu Problemen kommen).
./build-key client1
Die Angaben können mit denen des Server-Zertifikates gleichgesetzt werden, bis auf den Common Name, dieser sollte den Namen des Clients (in der Kommandozeile zur Erstellung des Zertifikates angegeben) beinhalten.
Die Zertifikate sind damit erstellt und wurden unter
/usr/share/doc/openvpn/examples/easy-rsa/2.0/keys
abgelegt.
Nun müssen diese noch auf Server- und Client-Seite verfügbar gemacht werden.
Bitte wie folgt verteilen:
| ca.crt |
Server + alle Clients |
| ca.key |
nur an der key signing machine |
| dh{n}.pem |
Server |
| server.crt |
Server |
| server.key |
Server |
| client1.crt |
Client |
| client1.key |
Client |
Der Einfachste Weg zur Verteilung ist die Ablage in /etc/openvpn/keys/, da in /etc/openvpn/ auch die Server- bzw. Client-Konfiguration abgelegt wird und damit alles zusammen ist (vereinfacht z.B. ein Backup).
Konfiguration des Servers
Exemplarisch stelle ich hier zwei Server-Konfigurationen bereit, um (wie oben bereits besagt) die Einwahl mit und ohne Zugangsdaten zu verdeutlichen. Abzulegen ist die Konfigurationsdatei nach ihrer Erstellung in /etc/openvpn/. Eine Namensvorgabe gibt es nicht, doch muss die Datei auf .conf enden und wird dann beim starten des OpenVPN-Dienstes automatisch geladen.
Die Konfiguration sieht vor, dass entweder der FQDN (Domain-Name) des Servers angegeben wird, oder eine IP-Adresse. Des weiteren wird ein privates Netzwerk angegeben, welches für die eingewählten VPN-Clients gedacht ist. Dies muss kein Netz sein, dass der Server physisch beherrscht, sondern ein anderes, da der Server ohnehin als Gateway für die Clients fungieren wird. Als DNS-Server übergebe ich zwei von der Universität Paderborn, es können aber auch andere (z.B. ein eigener sein).
Einwahl nur mit Zertifikaten (keine Benutzer-Authentifizierung erforderlich):
user nobody
group nogroup
dev tun
local fqdn_oder_ip_vom_server
port 1194
proto tcp
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
server 192.168.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway”
push “dhcp-option DNS 131.234.137.23″
push “dhcp-option DNS 131.234.137.24″
client-to-client
keepalive 10 120
comp-lzo
persist-tun
persist-key
verb 3
log-append /var/log/openvpn.log
status /var/log/openvpn-status.log
Einwahl mit Zertifikaten und zusätzlicher Benutzer-Authentifizierung (Benutzer-Account auf dem Server):
user nobody
group nogroup
dev tun
local fqdn_oder_ip_vom_server
port 1194
proto tcp
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
server 192.168.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway”
push “dhcp-option DNS 131.234.137.23″
push “dhcp-option DNS 131.234.137.24″
client-to-client
keepalive 10 120
comp-lzo
persist-tun
persist-key
verb 3
log-append /var/log/openvpn.log
status /var/log/openvpn-status.log
plugin /usr/lib/openvpn/openvpn-auth-pam.so common-auth
client-cert-not-required
username-as-common-name
Da es sich bei dem VPN-Netzwerk um ein virtuelles Netzwerk handelt, benötigt der Server auch eine IP-Adresse in diesem Netzwerk. Zu diesem Zweck muss das Kernel-Modul tun geladen werden.
Auf physischen Linux-Servern ist das i.d.R. kein Problem, doch in Xen DomU’s ist normalerweise kein Kernel installiert.
Daher installiert man entweder einen Kernel inkl. Module oder kopiert sich einfach die Module der Xen Dom0 (Host-System der Xen-Maschine):
scp root@xen-dom0-name:/lib/modules/$(uname -r) /lib/modules/$(uname -r)
Darauf folgende kann auch das entsprechende Modul geladen werden:
modprobe tun
Der Server soll als Gateway fungieren, daher wird noch IP-Masquerading benötigt. Dazu sind drei Kommandozeilen erforderlich:
iptables -t nat -F POSTROUTING
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
Als Netzwerkadresse und Subnetzmaske sind hier wieder jene gefordert, die in der Server-Konfiguration verwendet wurden.
Nun kann der Server-Dienst gestartet werden:
/etc/init.d/openvpn start
Konfiguration des Clients
Auch hier stelle ich zwei Konfigurationsdateien bereit, analog zu den Server-Konfigurationen. Diese sollten ebenfalls unter /etc/openvpn/ abgelegt werden (nur eben auf dem Client). Auch hier gilt als Vorgabe lediglich die Endung .conf zu verwenden.
Einwahl nur mit Zertifikaten (keine Benutzer-Authentifizierung erforderlich):
client
dev tun
proto tcp
remote fqdn_oder_ip_vom_server 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
comp-lzo
verb 3
Einwahl mit Zertifikaten und zusätzlicher Benutzer-Authentifizierung (Benutzer-Account auf dem Server):
client
dev tun
proto tcp
remote fqdn_oder_ip_vom_server 1194
resolv-retry infinite
nobind
persist-key
persist-tun
auth-user-pass
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
comp-lzo
verb 3
Auch auf dem Client muss nun das Kernel-Modul tun geladen werden.
In den gängigen Distributionen sollte dies problemlos funktionieren:
modprobe tun
Damit kann die VPN-Einwahl durchgeführt werden:
openvpn /etc/openvpn/client1.conf
Ich verwende den Namen client1 hier nur exemplarisch… ihr habt die Datei selbst angelegt und wisst daher am besten, wie diese Zeile angepasst werden muss.
Bei der Benutzername- und Passwort-Abfrage sind die Daten eines Benutzer-Accounts vom Server gefordert.
Die Einwahl wird zwar auch mit dem root-Login funktionieren, ist jedoch nicht die feine Art. Daher rate ich dazu, einen Benutzer hierfür anzulegen.
Funktionstest
Wenn die Einwahl ohne Fehler funktioniert hat, dann könnt ihr dies noch überprüfen, indem ihr die Webseite http://www.wieistmeineip.de/ besucht. Diese sollte euch nun die öffentliche IP-Adresse eures VPN-Servers anzeigen.
Bei mir hat dies (abgesehen von dem Ubuntu 8.04) mit folgenden Software-Ständen funktioniert:
Linux-Server: openvpn 2.0.9-4etch1
Linux-Client: OpenVPN 2.0.9 i686-pc-linux
Windows-Client: OpenVPN-Portable 2.1_rc7 Win32-MinGW
Ich hoffe, dass ich jemandem mit diesem Howto helfen konnte… und vor allem hoffe ich, dass Madd nun zufrieden ist
Gruß,
c
Quellenangabe:
Bei meinen Recherchen nach “wie mache ich sowas” bin ich vor geraumer Zeit auf die folgende Seite gestossen, die mir auch bei diesem Howto das Leben erleichtert hat:
http://nodomain.cc/archives/2007/06/30/740-Howto-Rootserver-als-OpenVPN-Gateway-nutzen.html