19
0
Fork 0
wiki/HowtoOpenVPN.md

13 KiB

Howto OpenVPN

https://openvpn.net/index.php/open-source/documentation.html

Installation sous OpenBSD

    # pkg_add openvpn

On gère une PKI sur le serveur via shellpki (voir ci-dessous). On crée clé/certificat pour le serveur VPN avec la commande suivante :

    # cd /etc/openvpn/ssl
    # sh shellpki.sh create

Note : le CN sera par exemple de la forme fw.vpn.example.com (il sera demandé de le saisir deux fois).

La configuration se fera via un fichier /etc/openvpn/server.conf avec les paramètres suivants à adapter :

  • server : réseau privé sur lequel le serveur VPN et les clients communiqueront

  • local : adresse IP du serveur, sur laquelle les clients se connecteront (adresse IP publique généralement)

  • push : route vers le réseau que les clients VPN pourront joindre

  • cert : certificat du serveur VPN (créé précédemment)

  • key : clé du serveur VPN (créée précédemment)

  • ifconfig-pool-persist : permet aux clients de conserver la même IP en cas de redémarrage

    daemon
    
    port 1194
    proto udp
    dev tun0
    dev-type tap
    verb 4
    
    user nobody
    group nobody
    chroot /var/empty
    #comp-lzo
    
    max-clients 50
    keepalive 15 120
    tls-exit
    persist-key
    persist-tun
    client-to-client
    resolv-retry infinite
    
    server 10.11.99.0 255.255.255.0
    local 198.51.100.1
    #client-to-client
    ifconfig-pool-persist /etc/openvpn/ipp.txt
    #route-method exe
    #route-delay 2
    push "route 192.0.2.0 255.255.255.0 10.11.99.1"
    
    ca /etc/openvpn/ssl/ca/cacert.pem
    dh /etc/openvpn/ssl/ca/dh1024.pem
    
    cert /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.crt
    key /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.key
    
    log /var/log/openvpn.log
    status /var/log/openvpn-status.log
    
    cipher AES-128-CBC # AES
    
    #fragment 1350
    #mssfix
    

Pour créer automatiquement une interface TUN au démarrage de la machine et démarrer OpenVPN :

    # cat << EOF > /etc/hostname.tun0
    up
    !/usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf
    EOF

Pour lancer manuellement OpenVPN sans redémarrer la machine :

    # ifconfig tun0 up
    # /usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf

Rotation des logs sous OpenBSD

Pour que les logs générés par OpenVPN soient rotatés, ne pas oublier de décommenter la ligne en question dans le fichier /etc/newsyslog.conf :

    /var/log/openvpn.log                    600  52    *    $W6D4 Z

Installation sous Debian

    # apt install openvpn

La configuration se fera via un fichier /etc/openvpn/server.conf :

    #
    # General settings
    #

    user  nobody
    group nogroup

    # Do not try to re-read key file and reopen tun device on restart since it runs
    # without root privileges.
    persist-key
    persist-tun
    #persist-remote-ip
    #persist-local-ip

    # Status file
    status /var/log/openvpn/status.log 1
    #log    /var/log/openvpn/openvpn.log
    # Logging verbosity. Logs are sent to syslog.
    verb 3

    # Keepalive
    keepalive 10 120
    #reneg-sec 300

    #
    # Network settings
    #

    port  1194
    proto udp
    dev   tun

    # Enable compression
    comp-lzo

    #
    # key/certificate
    #

    ca   /etc/openvpn/ssl/ca/cacert.pem
    cert /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.crt
    key /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.key
    dh   /etc/openvpn/ssl/ca/dh1024.pem

    #
    # private network
    #

    server 172.16.0.0 255.255.0.0
    mode   server

    # Management interface (used by check_openvpn for Nagios)
    management 127.0.0.1 1195 /etc/openvpn/management-pwd

Générer un mot de passe pour l'accès à l'interface de management (nécessaire au check Nagios) :

    # apg -n1 -m 12 >/etc/openvpn/management-pwd

check OpenVPN pour Nagios

Ajouter le check Nagios dans la conf NRPE :

    # echo "command[check_openvpn]=/usr/lib/nagios/plugins/check_openvpn.pl -H 127.0.0.1 -p 1195 -P $(cat /etc/openvpn/management-pwd)" >>/etc/nagios/nrpe.d/evolix.cfg

