462 lines
12 KiB
Markdown
462 lines
12 KiB
Markdown
# 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](https://forge.evolix.org/projects/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>
|
||
~~~
|
||
|
||
## Template systemd pour démarrer le client OpenVPN
|
||
|
||
Pour démarrer le client OpenVPN, il existe un template systemd, pour le démarrer et l'activé au démarrage :
|
||
|
||
~~~
|
||
# systemctl start openvpn@client
|
||
# systemctl enable openvpn@client
|
||
~~~
|
||
|
||
## 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](https://play.google.com/store/apps/details?id=de.blinkt.openvpn) et [F-Droid](https://f-droid.org/repository/browse/?fdfilter=openvpn&fdid=de.blinkt.openvpn)
|
||
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)
|
||
|
||
Si erreur _ca md too weak_ cela signifie que le certificat utilise du MD5. Pour forcer quand même, il faut même dans les options personnalisées :
|
||
|
||
~~~
|
||
tls-cipher "DEFAULT:@SECLEVEL=0"
|
||
~~~
|
||
|
||
## 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 tap0
|
||
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" (serveur OpenVPN – 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](https://forge.evolix.org/projects/shellpki) :
|
||
|
||
~~~
|
||
# cd /tmp
|
||
# shellpki.sh crl
|
||
# cp crl.pem /var/empty
|
||
~~~
|
||
|
||
|
||
### Erreur "createipforwardentry" (client OpenVPN – 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" (client OpenVPN – Windows)
|
||
|
||
En cas d'erreur `no more TUN/TAP adapter` aller dans _menu démarrer_> _OpenVPN_> _Add new TUN/TAP Adapter_
|
||
|
||
### Erreur "cipher final failed" (client OpenVPN – Android)
|
||
|
||
L'erreur `Authentificate/Decrypt packet error: cipher final failed` 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" (client OpenVPN – Android)
|
||
|
||
L'erreur `Bad LZO decompression header byte` signifie que la compression LZO n'est pas activée sur le serveur, il faut donc désactiver la compression au niveau du client.
|