Installer un serveur VPN à partir de Raspberry Pi : tutoriel avec OpenVPN

La sécurité des accès Internet ouverts laisse souvent à désirer. Pour naviguer en toute liberté sur le Web, une des meilleures solutions est d’installer un VPN (virtual private network). Si l’on installe un serveur VPN personnel, on a tout de même accès à son réseau local depuis n’importe quelle connexion Internet.

Pour installer un réseau virtuel et privé, il est d’abord nécessaire de disposer d’un ordinateur qui joue le rôle de serveur. Le Raspberry Pi constitue pour ce faire une option bon marché.

Installer un serveur VPN : tour d’horizon des fonctionnalités

Un VNP est installé sur un réseau local (LAN), auquel il est également possible d’avoir accès depuis l’extérieur. Ceci permet de créer un réseau virtuel de communication, à travers lequel sont transmises les requêtes et les réponses entre le serveur VPN et les clients VPN (c’est-à-dire les appareils connectés au serveur).

Avec un VPN personnalisé, il est donc possible d’accéder au réseau local depuis tout réseau Internet. Ceci vous permet d’accéder aux données dans le LAN, de vous connecter à distance à divers appareils (comme une imprimante ou un fax), et d’utiliser votre connexion locale à distance. Grâce à une connexion chiffrée à votre serveur VPN, il est possible de naviguer de manière plus sécurisée sur le Net, comme si vous surfiez sur des réseaux wifi publics ouverts non protégés.

Pour qu’une telle connexion sécurisée soit rendue possible, il est indispensable d’installer un serveur VPN sur votre ordinateur et votre réseau local, et qu’il soit en permanence connecté à Internet. L’ordinateur fonctionne ainsi comme l’hôte du réseau virtuel privé, et les différents appareils (ordinateur portable, smartphone et tablette) sont connectés au serveur grâce à un programme client. À partir de là, si vous accédez via un client à une connexion Internet qui se trouve en dehors de votre propre LAN, sur votre serveur VPN, il va s’agir d’une connexion chiffrée, également appelée tunnel VPN.

Ce tunnel VPN, qui commence avec le client et se termine avec votre serveur VPN, s’étend tout le long de la connexion Internet. C’est la raison pour laquelle le tunnel est bien plus sécurisé que les connexions ouvertes standard. Les pirates ont donc du mal à pénétrer dans les tunnels et à interrompre la connexion. Un VNP personnel permet donc, même au sein des réseaux wifi ouverts, de protéger vos données sensibles (les données bancaires notamment).

Installer un serveur VPN avec le Raspberry Pi et OpenVPN : les avantages

Transformer un Raspberry Pi en serveur VPN est une opération particulièrement intéressante d’un point de vue économique, car le prix d’achat du nano-ordinateur et des accessoires nécessaires est relativement faible. Par ailleurs, la consommation d’énergie sur le long terme est bien moindre que celle d’un serveur classique. C’est donc une solution qui offre généralement un bon rapport qualité-prix, même s’il existe depuis de nombreuses alternatives au Raspberry Pi.

OpenVPN peut servir de VPN pour différentes raisons. Il s’agit d’abord d’un programme VPN gratuit et très populaire, compatible avec de très nombreux systèmes d’exploitation (Windows, OS X, Android, iOS, Linux et d’autres). Par ailleurs, le programme convainc avec son installation facile et sa grande stabilité.

De quoi a-t-on besoin pour installer un serveur VPN sur un Raspberry Pi ?

Pour suivre notre tutoriel vous aurez besoin des éléments suivants :

  • Un Raspberry Pi (nous conseillons le modèle 2 ou un modèle ultérieur)
  • Une micro carte SD sur laquelle vous aurez installé le système d’exploitation Raspbian Jessie
  • Une connexion Internet continue (de préférence avec un câble), ainsi qu’une alimentation (micro cable UBS) pour le Raspberry Pi.

Il s’agit ensuite de décider si l’on souhaite installer un serveur VPN directement sur le Raspberry Pi (avec moniteur, souris et clavier connectés), ou à travers un client SSH. La maintenance du serveur à distance au moyen du SSH est la version conseillée dans la plupart des cas, car vous pouvez ainsi accéder au serveur VPN à partir d’un autre ordinateur. 

Il existe à cette fin plusieurs programmes largement répandus, tels que PuTTY et WinSCP (pour Windows), ou OpenSSH (pour les systèmes d’exploitation Unix), qui vous permettent de gérer et contrôler le Raspberry Pi. Il s’agit ensuite de connecter le logiciel SSH au Raspberry Pi en spécifiant son adresse IPv4 dans le client (c’est-à-dire l’ordinateur à partir duquel vous souhaitez accéder au Raspberry Pi), et les relier l’un à l’autre. Vous pouvez par exemple inscrire l’adresse IP de votre Raspberry Pi dans le navigateur.