Récupérer le script depuis le CVS scripts, et installer les dépendances (TODO: à mettre le script en public)

    # apt install libnet-telnet-perl

Mise en place d'une PKI avec shellPKI (OpenBSD et Debian)

OpenVPN s'appuye par défaut sur des certificats, il est donc nécessaire de mettre en place une PKI. On utilisera shellPKI permettant de gérer une PKI très simplement en ligne de commande.

  • Créer le répertoire /etc/openvpn/ssl, et cloner le dépôt shellpki :

      # mkdir /etc/openvpn/ssl
      # cd /etc/openvpn/ssl
      # git clone https://forge.evolix.org/shellpki.git .
    
  • Créer le répertoire /var/www/htdocs/vpn/ssl (OpenBSD) ou /var/www/vpn/ssl (Debian) dans lequel les certificats seront copiés par défaut pour être distribués. Cet emplacement est configurable dans shellpki.sh

  • Editer les paramètres de la section [ req_distinguished_name ] du fichier openssl.cnf, notamment :

    • countryName_default
    • stateOrProvinceName_default
    • localityName_default
    • 0.organizationName_default
    • emailAddress_default
  • Exécuter :

      # sh shellpki.sh init
    
  • Confirmer l'initialisation, et choisir la passphrase qui sera demandée à chaque création de nouveaux certificats, puis le Common Name des futurs certificats créés (ex : vpn.example.com)

Permettre aux clients de conserver la même IP au fil de connexions

Le fichier ipp.txt contient une liste des clients et de leur adresse IP afin qu'en cas de redémarrage du serveur, ils conservent la même adresse. Ce fichier peut être utilisé afin de rendre persistantes les IPs attribuées aux clients.

Dans le server.conf ou server.ovpn :

    ifconfig-pool-persist /etc/openvpn/ipp.txt 0

Cela rend le fichier ipp.txt en lecture seule pour OpenVPN. Il faudra donc ajouter une nouvelle ligne de la forme CN,IP à chaque ajout d'un nouveau client.

Créer les paramètres pour un nouveau client VPN

  • Exécuter :

      # cd /etc/openvpn/ssl
      # sh shellpki.sh create
    
  • Choisir un CN unique pour la machine (ex : client1.vpn.example.com)

  • Récupérer le certificat et la clé dans /var/www/htdocs/vpn/ssl

  • Dans la conf client, rajouter la directive nobind. Par défaut le client se bind sur l'ip locale et le port 1194, nobind force l'utilisation d'un port aléatoire.

Renouveller le certificat principal du VPN

Si le certificat indiqué au niveau de la configuration OpenVPN expire lui-même :

    cert /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.crt
    key /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.key

Il faut le révoquer, puis en recréer un :

    # cd /etc/openvpn/ssl
    # sh shellpki.sh revoke
    # sh shellpki.sh create
    # cp /etc/openvpn/ssl/crl.pem /var/empty/

Enfin, on ajuste les lignes dans la configuration OpenVPN et on relance le daemon.

Configuration inline pour client OpenVPN

Pour simplifier la configuration pour les utilisateurs finaux on peut générer un fichier de configuration embarquant les certificats :

    client
    dev tap0
    tls-client
    proto udp
    #comp-lzo
    #ns-cert-type server

    tls-client
    remote vpn.example.com 1194

    persist-key
    persist-tun
    pull

    cipher AES-128-CBC

    <ca>
    -----BEGIN CERTIFICATE-----
    […]
    -----END CERTIFICATE-----
    </ca>

    <cert>
    Certificate:
        Data:
    […]
    -----END CERTIFICATE-----
    </cert>

    <key>
    -----BEGIN RSA PRIVATE KEY-----
    […]
    -----END RSA PRIVATE KEY-----
    </key>

Client OpenVPN sous Mac OS X

Télécharger la dernière version stable de Tunnelblick sur http://code.google.com/p/tunnelblick/

On suit les instructions d'installation (en anglais), puis :

  • On choisit de générer la configuration (indiquer qu'on n'a pas de fichiers de configuration)
  • Cela génère une configuration standard, notamment un dossier sur le bureau avec un fichier config.ovpn
  • On édite le config.ovpn en ajustant les options remote, ca, cert et key.
  • On copie également clé et certificatS dans ce dossier
  • On doit ensuite renommer ce dossier avec un nom se terminant par .tblk
  • On double-clic ensuite dessus, et cela installe configuration
  • On peut ensuite lancer le VPN via l'icone présente, puis choisir diverses options (connexion automatique, etc.)

