home       inleiding       sysadmin       services       links       bash       werk       nothing      

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

 

  1. testomgeving
     
    We installeren 2 extra machines:
     
    • een openVPN server: ubuntu 14.04 in ons NAT-netwerk
    • een openVPN client: LinuxMint17.3 bridged
       
  2. 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  
       
  3. updaten
     
    We voeren zowel op de client als op de server het volgende uit:
    $ sudo apt-get update
    $ sudo apt-get upgrade
     
  4. 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

     

  5. 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/ .
       
  6. 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: ...
     
    port 1194: de poort waarop het transportprotocol UDP of TCP luistert naar REQUESTS
    proto tcp: we gebruiken TCP als transportprotocol
    dev tun: tun cre-eert een VPN in laag 3 // tap cre-eert een VPN in laag 2 als een bridge. Standaard wordt er ge-opteerd voor tun
    ca ca.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.
    cert server.crt: waar staat en hoe heet het certificaat (public key) van deze VPN-server.
    key server.key # This file should be kept secret: de private key van de server
    dh dh1024.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.
    server 10.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-persist ipp.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 een route 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-auth ta.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.
     

  7. 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
       
      De ta.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 directory keys om onze sleutels te bewaren:
       
      # cd /etc/openvpn/easy-rsa
      # mkdir /etc/openvpn/easy-rsa/keys
       
      We vullen eerst variabelen aan in een bestand vars 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

     

  8. 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 ...