|
|
@ -0,0 +1,433 @@ |
|
|
|
# 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> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 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) |
|
|
|
|
|
|
|
|
|
|
|
## 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](https://forge.evolix.org/projects/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. |