Met OpenVPN is het makkelijk om een verbinding te maken met een ander netwerk. Daarnaast kan je dan ook al het verkeer of specifiek verkeer laten routeren via deze verbinding. Dit kan allemaal gepusht worden vanaf de server zelf en hoeft dan geen verandering in de client configuratie te betekenen.
Deze beschrijving is gebaseerd op installatie op Ubuntu 14.04 

Vereisten

  • openssl
  • openvpn
  • easy-rsa pakket

Installatie pakketten

Voor OpenVPN is het handig om de repo van openvpn toe te voegen aangezien deze altijd de laatste versie bevat en die van Ubuntu zelf vaak een verouderde versie.

$ wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
$ echo "deb http://swupdate.openvpn.net/apt trusty main" > /etc/apt/sources.list.d/swupdate.openvpn.net.list

Nu kunnen de pakketten geïnstalleerd worden.

$ apt-get update
$ apt-get install openvpn
$ apt-get install openssl
$ apt-get install easy-rsa

Certificaat genereren

Kopieer de startfolder naar de openvpn map.

$ cp -r /usr/share/easy-rsa/ /etc/openvpn
$ mkdir /etc/openvpn/easy-rsa/keys
$ nano /etc/openvpn/easy-rsa/vars

Server certificaat en CA

Daarna de vars file editen met de volgende gegevens. Dit om de certificaat generatie sneller en makkelijker te maken. 

vars
export KEY_COUNTRY="NL"
export KEY_PROVINCE="Utrecht"
export KEY_CITY="Nieuwegein"
export KEY_ORG="Organisatie"
export KEY_EMAIL="hostmaster@domein.naam"
export KEY_OU="Organisatie"

De volgende optie bepaalt de bestandsnamen van de gegenereerde certificaten en keys.

vars
export KEY_NAME="server"

Genereren van de DH key als volgt.

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

Genereren van TLS Shared Header key (Optioneel)

openvpn --genkey --secret ta.key

Vanuit de easy-rsa directory de volgende commando's geven.

. ./vars
./clean-all
./build-ca

Bij het volgende commando even de juiste Common Name ingeven. (domeinnaam)

./build-key-server server

Kopieer de bestanden naar de openvpn directory.

cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

Client certificaat

Vervolgens moeten we de client certificaten aanmaken. Vervang client1 door de username van de gebruiker. 

./build-key client1

De files client.crt en client.key moeten aan de client worden gegeven.

Configuratie OpenVPN

De configuratie voor de server is in 2 delen. Voor OpenVPN en een deel voor het OS.
Om de certificaten inline op te kunnen nemen gebruik je volgende tags: 

openvpn.conf
<ca>voor CA Cert</ca>
<cert>Certificaat zelf</cert>
<key>keyfile voor certificaat</key>
<tls-auth>TLS certificaat</tls-auth>

OpenVPN Server config

Dit is de basis configuratie voor een server. Natuurlijk kunnen er extra 'tweaks' gedaan worden.
Beste is om de certificaten niet inline te doen zoals bij clients. Met name de TLS Authenticatie werkt dan niet. 

openvpn.conf
dev tun
keepalive 10 60
persist-tun
persist-key
proto tcp
local 1.1.1.1 #Bij meerdere interfaces bind aan dit ip-adres
port 80
status status-tcp.log 5
log-append /var/log/openvpn-nl-tcp
verb 1
server 172.16.17.0 255.255.255.128
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DOMAIN nlkaldenhoven.vpn"
push "dhcp-option DNS 8.8.8.8"
ca ca.crt
cert domein.naam.crt
key domein.naam.key
dh dh2048.pem
duplicate-cn #users kunnen meer dan 1x inloggen met hetzelfde certificaat.
tls-auth tls.key 0 #Dit is de server kant voor tls-auth
tls-server

Configuratie Linux voor redirect al het verkeer

Om al het verkeer vanaf de client via de VPN Server te laten routeren moet ip forwarding ingeschakeld worden en daarnaast moet er in iptables nog NAT worden toegestaan.
IP forwarding direct inschakelen middels 

$ echo 1 > /proc/sys/net/ipv4/ip_forward

Configuratie aanpassen zodat na een reboot dit ook blijft bestaan /etc/sysctl.conf aanpassen en de regel

#net.ipv4.ip_forward=1

uncommenten. (= hekje verwijderen)
Dan voor iptables de volgende regel opnemen in de config. (10.8.0.0 is het subnet dat je kiest in de server configuratie van OpenVPN) 

iptables.up.rules
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT

OpenVPN Client config

openvpn-client.conf
persist-tun
persist-key
tls-client
client
dev tun
remote 1.1.1.1 80 tcp
lport 0
verify-x509-name "ca-name" name #Verify Servername in certificate
ns-cert-type server
key-direction 1 #Voor TLS auth

<ca>
-----BEGIN CERTIFICATE-----
CA Certificate Contents
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
Certificate Contents
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN RSA PRIVATE KEY-----
Private Key Contents
-----END RSA PRIVATE KEY-----
</key>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
TLS Key
-----END OpenVPN Static key V1-----
</tls-auth>

2FA authenticatie met DUO

Volg de instructies van de volgende pagina: https://www.duosecurity.com/docs/openvpn

Voeg de volgende optie toe aan de OpenVPN server configuratie i.p.v. auth-user-pass aan de client zijde. 

auth-user-pass-optional