Ajuster les adresses IP

Pour utiliser un client SSH, il est recommandé d’assigner une adresse IP fixe privée au Raspberry Pi au sein du réseau local. Dans le cas contraire, il sera nécessaire de changer votre adresse IP dynamique à chaque fois que vous souhaiterez accéder au nano-ordinateur via SSH et y connecter le client. Plus important encore, il est essentiel de lier une adresse IP privée statique pour pouvoir utiliser OpenVNP : le serveur VNP doit être accessible en permanence par le réseau local à la même adresse.

De plus, vous devez maintenir le serveur VNP accessible en permanence depuis Internet à la même adresse. Toutefois, une connexion Internet classique dispose en général d’une adresse IP publique dynamique, qui se renouvelle au plus tard toutes les 24h, afin d’éviter que le serveur soit accessible constamment grâce à la même adresse IP. Si votre connexion Internet n’a pas d’adresse IP publique statique, vous pouvez établir un DNS dynamique (DDNS). 

Dans un autre article, vous pourrez obtenir des renseignements sur la marche à suivre pour attribuer une adresse IP statique à un Raspberry Pi, et les différentes options qui existent pour installer un DDNS. Si vous souhaitez maintenir votre Raspberry Pi en ligne en tant que serveur permanent, il est recommandé de veiller à le mettre à jour et vérifier régulièrement son niveau de sécurité.

Installer un serveur VNP sur un Raspberry Pi avec OpenVPN

L’installation avec OpenVNP peut maintenant débuter. Pour ce faire, commencez par ouvrir le terminal (la console) de votre Raspberry Pi.

Préparation du Raspberry Pi

Avant de débuter l’installation avec OpenVPN en elle-même, il est recommandé de rechercher et d’installer sur votre Raspberry Pi toutes les mises à jour disponibles : pour ce faire, il suffit d’entrer les commandes suivantes sur la console :

sudo apt-get update
sudo apt-get upgrade

Si vous n’avez pas encore changé les identifiants par défaut de votre Raspberry Pi (nom d’utilisateur « Pi » et mot de passe « Raspberry »), il est temps de le faire, sinon n’importe qui pourra accéder à votre système, localement ou sur le réseau via SSH. Grâce à la commande ci-dessous, vous accéderez à la configuration de votre nano-ordinateur, et pourrez choisir un mot de passe sécurisé.

sudo raspi-config

Installer OpenVPN et mettre en place des fichiers easy-rsa

Commencez par utiliser la commande ci-dessous pour installer le programme OpenVPN et OpenSSL, qui permet de sécuriser la connexion Internet :

sudo apt-get install openvpn openssl

Après avoir installé OpenVPN, copiez les scripts tout prêts « easy-rsa » dans le fichier de configuration OpenVPN. C’est ici que vous pourrez créer de nombreux certificats et des clés. La commande suivante fonctionne seulement sous Raspbian Jessie (pour les systèmes d’exploitation Wheezy précédents, le script se trouve à l’emplacement « /usr/share/doc/openvpn/examples/easy-rsa/2.0 ») :

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

Ouvrez ensuite le fichier suivant dans la console : « /etc/openvpn/easy-rsa/vars », et entrez-y la commande ci-dessous :

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

Il s’agit maintenant d’ajuster ce fichier. Vous pouvez modifier les paramètres en remplaçant l’intégralité de la ligne « export EASY_RSA="`pwd` » par la commande suivante :

export EASY_RSA="/etc/openvpn/easy-rsa"

La longueur de la clé peut également être ajustée, ce qui détermine le niveau de sécurité du chiffrement. Un Raspberry 3 dispose d’assez de puissance pour supporter sans problème une clé d’une longueur de 2048 bits. Avec la version 2 en revanche, ce chiffrement dégrade considérablement la vitesse, et il est par conséquent recommandé d’utiliser un chiffrement de 1024 bits seulement : c’est à vous d’apprécier, selon votre utilisation, quel paramètre parmi la vitesse de connexion ou le niveau de chiffrement est le plus important. Un chiffrement de 4096 bits est quant à lui utile dans certains cas seulement. On peut changer la longueur de la clé et ajuster la quantité de bits dans la ligne « export KEY_SIZE=2048 ».

Ensuite, retournez dans le dossier de configuration « easy-rsa », accordez les droits root et intégrez les paramètres réglés précédemment dans les variables de l’environnement en exécutant le script « vars » grâce à la commande « source ». Enfin, vous pouvez rendre le fichier de configuration obtenu accessible via un lien symbolique intitulé « openssl.cnf ».

cd /etc/openvpn/easy-rsa
sudo su
source vars
ln -s openssl-1.0.0.cnf openssl.cnf

Certificats et clés pour installer OpenVPN

