OpenVPN

OpenVPN est une application logicielle open-source qui implémente des techniques de réseau privé virtuel pour créer des connexions sécurisées point à point ou site à site dans des configurations routées ou pontées et des installations d’accès distant.

xakz > moi j’dis: tor browser -> openvpn perso sur vps -> vpn payant (3-4e/mois) -> méchant Internet

Licence

OpenVPN est fournis avec à la base 2 connexions gratuites, généralement pour effectuer des tests. Au delà de 2 utilisateurs clients il faudra acheter des licences (15$/client par an) https://openvpn.net/%20pricing/

Installation

On commence simplement par installer Openvpn via la commande apt

# apt install openvpn

Configuration

Génération des clés et certificats

L’installation d’Openvpn ajoutera automatiquement le paquet easy-rsa, les fichiers se trouveront dans /usr/share/easy-rsa (Selon les distributions les fichiers peuvent se trouver dans /usr/share/doc/openvpn/examples/easy-rsa/2.0)

On copie ensuite ces fichiers dans le répertoire d’openvpn.

# cp -a /usr/share/easy-rsa /etc/openvpn/

Les scripts présent dans /etc/openvpn/easy-rsa/ ont besoin d’être configurés pour utiliser l’authentification par clés/certificats. On se place donc dans ce répertoire afin de procéder à la configuration et la génération de ces dernier·ère·s

# cd /etc/openvpn/easy-rsa

On ouvre le fichier vars présent dans ce répertoire

# vim /etc/openvpn/easy-rsa/vars

Puis on modifie ces lignes (elles peuvent être laissées avec leurs valeurs par défaut)

export KEY_COUNTRY="US"
export KEY_PROVINCE="US"
export KEY_CITY="your city"
export KEY_ORG="yourcity.com"
export KEY_EMAIL="[email protected]"

On charge les (nouvelles) valeurs.

# source ./vars

On nettoie les anciens certificats qui auraient été générés antérieurement à l’aide du script clean-all présent dans le répertorie.

# ./clean-all

On lance la création de la clé de Diffie-Helman (qui peut prendre beaucoup de temps), toujours à l’aide des scripts présents, ici build-dh.

# ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
+.......................................................................++*++*

On utilise maintenant le script pkitool, c’est un outil qui nous permettra de générer les clés privées du serveur ainsi que son certificat. Pour plus d’information sur son utilisation il suffit de regarder l’aide :

# ./pkitool --help

Génération du certificat ca.crt et de la clé privée ca.key root dans /etc/openvpn/easy-rsa/keys/, cette dernière doit être gardée en sécurité et ne doit pas être directement utilisable par Openvpn. Normalement ses droits sont à rw-------

# ./pkitool --initca
Using CA Common Name: Fort-Funston CA
Generating a 2048 bit RSA private key
......................................................................+++
writing new private key to 'ca.key'

Génération de la clé MonServer.key et du certificat MonServer.crt dans /etc/openvpn/easy-rsa/keys/

./pkitool --server MonServer
Generating a 2048 bit RSA private key
...........................................................................+++
writing new private key to 'server.key'
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
[...]
Certificate is to be certified until Oct 2 17:18:31 2027 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated

Et enfin on génère a clé ta.key . L’option genkey permet de générer une clé qui sera utilisée comme secret. L’option secret permet d’écrire la clé dans le fichier.

# openvpn --genkey --secret keys/ta.key

On copie ensuite les clés et les certificats utiles pour le serveur dans le répertoire /etc/openvpn/:

# cp keys/ca.crt keys/ta.key keys/MonServer.crt keys/MonServer.key keys/dh1024.pem /etc/openvpn/

Chrooter OpenVPN

Par mesure de sécurité on va chrooté OpenVPN dans le répertoire /etc/openvpn/jail/, ainsi en cas de faille de sécurité le processus ne pourra pas s’exécuter au-delà de ce répertoire.

# mkdir /etc/openvpn/jail
# mkdir /etc/openvpn/jail/tmp

Configuration du serveur VPN

On va maintenant créer le fichier de configuration d’OpenVPN et y ajouter les options nécessaires. Il est à noter que beaucoup de firewall bloquent le port 1194, si aucun service http ne tourne sur le serveur il est judicieux d’utiliser le port 443 (https) qui sera certainement accessible.

