Raspberry Pi : Installation et configuration d’OpenVPN

/, OS X, Raspberry pi, Raspbian, VPN/Raspberry Pi : Installation et configuration d’OpenVPN

Bonjour,

Dans cet article nous allons installer et configurer un VPN. Pour ce faire, nous utiliserons OpenVPN qui est une solution libre et gratuite.

1. Usages d’un VPN

Avant de configurer un VPN (Virtual Private Network) nous allons tout de même vous préciser le but de la manoeuvre. Un VPN va vous permettre de vous connecter à votre réseau (celui où est installé le serveur VPN) depuis l’extérieur. Un exemple, vous êtes à l’hôtel et vous vous connectez via votre VPN, votre adresse  IP publique sera celle de votre réseau (ou est situé le VPN) et non celui du FAI de l’hôtel.
Enfin vous allez pouvoir accéder aux ressources de votre réseau depuis un endroit distant.
Il existe plusieurs solutions pour fournir un VPN (et plusieurs protocoles), soit par le biais d’un matériel dédié, soit des solutions logiciels tel que l’on peut en retrouver sur les serveurs et notamment OS X Server.
Dans notre cas de figure, nous allons nous servir de notre Raspberry Pi fraichement configuré.

2. Configuration du serveur

2.1 Installation des logiciels

Tout d’abord nous allons installer plusieurs logiciels :

sudo apt-get install openvpn openssl easy-rsa

Historiquement easy-rsa était inclus dans le paquet openpvn, ce n’est plus le cas aujourd’hui, nous allons devoir déplacer ses fichiers.

sudo mkdir /etc/openvpn/easy-rsa
sudo cp -r /usr/share/easy-rsa /etc/openvpn

2.2 Easy-rsa

Nous allons éditer le fichier vars qui contient un certain nombre de paramètres.

sudo nano /etc/openvpn/easy-rsa/vars

Compléter les lignes suivantes :

export EASY_RSA="/etc/openvpn/easy-rsa" #INDIQUER LE CHEMIN DE EASY-RSA
export KEY_SIZE=2048 #VERIFIER CETTE VALEUR

Ajouter la ligne KEY_ALTNAMES si cette dernière n’est pas présente dans votre fichiers de configuration.

export KEY_COUNTRY="FR" #PAYS 2 LETTRE
export KEY_PROVINCE="France" #PAYS
export KEY_CITY="Bordeaux" #VILLE
export KEY_ORG="Home" #NOM DE L'ORGANISATION
export KEY_EMAIL="VOTRE EMAIL" #EMAIL
export KEY_OU="IT" #SERVICE
export KEY_ALTNAMES="RPi" #NOM
export KEY_NAME="RPi" #NOM

Nous avons ajouté le nom de notre serveur.

export KEY_CN="RPi-VPN" #CE NOM DOIT ETRE UNIQUE SI VOUS AVEZ ENVISAGE D'AVOIR PLUSIEURS SERVEURS VPN

Voici un l’état du fichier après avoir complété toutes les lignes :

 easy-rsa parameter settings

# NOTE: If you installed from an RPM,
# don't edit this file in place in
# /usr/share/openvpn/easy-rsa --
# instead, you should copy the whole
# easy-rsa directory to another location
# (such as /etc/openvpn) so that your
# edits will not be wiped out by a future
# OpenVPN package upgrade.

# This variable should point to
# the top level of the easy-rsa
# tree.
export EASY_RSA="/etc/openvpn/easy-rsa"

#
# This variable should point to
# the requested executables
#
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"