Commencez par réinitialiser les clés et créez ensuite les premiers fichiers de clés pour OpenVPN.

./clean-all
./build-ca OpenVPN

Le programme vous demande ensuite de rentrer les deux lettres correspondant à votre « nom de pays » : entrez FR pour la France. Les champs suivants ne sont pas essentiels, et vous pouvez directement confirmer en pressant la touche « entrée ».

Ensuite, voici comment générer les fichiers clés pour le serveur :

./build-key-server server

Entrez à nouveau le code à deux lettres correspondant au pays, et laissez les champs suivants vides. Enfin, confirmez la requête, et générez le certificat en appuyant deux fois sur la touche « Y ».

La section suivante concerne l’installation d’un ou plusieurs clients VPN. Il faut créer un certificat et une clé pour chaque appareil auquel vous souhaitez accéder depuis le serveur VPN. Le processus est similaire à celui utilisé pour installer le certificat et la clé sur le serveur (entrer le code pays et le confirmer deux fois). Vous pouvez attribuer un nom spécifique à chacun des appareils : ceci permet ensuite de créer un client pour un « laptop », une « tablet » ou un « smartphone », grâce à la commande ci-dessous :

./build-key laptop
./build-key smartphone
./build-key tablet
…

Si vous souhaitez attribuer un mot de passe aux clients, il faudra remplacer la commande ci-dessus par celle-ci :

./build-key-pass laptop
./build-key-pass smartphone
./build-key-pass tablet
…

Voici ensuite comment compléter la génération du certificat grâce à la commande pour l’échange de clés Diffie-Hellman :

./build-dh

Cette étape peut prendre du temps. Une fois que le processus est complété, fermez votre session d’utilisateur root :

exit

Générer les fichiers de configuration pour le serveur OpenVPN

Ces fichiers sont générés grâce à la commande suivante :

sudo nano /etc/openvpn/openvpn.conf

Le fichier vide contient désormais plusieurs commandes, expliquées ci-dessous. En premier lieu, activez le routage par tunnel IP via « dev tun », et sélectionnez le protocole de transport UDP, en sélectionnant « proto udp » Si vous souhaitez utiliser le protocole TCP, sélectionnez « proto tcp »). La ligne suivante vous permet de déterminer si le serveur OpenVNP est accessible sur port 1194, mais ce paramètre peut être modifié.

dev tun
proto udp
port 1194

Ensuite, créez un certificat root (ca) SSL/TLS, un certificat digital (cert) et une clé digitale (key) grâce au fichier « easy-rsa ». Veillez à entrer le bon chiffrement de bits (1024, 2048 etc.).

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem

C’est maintenant le moment de préciser que le Raspberry Pi est utilisé en tant que serveur. Pour ce faire, il faut nommer l’adresse IP et le masque réseau de façon à ce qu’ils soient attribués au VPN.

server 10.8.0.0 255.255.255.0

La commande « redirect-gateway def1 bypass-dhcp » permet de diriger l’intégralité du trafic IP vers le tunnel IP. Si vous avez des exigences élevées en ce qui concerne le niveau de sécurité, vous pouvez les expérimenter lors du paramétrage ; si toutefois ceci cause des problèmes ou ralentit la navigation, il est recommandé d’annuler cette configuration. Les instructions ci-dessous, en revanche, devront être utilisées dans tous les cas, car c’est grâce à elles que vous pourrez renommer les serveurs publics DNS avec lesquels fonctionnera votre serveur VPN. Dans la commande suivante, un serveur de IONOS est désigné par « 217.237.150.188 », et un serveur de Google par « 8.8.8.8 ». Vous pouvez toutefois modifier ces codes comme vous le souhaitez en spécifiant les adresses IPv4 d’autres serveurs DNS. Dans la commande « log-append /var/log/openvpn », assurez-vous que l’information de connexion est écrite dans le fichier « /var/log/openvpn ».

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 217.237.150.188"
push "dhcp-option DNS 8.8.8.8"
log-append /var/log/openvpn

Avec « persist-key », les fichiers clés ne sont pas lus à nouveau, et les pilotes des réseaux TAP et TUN ne sont pas redémarrés. Après le démarrage d’un programme, les droits du démon OpenVPN sont restreints par « user nobody » et « group nogroup ». Avec « status /var/log/openvpn-status.log », vous créez un fichier de statut qui rapporte l’état de votre connexion. Il est également recommandé de concilier la précision des informations de connexion grâce à la commande « verb ». Si vous choisissez « 0 », vous ne recevrez aucune notification, à l’exception des messages d’erreur. Une valeur comprise entre 1 et 4 est adaptée à une utilisation normale, et des valeurs supérieures sont à utiliser en cas de résolution de problèmes. Il s’agit ensuite de paramétrer la commande « client à client », qui non seulement détecte le serveur, mais également les autres clients VPN, et d’activer la compression LZO avec « comp-lzo » (cet élément doit également être activé dans le fichier de configuration du client).

