Zum Inhalt

HowTo: Linux OpenVPN Server schnell und einfach installieren und konfigurieren

Die Anleitung sieht kompliziert aus, ist in Wirklichkeit aber einfach nur lang. Es wurde Wert darauf gelegt dass man die Kommandoschnipsel einfach copy-pasten kann, es sollte also niemand den Verstand verlieren dabei.

Der trickreichste Part ist der mit den Zertifikaten, aber das bedeutet irgendwie bei jeder Software Pain in the Ass – unsere Cryptosysteme sind einfach unschön zu handhaben.

WIe gesagt, copy-paste sollte in den meisten Umgebungen klappen 🙂

Los geht's:

Die Installation von OpenVPN geschieht unter Debian/Ubuntu mittels apt-get install openvpn, unter RHEL/CentOS bewirkt man gleiches mit yum install openvpn.

Wir besorgen uns nun easyrsa3 und erstellen Schlüssel und Zertifikate, das ist unbedingt notwendig:

Client-Zertifikat:

mkdir $HOME/clientside
cd $HOME/clientside
git clone git://github.com/OpenVPN/easy-rsa
cd easy-rsa/easyrsa3
./easyrsa init-pki
./easyrsa gen-req client1 nopass

Server-Zertifikat:

mkdir $HOME/serverside
cd $HOME/serverside
git clone git://github.com/OpenVPN/easy-rsa
cd easy-rsa/easyrsa3
./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-req server nopass
./easyrsa sign-req server server
openssl dhparam -out dh2048.pem 2048
/usr/sbin/openvpn –genkey –secret ta.key
./easyrsa import-req $HOME/clientside/easy-rsa/easyrsa3/pki/reqs/client1.req client1
./easyrsa sign-req client client1

Alles in die richtigen Verzeichnisse kopieren:

sudo cp $HOME/serverside/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/
sudo cp $HOME/serverside/easy-rsa/easyrsa3/pki/issued/server.crt /etc/openvpn/
sudo cp $HOME/serverside/easy-rsa/easyrsa3/dh2048.pem /etc/openvpn/
sudo cp $HOME/serverside/easy-rsa/easyrsa3/pki/private/server.key /etc/openvpn/
sudo cp $HOME/serverside/easy-rsa/easyrsa3/ta.key /etc/openvpn/
cp $HOME/serverside/easy-rsa/easyrsa3/ta.key $HOME/clientside/
cp $HOME/serverside/easy-rsa/easyrsa3/pki/issued/client1.crt $HOME/clientside/
cp $HOME/serverside/easy-rsa/easyrsa3/pki/ca.crt $HOME/clientside/
cp $HOME/clientside/easy-rsa/easyrsa3/pki/private/client1.key $HOME/clientside/

Client Script (bei der IP-Adresse muss die IP stehen, zu der der Client später verbinden soll – also die des OpenVPN-Servers):

nano $HOME/clientside/client.ovpn

client
dev tun
proto udp
remote change_this_to_server_IP_address 34557
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
verb 3

Jetzt fügen wir Keys und Zertifikat mit dem Client-Script zusammen, sodass wir nur eine ".ovpn" Datei haben, die wir an die Clients verteilen müssen:

cd $HOME/clientside/

[Das Script merge.sh.gz hier heruntenladen und ablegen]

gunzip merge.sh
sudo chmod +x merge.sh
sudo ./merge.sh
sudo chown $USER $HOME/clientside/client.ovpn

Das Clientscript ist somit abgeschlossen. Jetzt muss der Server noch konfiguriert werden:

Wir bearbeiten die Datei /etc/openvpn.conf:

port 34557
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
tls-auth ta.key 0
dh dh2048.pem
server 10.8.0.0 255.255.255.0
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
user nobody
group nogroup
status openvpn-status.log
verb 3
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 5 30

Eventuell möchte man unten statt 8.8.8.8 (Google-DNS) seine eigenen Nameserver eintragen. Die Zeile "server" gibt an, welches Netz für die OpenVPN-Clients vergeben wird.

In der Datei /etc/sysctl.conf trägt man nun

net.ipv4.ip_forward=1

ein. Der Linux-Host wird dadurch beim nächsten Reboot (und auch wirklich erst dann, den müssen wir zum Ende machen!) zum Router, das heißt er vermittelt Pakete zwischen seinen Netzwerkinterfaces.

Die IPTables-Firewall will auch noch konfiguriert werden, genauer möchte man, dass NAT a.k.a. Masquerading stattfindet. Der Linux Host soll quasi "Fritzbox" für die OpenVPN-Clients in Richtung Internet spielen.

sudo nano /usr/local/bin/firewall.sh

#!/bin/bash
iptables -t filter -F
iptables -t nat -F
iptables -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s "10.8.0.0/24" -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s "10.8.0.0/24" -j MASQUERADE

Das Firewall-Script wird nun ausführbar gemacht, gestartet und das Resultat geprüft:

sudo chmod +x /usr/local/bin/firewall.sh
sudo /usr/local/bin/firewall.sh
sudo iptables –list

Sinnvoll ist es nun, das Firewallscript rebootfest zu machen, deshalt kann das Script noch in die /etc/rc.local geschrieben werden. Es ist ausreichend, in /etc/rc.local das oben angelegte Script aufzuführen:

/usr/local/bin/firewall.sh

Unter RHEL/CentOS braucht es noch ein "chkconfig openvpn on" um den OpenVPN-Dienst automatisch starten zu lasen. Unter Debian/Ubuntu geht das mit dem Kommando "update-rc.d openvpn defaults".

Den Linux Host rebootet man nun (wir erinnern uns: ipv4 forwarding…), und fertig ist das OpenVPN-Gateway!

Published inTechTalk

2 Comments

  1. Jan Jan

    Hallo Florian,

    schönes kurzes Tutorial, aber irgendwie haben alle die IPTables-Anweisungen und ich suche händeringend eine Alternative Firewallkonfiguration mit der "ufw" für meinen Artikel Ubuntu OpenVPN Server.

    Falls Du Ideen hast, kannst Du ja mal Bescheid sagen.

    Danke und viele Grüße,

    Jan

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.