openVPN server
De volgende documentatie op de stie van digital ocean is goed:
https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-ubuntu-20-04
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-18-04
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-14-04
openVPN ubuntu 16
- testomgeving
We installeren 2 extra machines:
- een openVPN server: ubuntu 14.04 in ons NAT-netwerk
- een openVPN client: LinuxMint17.3 bridged
- Netwerk
- SERVER:
# The primary network interface auto eth0 iface eth0 inet static address 172.16.10.200 netmask 16 gateway 172.16.0.1 dns-nameservers 10.28.100.10 10.28.100.20
- CLIENT: DHCP met network-manager
- SERVER:
- updaten
We voeren zowel op de client als op de server het volgende uit:
$ sudo apt-get update
$ sudo apt-get upgrade
- server: installatie openVPN
We installeren de pakketten openvpn en easy-rsa:
$ sudo apt-get install openvpn easy-rsa
Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: liblzo2-2 libpkcs11-helper1 easy-rsa The following NEW packages will be installed: liblzo2-2 libpkcs11-helper1 openvpn easy-rsa libccid opensc pcscd
- server: voorbereiding directory structuur openVPN
- we werken als root in directory
/etc/openvpn
# sudo su
# cd /etc/openvpn
- we kopieren vervolgens een voorbeeld-bestand,
server.conf
naar
/etc/openvpn/
en we unzippen dit:
# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn
# gzip -d server.conf.gz
- Hierna halen we de
/usr/share/easy-rsa
directory over naar/etc/openvpn
# cp -rvpdu /usr/share/easy-rsa/ .
- we werken als root in directory
- aanpassen server.conf
Na uitfilteren van de commentaar lijnen die beginnen met;
en/of#
houden we hetvolgende over:port 1194 proto tcp dev tun ca ca.crt cert server.crt key server.key # This file should be kept secret dh dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 172.16.0.0 255.255.0.0" keepalive 10 120 tls-auth ta.key 0 # This file is secret comp-lzo user nobody group nogroup persist-key persist-tun status openvpn-status.log verb 3
(het is altijd beter commentaar en uitgevinkte opties in je server.conf file te laten staan, maar op deze webpagina is dit overzichtelijker)
dit betekent: ...
port1194
: de poort waarop het transportprotocol UDP of TCP luistert naar REQUESTS
prototcp
: we gebruiken TCP als transportprotocol
devtun
:tun
cre-eert een VPN in laag 3 //tap
cre-eert een VPN in laag 2 als een bridge. Standaard wordt er ge-opteerd voortun
caca.crt
: verwijzing naar het VPN certificaat van de certificate authority - we cre-eren straks zelf een certificate-authority key-paar. crt-bestanden zijn publieke sleutels -- key-bestanden zijn private sleutels.
certserver.crt
: waar staat en hoe heet het certificaat (public key) van deze VPN-server.
keyserver.key
# This file should be kept secret: de private key van de server
dhdh1024.pem
: de diffie-hellman -file: https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange. We gaan deze file straks zelf genereren. Ze hoeft niet geheim te zijn maar wordt gebruikt om een veilige verbinding op te zetten. We gebruiken in deze opzet priemgetallen van 1024 bit, 4096 is aan te raden.
server10.8.0.0 255.255.255.0
: het netwerk gebruikt door je vpn. Als je verschillende vpn's nodig hebt op je client, en je bent beheerder van de server, kun je de verschillende vpn's andere ip-addressen toekennen.
ifconfig-pool-persistipp.txt
: een file in /etc/openvpn die ip-adressen toegekend door de vpn-dhcp bevat.
push"route 172.16.0.0 255.255.0.0"
: Als de verbinding loopt moet er door de VPN op de client eenroute
worden toegevoegd naar het nu nog onbereikbare NAT-netwerk.
keepalive 10 120: om de verbinding hoog te houden worden op regelmatige tijdstippen automatische pings vertuurd
tls-authta.key
0 # This file is secret: de TLS-sleutel -- a static pre-shared key (PSK) that must be generated in advance and shared among all peers. This features adds "extra protection" to the TLS channel by requiring that incoming packets have a valid signature generated using the PSK key. If this key is ever changed, it must be changed on all peers at the same time -- de server heeft gewoonlijk parameter 0 -- de client is dan 1.
comp-lzo: een compressie protocol
user nobody / group nogroup als linux gebruikers inloggen mag hun linuxaccount niet worden doorgegeven
persist-key: zorgt ervoor dat re-starts toegelaten zijn (ref. MAN-page)
persist-tun: Don't close and reopen TUN/TAP device or run up/down scripts
status openvpn-status.log: OpenVPN log file
verb 3: er wordt gelogd op verbose nivo 3. 0 geeft alleen fatal errors weer -- 6 en hoger dienen voor debugging -- 3 is gemiddeld.
-
keys (sleutels) genereren
- Diffie-Hellman
We beginnen met CPU-intensief werk. Het zoeken van priemgetallen. Minimum is 1024 bits, algemeen wordt 2048 als veilig gezien. Ik verwijs opnieuw naar dit artikel van wikipedia: https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
De diffie-hellman key plaats je best in/etc/openvpn
tik het volgende in:
# openssl dhparam -out /etc/openvpn/dh1024.pem 1024
openssl dhparam -out /etc/openvpn/dh1024.pem 1024 Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time ..........................................................................+.................. ....................................................................+..+........+.....+... +............................................................................................ ...........+..+..++*++*++*
We worden verwittigd dat het lang kan duren. Voor een dh4096 werk je best met snelle processoren.
De puntjes, plussen en sterren betekenen het volgende:'.' : A potential prime number was generated. '+' : Number is being tested for primality. '*' : A prime number was found.
ta.key
Deta.key
hoort ook thuis in de directory/etc/openvpn
We genereren hem als volgt:
# openvpn --genkey --secret /etc/openvpn/ta.key
De generatie duurt minder dan een toetsaanslag.
- server en clients sleutel-paren
We werken nu in de directory/etc/openvpn/easy-rsa
We maken een directorykeys
om onze sleutels te bewaren:
# cd /etc/openvpn/easy-rsa
# mkdir /etc/openvpn/easy-rsa/keys
We vullen eerst variabelen aan in een bestandvars
die straks als preset in onze sleutels gebruikt zullen worden:# easy-rsa parameter settings # --------------------------- # NOTE: If you installed from an RPM, # don't edit this file in place in # /usr/share/openvpn/easy-rsa -- # instead, you should copy the whole # easy-rsa directory to another location # (such as /etc/openvpn) so that your # edits will not be wiped out by a future # OpenVPN package upgrade. # --------------------------- # This variable should point to # the top level of the easy-rsa # tree. export EASY_RSA="`pwd`" # --------------------------- # This variable should point to # the requested executables # export OPENSSL="openssl" export PKCS11TOOL="pkcs11-tool" export GREP="grep" # --------------------------- # This variable should point to # the openssl.cnf file included # with easy-rsa. export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` # --------------------------- # Edit this variable to point to # your soon-to-be-created key # directory. # WARNING: clean-all will do # a rm -rf on this directory # so make sure you define # it correctly! export KEY_DIR="$EASY_RSA/keys" # --------------------------- # Issue rm -rf warning echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR # PKCS11 fixes export PKCS11_MODULE_PATH="dummy" export PKCS11_PIN="dummy" # --------------------------- # Increase this to 2048 if you # are paranoid. This will slow # down TLS negotiation performance # as well as the one-time DH parms # generation process. export KEY_SIZE=1024 # --------------------------- # In how many days should the root CA key expire? export CA_EXPIRE=3650 # --------------------------- # In how many days should certificates expire? export KEY_EXPIRE=3650 # --------------------------- # These are the default values for fields # which will be placed in the certificate. # Don't leave any of these fields blank. export KEY_COUNTRY="BE" export KEY_PROVINCE="VL" export KEY_CITY="Mechelen" export KEY_ORG="Education" export KEY_EMAIL="educ@education.edu" export KEY_OU="Education" # --------------------------- # X509 Subject Field export KEY_NAME="EasyRSA" # --------------------------- # PKCS11 Smart Card # export PKCS11_MODULE_PATH="/usr/lib/changeme.so" # export PKCS11_PIN=1234 # --------------------------- # If you'd like to sign all keys with the same Common Name, uncomment the KEY_CN export below # You will also need to make sure your OpenVPN server config has the duplicate-cn option set # export KEY_CN="CommonName"
Vervolgens voeren we dit 'niet uitvoerbaar' bestand uit met
# source vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
En we krijgen de mogelijkheid om alle keys te wissen ... (maar doen dit beter niet)
Nu creëren we ca.key
root@vpn-ub14:/etc/openvpn/easy-rsa# ./build-ca Generating a 1024 bit RSA private key .................................................++++++ .++++++ writing new private key to 'ca.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) [BE]: State or Province Name (full name) [VL]: Locality Name (eg, city) [Mechelen]: Organization Name (eg, company) [Education]: Organizational Unit Name (eg, section) [Education]: Common Name (eg, your name or your server's hostname) [Education CA]: Name [EasyRSA]: Email Address [educ2education.edu]: root@vpn-ub14:/etc/openvpn/easy-rsa#
Vervolgens genereren we de sleutels voor onze server:
root@openvpn-srv:/etc/openvpn/easy-rsa
# ./build-key-server /etc/openvpn/server
Generating a 512 bit RSA private key ..++++++++++++ .......++++++++++++ writing new private key to '/etc/openvpn/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) [BE]: State or Province Name (full name) [VL]: Locality Name (eg, city) [Mechelen]: Organization Name (eg, company) [Education]: Organizational Unit Name (eg, section) [Education]: Common Name (eg, your name or your server's hostname) [/etc/openvpn/server]: Name [EasyRSA]: Email Address [educ@education.edu]: --- 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/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'BE' stateOrProvinceName :PRINTABLE:'VL' localityName :PRINTABLE:'Mechelen' organizationName :PRINTABLE:'Education' organizationalUnitName:PRINTABLE:'Education' commonName :PRINTABLE:'/etc/openvpn/server' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'educ@education.edu' Certificate is to be certified until Sep 29 13:17:01 2026 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
Op de laaste 2 vragen antwoorden we telkens met
y
Soms krijg je de volgende error:
... unable to open '/etc/openvpn/easy-rsa/keys/index.txt'
Doe dan een
root@vpn-ub14:/etc/openvpn/easy-rsa# ./clean-all
En herbegin ....
Op vergelijkbare wijze kunnen we nu sleutels genereren voor de clients, maar het commando verschilt ...
# ./build-key client01
Ook nu beantwoorden we alle vragen (meestal met [ENTER] en de laatste twee met y. De keys worden opgeslagen in keys. We kijken even: ..-rw-r--r-- 1 root root 5608 Sep 29 15:21 client01.crt -rw-r--r-- 1 root root 545 Sep 29 15:21 index.txt -rw-r--r-- 1 root root 21 Sep 29 15:21 index.txt.attr -rw-r--r-- 1 root root 3 Sep 29 15:21 serial -rw-r--r-- 1 root root 546 Sep 29 15:21 client01.csr -rw------- 1 root root 522 Sep 29 15:21 client01.key
- Diffie-Hellman
- openVPN opstarten
Wat hebben we nu?
We hebben net sleutels gegenereerd,
We hebben een configuratie.
We kijken even of de server-sleutels in/etc/openvpn
staan:
root@openvpn-srv:/etc/openvpn# ls -l total 64 drwxr-xr-x 3 root root 4096 Sep 29 12:07 easy-rsa -rw-r--r-- 1 root root 10301 Sep 29 12:57 server.conf -rw-r--r-- 1 root root 2427 Sep 29 12:30 ca.crt -rw------- 1 root root 3272 Sep 29 12:30 ca.key -rw------- 1 root root 636 Sep 29 12:37 ta.key -rw-r--r-- 1 root root 245 Sep 29 12:56 dh1024.pem -rw------- 1 root root 371 Sep 29 15:32 openvpn-status.log -rw-r--r-- 1 root root 5780 Sep 29 15:17 server.crt -rw-r--r-- 1 root root 558 Sep 29 15:17 server.csr -rw------- 1 root root 522 Sep 29 15:17 server.key -rw------- 1 root root 22 Sep 29 15:24 ipp.txt
Met
sudo service openvpn start
start je de vpn;
Kijk in de syslog of het gelukt is ...