persist-key
persist-tun
user nobody
group nogroup
status /var/log/openvpn-status.log
verb 3
client-to-client
comp-lzo

Sauvegardez les modifications avec « Ctrl + O » et sortez de l’éditeur avec « Ctrl + X ».

Créer un script pour un accès Internet avec un client

Pour accéder à votre réseau local grâce à un tunnel VPN, il faut créer une redirection. Il convient pour cela de créer d’abord un fichier « /etc/init.d/rpivpn » :

Sudo nano /etc/init.d/rpivpn

Dans ce fichier, copiez les commentaires suivants afin de créer un titre pour le script Init Linux :

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rpivpn
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: VPN initialization script
### END INIT INFO

Ensuite, activez « ip forward » en écrivant « 1 » dans ce dossier :

echo 'echo "1" > /proc/sys/net/ipv4/ip_forward' | sudo -s

Puis créez une redirection pour les paquets VNP en utilisant le filtre de paquets « iptables ».

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

Il s’agit ensuite de paramétrer les commandes qui autorisent vos clients VNP à accéder au LAN et à Internet. Voici comment procéder :

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Enregistrez et fermez à nouveau le fichier avec « Ctrl + O » et « Ctrl + X ».

Pour que la redirection soit effective, il faut ensuite assigner les droits adaptés au script, et l’installer en tant que script Init.

sudo chmod +x /etc/init.d/rpivpn
sudo update-rc.d rpivpn defaults

Ensuite, exécutez le script et redémarrez le serveur VPN.

sudo /etc/init.d/rpivpn
sudo /etc/init.d/openvpn restart

Terminer l’installation des clients

La dernière étape consiste à regrouper les certificats et les clés de chaque client dans des paquets respectifs. Pour ce faire, il faut leur accorder les droits root en ouvrant le dossier « /etc/openvpn/easy-rsa/keys/ », créer le fichier de configuration client, et entrer les commandes suivantes dans le fichier « laptop ». La configuration est identique pour chaque client, il suffit de changer le nom de l’appareil dont il est question.

sudo su
cd /etc/openvpn/easy-rsa/keys
nano laptop.ovpn

Dans le fichier client « opvn », entrez les commandes suivantes :

dev tun
client
proto udp
remote x.x.x.x 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert laptop.crt
key laptop.key
comp-lzo
verb 3

Il faut toutefois ajuster le contenu des fichiers ci-dessus. À la quatrième ligne, remplacez « x.x.x.x » par l’adresse IP de votre fournisseur DDNS (si vous utilisez une adresse publique statique, vous pouvez simplement l’insérer ici), suivie par le port grâce auquel le serveur VPN doit être accessible. Aux troisième et quatrième rangs, entrez le nom de votre client (ici, « laptop »). Après avoir inséré ces modifications, sauvegardez-les avec « Ctrl + O », puis fermez l’éditeur avec « Ctrl + X ».

Enfin, copiez le fichier de configuration avec les certificats et les clés dans un fichier zip. Si vous n’avez pas encore installé de pack zip sur votre Raspberry Pi, vous pouvez le faire grâce à la commande suivante :

apt-get install zip

Pour créer un fichier zip, utilisez les commandes ci-dessous en vous assurant que chaque ligne comprend le bon nom de client.

zip /home/pi/raspberry_laptop.zip ca.crt laptop.crt laptop.key laptop.ovpn

Il faut ensuite ajuster les droits des fichiers et terminer l’installation par « exit ».

chown pi:pi /home/pi/raspberry_laptop.zip
exit

Il s’agit ensuite de transférer le fichier zip du Raspberry Pi au client (par exemple via un programme SCP ou SFTC), puis d’installer le client sur l’appareil. Vous pouvez désormais utiliser l’appareil pour accéder au client et à son réseau à partir de n’importe quelle connexion Internet.

Installer un serveur VPN sur un Raspberry Pi : une méthode qui paie

Installer un VNP est beaucoup moins coûteux que ce que l’on imagine. Dans la mesure où le Raspberry Pi consomme peu d’énergie, les frais de fonctionnement ne sont pas élevés. Il est par ailleurs possible de gérer la puissance de chacun des composants du serveur (Raspberry Pi, Micro carte SD, etc.)

Par ailleurs, un serveur VPN sur Raspberry Pi est très performant, et vous permet d’accéder à la connexion locale de votre ordinateur depuis n’importe quelle connexion Internet. La connexion VPN chiffrée vous permet de naviguer de façon beaucoup plus sécurisée sur le Web, que ce soit sur des réseaux Wifi sécurisés ou non, ou bien dans le cadre des datas de votre contrat mobile. Il est difficile de trouver une connexion mobile qui offre ce niveau de protection.