# Vim /etc/openvpn/server.conf
# Serveur TCP/1194
# Le choix du port est ici 1194, pour ne pas être bloqué
# par la plupart des firewalls vous pouvez mettre 443
mode server
proto tcp
port 1194
dev tun

# Clés et certificats
# On indique leur chemin, /chemin/vers/ca.crt
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
tls-auth ta.key 1
key-direction 0
cipher AES-256-CBC

# Réseaux
# Le client sera dans le sous-réseau 10.8.0.0/24
# Les DNS utilisés seront ceux d’OpenDNS
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120

# Sécurité
# Le processus sera chrooté dans /etc/openvpn/jail
user nobody
group nogroup
chroot /etc/openvpn/jail
persist-key
persist-tun
comp-lzo

# configuration des logs
verb 3
mute 20
status openvpn-status.log
log-append /var/log/openvpn.log

# on rajoute ici les éventuels certificats à révoquer
;crl-verify crl.pem

Ce fichier server.conf permet de créer un serveur VPN SSL routé basée sur le protocole TCP et utilisant le port HTTPS (443) afin de maximiser sont accessibilité depuis des réseaux sécurisés par des Firewalls. Les clients obtiendront une nouvelle adresse IP dans le range 10.8.0.0/24.
Pour vérifier si la configuration et correcte, on se place dans le répertoire /etc/openvpn.

# cd /etc/openvpn

Et on lance la commande openvpn server.conf :

# openvpn server.conf
Thu Oct 5 17:26:45 2017 OpenVPN 2.3.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jun 26 2017
Thu Oct 5 17:26:45 2017 library versions: OpenSSL 1.0.1t 3 May 2016, LZO 2.08
Thu Oct 5 17:26:45 2017 Diffie-Hellman initialized with 2048 bit key
Thu Oct 5 17:26:45 2017 Control Channel Authentication: using 'ta.key' as a OpenVPN static key file
Thu Oct 5 17:26:45 2017 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Oct 5 17:26:45 2017 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Oct 5 17:26:45 2017 Socket Buffers: R=[87380->131072] S=[16384->131072]
Thu Oct 5 17:26:45 2017 ROUTE_GATEWAY 91.x.x.x/255.255.255.0 IFACE=eth0 HWADDR=00:xx:aa:xx:bb:xx
Thu Oct 5 17:26:45 2017 TUN/TAP device tun0 opened
Thu Oct 5 17:26:45 2017 TUN/TAP TX queue length set to 100
Thu Oct 5 17:26:45 2017 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Thu Oct 5 17:26:45 2017 /sbin/ip link set dev tun0 up mtu 1500
Thu Oct 5 17:26:45 2017 /sbin/ip addr add dev tun0 local 10.8.0.1 peer 10.8.0.2
Thu Oct 5 17:26:45 2017 /sbin/ip route add 10.8.0.0/24 via 10.8.0.2
Thu Oct 5 15:26:45 2017 chroot to '/etc/openvpn/jail' and cd to '/' succeeded
Thu Oct 5 15:26:45 2017 GID set to nogroup
Thu Oct 5 15:26:45 2017 UID set to nobody
Thu Oct 5 15:26:45 2017 Listening for incoming TCP connection on [undef]
Thu Oct 5 15:26:45 2017 TCPv4_SERVER link local (bound): [undef]
Thu Oct 5 15:26:45 2017 TCPv4_SERVER link remote: [undef]
Thu Oct 5 15:26:45 2017 MULTI: multi_init called, r=256 v=256
Thu Oct 5 15:26:45 2017 IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
Thu Oct 5 15:26:45 2017 MULTI: TCP INIT maxclients=1024 maxevents=1028
Thu Oct 5 15:26:45 2017 Initialization Sequence Completed

On peut maintenant lancer le serveur :

# service openvpn start

Configuration réseaux

Autoriser le sous-réseau à communiquer vers l’extérieur

