https://openvpn.net/index.php/open-source/documentation.html
# 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
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
# 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
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
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
)
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.
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.
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.
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>
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 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)
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
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
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
En cas d'erreur no more TUN/TAP adapter aller dans menu démarrer> OpenVPN> Add new TUN/TAP Adapter
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.
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.