# This variable should point to
# the openssl.cnf file included
# with easy-rsa.
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`

# Edit this variable to point to
# your soon-to-be-created key
# directory.
#
# WARNING: clean-all will do
# a rm -rf on this directory
# so make sure you define
# it correctly!
export KEY_DIR="$EASY_RSA/keys"

# Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR

# PKCS11 fixes
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"

# Increase this to 2048 if you
# are paranoid.  This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=2048

# In how many days should the root CA key expire?
export CA_EXPIRE=3650

# In how many days should certificates expire?
export KEY_EXPIRE=3650

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="FR"
export KEY_PROVINCE="France"
export KEY_CITY="Bordeaux"
export KEY_ORG="Home"
export KEY_EMAIL="bastien.bleyzat@gmail.com"
export KEY_OU="IT"
export KEY_ALTNAMES="RPi"

# X509 Subject Field
export KEY_NAME="RPi"

# PKCS11 Smart Card
# export PKCS11_MODULE_PATH="/usr/lib/changeme.so"
# export PKCS11_PIN=1234

# If you'd like to sign all keys with the same Common Name, uncomment the KEY_CN export below
# You will also need to make sure your OpenVPN server config has the duplicate-cn option set
export KEY_CN="RPi-VPN"

Maintenant, nous allons devenir une autorité de certification, bien sûr en entreprise lors de cette étape, il vous faut utiliser une « vraie » autorité de certification (CA) comme Thawte ou GeoTrust.

Déplacez-vous (si ce n’est déjà fait) dans le répertoire de easy-rsa.

cd /etc/openvpn/easy-rsa

Nous avons besoin de passer en « root » pour les prochaines étapes :

sudo su

Nous allons charger le fichier vars que nous venons d’éditer :

source ./vars

Afin d’éviter tout problème, pour nettoyer le dossier /etc/openvpn/easy-rsa/keys entrer la commande :

./clean-all

easy-rss_clean-all

Enfin, lancer la génération du certificat racine (root) :

./build-ca

Cette commande va nous demander des informations, mais comme nous avons édité le fichier vars au préalable, il suffit d’appuyer sur ENTER à chaque prompt.

easy-rss_build-ca

Nous obtenons un fichier : ca.key

Nous allons générer une clé :

./build-key-server RPi

Pendant ces étapes, un challenge password vous sera demandé, appuyer sur ENTER laissez ce champ vide, fait de même pour optional company name.
Répondez « y » à Sign the certificate. De même pour commit.

build-key-server RPi

Nous obtenons un fichier : RPi.key

À présent, nous allons générer une clé pour notre périphérique client. Cette opération est à réitérer suivant le votre nombre de client(s). Il vous faudra générer une clé pour chaque périphérique autorisé à se connecter à votre serveur VPN.
Nous allons en généré une seule, pour un client de type MacBook Pro.

./build-key-pass MacBookProBastien

Une création de mot de passe vous sera demandée, il ne s’agit pas du mot de passe de connexion, utilisez-en un complexe, mais ne l’oubliez pas !
De plus, comme tout à l’heure, un challenge password vous sera demandé, appuyer sur ENTER laissez ce champ vide, fait de même pour optional company name.
Répondez « y » à Sign the certificate et commit.

build-key-pass

Nous obtenons un fichier : MacBookProBastien.key

Rendez-vous dans le dossier keys

cd keys

Nous allons chiffrer via l’algorithme 3DES notre clé cliente (Pour nous : MacBookProBastien.key)

openssl rsa -in MacBookProBastien.key -des3 -out MacBookProBastien.3des.key

Désormais, nous avons un certificat serveur et au moins un client.

Revenons dans le dossier easy-rsa :

cd ..

Nous allons sécuriser l’échange des clés. Il faut savoir que le client et le serveur doivent échanger des informations pour identifier qui est qui et établir la connexion.
Il faut éviter qu’un tiers puisse intercepter cet échange et se faire passer pour un de nos clients. Ce type d’attaque se nomme : MITH (man-in-the-middle).

Rassurez-vous, rien de bien compliqué à mettre en place, une seule commande :

./build-dh

Lors de la configuration, nous avons choisi une clé de 2048 bits, il s’avère que cela prend un certain temps, notamment car nous avons un Raspberry Pi et non une machine de guerre !
Vous pouvez faire une petite pause 🙂

build-dh

« This is going to take a long time » comme il est écrit, comptez 20 à 30 min.

Pour en finir avec la partie sécurité, nous allons implémenter une protection contre les attaques par déni de service le fameux DoS.
De plus, nous allons utiliser le HMAC (Hash-based message authentication code) permettant de sécuriser davantage les échanges entre client(s) et serveur.

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

2.3 Configuration d’OpenVPN

Maintenant, il va falloir configurer notre serveur VPN :

nano /etc/openvpn/server.conf

Le fichier est vierge, copiez-collez la configuration ci-jointe et adapter suivant votre configuration :

local 192.168.1.15 # ADRESSE IP INTERNE DU SERVEUR
dev tun
proto udp #PROTOCOLE
port 1194 #PORT 
ca /etc/openvpn/easy-rsa/keys/ca.crt #CHEMIN ca.crt
cert /etc/openvpn/easy-rsa/keys/RPi.crt #CHEMIN "serveur".crt
key /etc/openvpn/easy-rsa/keys/RPi.key #CHEMIN "serveur".key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem # VERIFIER CETTE VALEUR
server 10.8.0.0 255.255.255.0
# server and remote endpoints
ifconfig 10.8.0.1 10.8.0.2
# Add route to Client routing table for the OpenVPN Server
push "route 10.8.0.1 255.255.255.255"
# Add route to Client routing table for the OpenVPN Subnet
push "route 10.8.0.0 255.255.255.0"
# your local subnet
push "route 192.168.1.0 255.255.255.0" # VOTRE RESEAU
# Set primary domain name server address to the SOHO Router
# If your router does not do DNS, you can use Google DNS 8.8.8.8
push "dhcp-option DNS 192.168.1.1" # VOTRE ROUTEUR
# Override the Client default gateway by using 0.0.0.0/1 and
# 128.0.0.0/1 rather than 0.0.0.0/0. This has the benefit of
# overriding but not wiping out the original default gateway.
push "redirect-gateway def1"
client-to-client
duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log 20
log /var/log/openvpn.log
verb 1

Par défaut notre système d’exploitation Raspbian n’autorise pas le transit de paquets entre deux réseaux.

nano /etc/sysctl.conf

Dé-commentez la ligne  :

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

Voici le fichier de configuration complet :

net.ipv4.ip_forward=1

Rechargez les paramètres afin de les prendre en compte.

sysctl -p

 2.4 Configuration du Firewall

Raspbian comme d’autres systèmes d’exploitation à son propre pare-feu, ce dernier par défaut ne va pas laisser passer nos requêtes.
Nous allons créer un script Shell pour remédier à l’un de nos derniers « problèmes » de configuration :

nano /etc/firewall-openvpn-rules.sh

Collez-y ceci :

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o wlan0 -j MASQUERADE

Attention, nous utilisons dans cette configuration une carte réseau Wi-Fi, si vous utilisez le port Ethernet, remplacer wlan0 par eth0.
Autre précision, l’adresse IP  du client ne sera pas de la forme 192.168.1.X mais 10.8.0.X.
Vous pouvez changer ces paramètres dans le fichier : /etc/openvpn/server.conf puis répercutez la modification dans le script Shell du Firewall précédemment édité.

Une fois cette configuration finie, nous allons permettre au système d’exécuter le script et de changer de propriétaire.

chmod 700 /etc/firewall-openvpn-rules.sh
chown root /etc/firewall-openvpn-rules.sh

Enfin, il est judicieux d’automatiser tout cela en chargeant la règle du Firewall pendant la configuration réseau.

nano /etc/network/interfaces

Ajouter  la lige suivante :

pre-up /etc/firewall-openvpn-rules.sh

Voici notre fichier après ajout de la règle :

pre-up

Et on redémarre.

reboot

Le serveur est opérationnel.

3. Configuration du client

Dans cette partie nous allons générer un fichier de configuration client. Deux méthodes aux choix; soit à la main, soit on s’appuie sur la communauté. Ça tombe bien bien, une personne (Eric Jodoin) à créer un script pour automatiser le processus.

sudo nano /etc/openvpn/easy-rsa/keys/MakeOVPN.sh

Copiez ce contenu dans votre fichier :

#!/bin/bash

# Default Variable Declarations 
DEFAULT="Default.txt" 
FILEEXT=".ovpn" 
CRT=".crt" 
KEY=".3des.key" 
CA="ca.crt" 
TA="ta.key" 
 
#Ask for a Client name 
echo "Please enter an existing Client Name:"
read NAME 
 
#1st Verify that client's Public Key Exists 
if [ ! -f $NAME$CRT ]; then 
echo "[ERROR]: Client Public Key Certificate not found: $NAME$CRT" 
exit 
fi 
echo "Client's cert found: $NAME$CR" 
 
#Then, verify that there is a private key for that client 
if [ ! -f $NAME$KEY ]; then 
echo "[ERROR]: Client 3des Private Key not found: $NAME$KEY" 
exit 
fi 
echo "Client's Private Key found: $NAME$KEY"

#Confirm the CA public key exists 
if [ ! -f $CA ]; then 
echo "[ERROR]: CA Public Key not found: $CA" 
exit 
fi 
echo "CA public Key found: $CA" 

#Confirm the tls-auth ta key file exists 
if [ ! -f $TA ]; then 
echo "[ERROR]: tls-auth Key not found: $TA" 
exit 
fi 
echo "tls-auth Private Key found: $TA" 
 
#Ready to make a new .opvn file - Start by populating with the default file
cat $DEFAULT > $NAME$FILEEXT 
 
#Now, append the CA Public Cert 
echo "<ca>" >> $NAME$FILEEXT 
cat $CA >> $NAME$FILEEXT 
echo "</ca>" >> $NAME$FILEEXT

#Next append the client Public Cert 
echo "<cert>" >> $NAME$FILEEXT 
cat $NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $NAME$FILEEXT 
echo "</cert>" >> $NAME$FILEEXT 
 
#Then, append the client Private Key 
echo "<key>" >> $NAME$FILEEXT 
cat $NAME$KEY >> $NAME$FILEEXT 
echo "</key>" >> $NAME$FILEEXT 
 
#Finally, append the TA Private Key 
echo "<tls-auth>" >> $NAME$FILEEXT 
cat $TA >> $NAME$FILEEXT 
echo "</tls-auth>" >> $NAME$FILEEXT 
 
echo "Done! $NAME$FILEEXT Successfully Created."

Permettez l’exécution du fichier :

sudo chmod 700 /etc/openvpn/easy-rsa/keys/MakeOVPN.sh

Au début de ce script, l’auteur fait référence à un fichier Default.txt, nous allons le créer :

sudo nano /etc/openvpn/easy-rsa/keys/Default.txt

Copiez le contenu ci-après et adaptez-le en fonction de votre réseau.

client
dev tun
proto udp
remote VOTRE IP PUBLIQUE 1194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ns-cert-type server
key-direction 1 
cipher AES-128-CBC
comp-lzo
verb 1
mute 20

Veillez bien à renseigner ou changer le protocole, votre IP publique et le port.
Pour ce serveur VPN, nous avons réalisé ces opérations avec comme FAI Orange et nous n’avons pas d’IP Publique fixe, nous devons passer par un service de DNS dynamique : Dyn.org afin que notre IP publique qui change souvent, corresponde à un nom de domaine de la forme : name.dyndns.org.
Puis, dans les paramètres de votre routeur, configurer le service.

Dyndns

Il existe bien évidement d’autres services que dyndns, à vous de choisir celui qui vous correspond le mieux, en sachant que pour des performances correctes ces services sont payants.

Pour finir la configuration de notre réseau, il faut ouvrir le port 1194 en UDP sur notre serveur :

Port_forwarding_openVPN

Revenons à notre script, afin de générer un fichier de configuration.

cd /etc/openvpn/easy-rsa/keys
sudo su
./MakeOVPN.sh

Il vous sera demandé de renseigner le nom du client.

Make OpenVPN configuration profile

Le fichier de configuration client vient d’être créé.

Déplacer ce fichier dans un répertoire accessible ou via un clé USB.

cp MacBookProBastien.ovpn /home/pi

Si vous avez suivi l’article précédent, depuis votre machine principale vous avez accès au dossier /home/pi de votre RPi.

Rapatriez votre fichier de configuration.

Make OpenVPN configuration profile_2

4. Configuration du client OpenVPN

Si vous êtes sur Mac, nous vous conseillons le logiciel Tunnelblick, gratuit est fonctionne à la perfection.
Sur Windows, OpenVPN propose le client officiel.
Sur Linux :

sudo apt-get install openvpn network-manager-openvpn

Le reste de la configuration effectué sera depuis le client OS X (Mac).

On importe le fichier de configuration dans le logiciel VPN Tunnelblick :

Tunnelblick

On pense à changer de réseau, par exemple à l’aide d’un partage de connexion avec son smartphone favori.
Et on lance la connexion via son logiciel de VPN.

Tunnelblick_1Tunnelblick_2Tunnelblick_3Tunnelblick_4

On vérifie notre IP interne (bien attribuée par le serveur VPN).

Sur le client :

ifconfig

IP_VPN

On vérifie également que l’on peut contacter une machine sur le réseau local.

PING_VPN

Un autre test qu’il est possible d’effectuer est de se connecter au site www.ifconfig.me et comparer les IP publiques avant et après connexion au VPN.

Si vous avez passé tous ces tests avec succès, votre serveur VPN est fonctionnel.

Dernier point, pour révoquer un certificat :

source ./vars
./revoke-full Nomclient

À bientôt !

6 Comments

  • Bonjour,
    Au top ce petit tuto avec la derniere version d’OpenVPN.
    Je pense qu’il y a juste un petit soucis au niveau du code du fichier /etc/openvpn/server.conf dans le tuto. En effet des balises apparaissent.
    Merci pour toutes ces infos.

    Chris 26.03.2016
    • Bonsoir,
      Merci de votre commentaire. Nous venons de corriger la mise en page. Merci !

      beXen 26.03.2016
  • Ton tuto est bien expliqué ! merci à toi, j’y suis arrivé du 1er coup.
    Par contre il faudrait peut-être dire à un moment de lancer le service openvpn 🙂

    karim 17.08.2016
  • Bonjour BeXen,

    Super tuto, j’ai galéré un peu avec les fichiers easy-rsa, il faut faire cela méthodiquement.
    Ensuite j’ai essayé avec mon smartphone android (application gratuite OPENVPN) et importé le fichier .ovpn
    Le téléphone est resté au status « waiting for server »….
    On recherche tout, si les ports ne sont pas bloqués sur la box, les règles NAT, etc…..
    Finalement en regardant les logs de l’application il y avait un message d’erreur qui trainait:
    TCP/UDP: Socket bind failed on local address [AF_INET] 192.168.1.XX:1194: Cannot assign requested address
    Après une recherche, je suis tombé sur ce site: http://unix.stackexchange.com/questions/88667/openvpn-socket-bind-failed-on-local-address-af-inet-ip1194-cannot-assign-r
    Aparemment sur ton fichier de « /etc/openvpn/server.conf » j’ai commenté ta première ligne pour le pas être prise en compte.

    Depuis nikel j’arrive à me connecter avec mon téléphone. Je ne sais pas pourquoi mais ça marche. Est ce que tu pourrais m’expliquer ?
    Je laisse mes sources si cela peut aider.

    Et merci encore pour tes connaissances !!

    Yannick

    Yannick 29.08.2016
  • Bonjour BeXen
    après la ligne « openvpn –genkey –secret keys/ta.key » j’ontient l’erreur « Options error: Unknown key direction ‘/ta.key’ — must be ‘0’ or ‘1’ »
    vous avez une idée ?
    merci

    Benoit 22.01.2017
    • trouvé ! autant pour moi
      un espace en trop

      Benoit 22.01.2017

Leave a comment

Your email address will not be published.