Client OpenVPN sous Android

On utilise l'application libre "OpenVPN for Android" disponible sur Google Play et F-Droid qui ne nécessite pas de droits "root" avec Android 4 ou supérieur.

La configuration d'un VPN nécessite les informations suivantes :

  • le certificat CA peut être importé sous format PEM

  • le certificat client doit être au format PKCS#12 (fichier .p12 ou .pfx), on pourra ainsi le créer à partir de la clé/certificat :

      $ openssl pkcs12 -export -in goyk3OkjeuPread8Sluld.privacy.evolix.org.crt -inkey goyk3OkjeuPread8Sluld.privacy.evolix.org.key -out goyk3OkjeuPread8Sluld.privacy.evolix.org.p12
    
  • décocher "Compression LZO" si ce n'est pas supporté par votre serveur

  • décocher "Vérification du certificat de l'hôte" (sinon cela ne fonctionne pas a priori…)

  • forcer "Algorithme de chiffrement" à AES-128-CBC (à ajuster selon votre serveur)

How to OpenVPN niveau 2

Dans l'exemple qui suit le serveur VPN est sur une machine sous Debian et le client sur une machine sous OpenBSD

Voici le fichier /etc/openvpn/server.conf sous Debian :

    port 1194
    proto udp
    dev tap0
    server-bridge
    keepalive 10 120

    ;tls-auth ta.key 0 # This file is secret
    ;cipher BF-CBC        # Blowfish (default)
    ;cipher AES-128-CBC   # AES
    ;cipher DES-EDE3-CBC  # Triple-DES

    comp-lzo

    ;max-clients 100
    ;user nobody
    ;group nobody

    persist-key
    persist-tun

    ca   /etc/openvpn/ssl/ca/cacert.pem
    cert /etc/openvpn/ssl/files/serveur/serveur.crt
    key  /etc/openvpn/ssl/files/serveur/serveur.key
    dh   /etc/openvpn/ssl/ca/dh2048.pem

    status /var/log/openvpn-status.log
    log         /var/log/openvpn.log
    verb 3

Voici le fichier de configuration client sous OpenBSD :

    client
    proto udp
    dev tun0
    dev-type tap
    verb 4

    tls-client
    remote 1.2.3.4 1194

    user _openvpn
    group _openvpn
    chroot /var/empty

    persist-key
    persist-tun
    pull

    status /var/log/openvpn-status.log

    comp-lzo
    #verb 3
    #cipher AES-128-CBC

    ca /etc/openvpn/ssl/files/client/client.pem
    cert /etc/openvpn/ssl/files/client/client.crt
    key /etc/openvpn/ssl/files/client/client.key

FAQ

Erreur "--crl-verify fails" (constaté sur un serveur OpenVPN sous OpenBSD)

    Options error: --crl-verify fails with 'crl.pem': No such file or directory
    Options error: Please correct these errors.

Il faut parfois regénérer un fichier CRL.

Si l'on utilise une version récente de shellpki :

    # cd /tmp
    # shellpki.sh crl
    # cp crl.pem /var/empty

Erreur "ROUTE: route addition failed using createipforwardentry" (constaté sur un client OpenVPN sous Windows)

En cas d'erreur ROUTE: route addition failed using createipforwardentry, l'utilisateur n'a pas les droits suffisants pour ajouter une nouvelle route. Il faut essayer d'exécuter les logiciels (openvpn.exe et openvpngui.exe) dans un mode de compatibilité lancer en Administrateur. Pour plus de détails,voir http://www.bolehvpn.net/forum/index.php?topic=1746.0

Erreur "no more TUN/TAP adapter" (constaté sur un client OpenVPN sous Windows)

En cas d'erreur no more TUN/TAP adapter aller dans menu démarrer> OpenVPN> Add new TUN/TAP Adapter

Erreur "Authentificate/Decrypt packet error: cipher final failed" (constaté sur un client OpenVPN sous Android)

Cela signifie que l'algorithme de chiffrement n'est pas synchronisé entre le client et le serveur. Il faut donc ajuster la directive "cipher" sur le client.

Erreur "Bad LZO decompression header byte" (constaté sur un client OpenVPN sous Android)

Cela signifie que la compression LZO n'est pas activée sur le serveur, il faut donc désactiver la compression au niveau du client.