Il faut configurer le serveur pour en faire un routeur. Les clients peuvent à ce stade se connecter au VPN et auront une adresse en 10.8.0.x, cependant ils ne sont pas autorisés à sortir de ce réseaux privé et il leur est donc impossible d’accéder à Internet.
Il faut donc router ce sous-réseau privé vers l’extérieur, le serveur fera le lien entre l’interface du VPN (tun0) et l’interface physique (eth0) et fera également la translation d’adresse (NAT) entre les adresses en 10.8.0.x privés et son adresse IP réelle (publique).
Pour activer le routage il faut modifier la valeur par défaut dans le fichier /proc/sys/net/ipv4/ip_forward qui est à zéro et la mettre à 1. Vous pouvez l’ouvrir avec vim et y modifier cette valeur ou directement passer par cette commande :

# echo 1 > /proc/sys/net/ipv4/ip_forward

Pour que le routage soit permanent il faut décommenter la ligne 28 du fichier /etc/sysctl.conf

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Configurer IPtables

Si vous utiliser Iptables il faut configurer certaines règles pour autoriser la connexion ainsi que le routage. Si vous n’utiliser pas Iptables il est possible que le firewall vous bloque quand même car la politique des règles par défaut est à DROP.

# Pour router les paquets (faire en sorte que le serveur ait un rôle de routeur
iptables -I FORWARD -i tun0 -j ACCEPT
iptables -I FORWARD -o tun0 -j ACCEPT
iptables -I OUTPUT -o tun0 -j ACCEPT

# Pour la translation d'adresses
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.2/24 -o eth0 -j MASQUERADE

Révoquer des certificats

Pour révoquer des certificats, en cas de départ de membre du personnel ou en cas de perte d’un pc portable par exemple, on se place dans /etc/openvpn/easy-rsa et on lance le script revoke-full avec en paramètre le certificat à révoquer.

# ./revoke-full PC42

Un fichier crl.pem sera généré (crl = certificate revocation list) et il faudra le copier dans /etc/openvpn/

# cp keys/crl.pem /etc/openvpn/

Pour que ce fichier soit pris en compte, il faut préciser l’option crl-verify dans le fichier de configuration du serveur /etc/openvpn/clientconf. Normalement la modification est immédiate.

Comptes clients OpenVPN

On crée, par soucis d’organisation, un répertoire qui contiendra la configuration des clients.

# mkdir /etc/openvpn/clientconf

Nous allons maintenant créer une clé pour le client PC1, on se place dans /etc/openvpn/easy-rsa :

# cd /etc/openvpn/easy-rsa

On charge les (nouvelles) valeurs.

# source vars

Clé sans mot de passe

On pourra ici se connecter au VPN directement. Pour cela on lance le script qui va générer cette clé.

# ./build-key PC1

Clé avec mot de passe

Lors de la connexion au VPN, un mot de passe sera demandé :

# ./build-key-pass PC1

Les fichiers

Les scripts généreront 3 fichiers dans le répertoire /etc/openvpn/easy-rsa/keys

  • PC1.crt: Certificat pour le client
  • PC1.csr: Certificat à laisser sur le serveur
  • PC1.key: Clés pour le client

On copie ces fichiers dans un dossier PC1 à créer dans /etc/openvpn/clientconf/

# mkdir /etc/openvpn/clientconf/PC1/

Copie des fichiers :

# cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/PC1.crt keys/PC1.key /etc/openvpn/clientconf/PC1/

Obtenir son adresse IP

On se place dans /etc/openvpn/clientconf/PC1/ :

# cd /etc/openvpn/clientconf/PC1/

On crée le fichier client.conf, il faut mettre l’adresse IP publique du serveur sur lequel est installé OpenVPN à la place des xxx.yyy.zzz.aaa.
Vous pouvez obtenir l’adresse IP publique du serveur via la commande ip addr sous réserve que ce dernier ne se situe pas dans un réseau privé. Sinon vous aurez l’adresse IP locale.

# ip addr

Vous pouvez utiliser wget qui va interroger un site web qui fournit l’adresse IP publique.

# wget -qO- ifconfig.me/ip 

ou bien simplement utiliser la commande hotname -i, là encore il ne faut pas que le serveur soit sur un réseau privé, vous obtiendrez cette fois-ci l’adresse de loopback.

# hostname -i

Ou encore cette solution :

ip route show dev eth0

Ici l’interface réseau est eth0, pour les lister un simple ifconfig suffit.

Création du fichier client

# Configuration du client
client
dev tun
proto tcp-client
remote xxx.yyy.zzz.aaa 443
resolv-retry infinite
cipher AES-256-CBC

# Clés et certificats
ca ca.crt
cert PC1.crt
key PC1.key
tls-auth ta.key 1
key-direction 1

# Sécurite
nobind
persist-key
persist-tun
comp-lzo
verb 3

Si vous voulez installer votre client sur Windows il faudra mettre l’extension .ovpn à votre fichier. On en fait donc une copie, qui sera toujours utile au cas où.

# cp client.conf client.ovpn

Le répertoire /etc/openvpn/clientconf/PC1/ doit maintenant contenir les fichiers suivant :

  • **ca.crt ** : Certificat du serveur
  • **client.conf ** : Fichier de config du client OpenVPN pour Linux, BSD, MacOS X
  • **client.ovpn ** : Fichier de config du client OpenVPN pour Windows
  • hennionn.crt : Certificat du client
  • hennionn.key : Clés du client
  • **ta.key ** : Clés pour l’authentification

On archive le tout et on peut envoyer l’archive sur le poste client.

# zip PC1.zip *

ou

# tar -czf PC1.tar *

Client sous Windows

Il faut télécharger le client sur http://openvpn.net/index.php/open-source/downloads.html
Une fois installé vous pouvez décompresser l’archive dans C:\Programs Files\Openvpn\conf\. Vous pouvez maintenant vous connecter via le bouton qui se trouve dans la barre des taches.

Erreurs rencontrées

J’avais une erreur et en faisant un netstat j’ai constaté que Apache utilisait déjà le port 443 pour le https, ce qui gênait OpenVPN. Il est cependant possible de faire cohabiter Apache et OpenVPN pour l’utilisation de ce port.

# netstat -plnt 
Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name
tcp 0 0 0.0.0.0:22 :::* LISTEN 9842/sshd
tcp6 0 0 :::80 :::* LISTEN 31283/apache2
tcp6 0 0 :::22 :::* LISTEN 9842/sshd
tcp6 0 0 :::443 :::* LISTEN 31283/apache2
tcp6 0 0 :::3366 :::* LISTEN 3233/(squid-1)

Annexes

Script

Script (https://github.com/nicolargo/openvpnscripts/) permettant d’automatiser les étapes décrites dans ce paragraphe et donc de permettre simplement la déclaration d’un nouveau client VPN sur votre serveur:

Plan réseau

Réaffecter soi-même les routes pour le VPN :

Commandes réseaux

# route add -net 10.8.0.0/24 gw 91.121.3.255
# route add -net 91.121.3.0/24 gw 10.8.0.1

Configuration Iptables

# OpenVPN
# règles obligatoires pour ouvrir déverrouiller l’accès :
iptables -I FORWARD -i tun0 -j ACCEPT
iptables -I FORWARD -o tun0 -j ACCEPT
iptables -I OUTPUT -o tun0 -j ACCEPT
# autres règles : Translation d'adresses
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.2/24 -o eth0 -j MASQUERADE

Documentation

https://openvpn.net/community/
https://openvpn.net/%20pricing/
https://angristan.fr/proxy-http-squid/
https://desgeeksetdeslettres.com/hardware/difference-proxy-vpn-anonyme
https://blog.nicolargo.com/2010/10/installation-dun-serveur-openvpn-sous-debianubuntu.html
https://technique.arscenic.org/.../installation-et-configuration-d
https://www.tecmint.com/install-openvpn-in-debian/
http://michauko.org/blog/openvpn-les-doigts-dans-le-nez-631/
https://fr.wikibooks.org/wiki/Administration_r%C3%A9seau_sous_Linux/Routage
https://www.hscripts.com/fr/tutoriels/linux-commands/route.html
http://openvpn.net/index.php/open-source/downloads.html
https://github.com/nicolargo/openvpnscripts/
https://raw.github.com/nicolargo/openvpnscripts/master/ovcreateclient-debian.sh
https://raw.github.com/nicolargo/openvpnscripts/master/ovcreateclient-centos.sh

> Partager <