Linux et les réseaux privés virtuels (VPN)

Configurer un réseau privé virtuel sur CentOS 7 :

 

Déploiement d'un VPN privé avec OpenVPN sur Linux

En raison de la situation du coronavirus qui s'aggrave de jour en jour, mon entreprise (je ne suis qu'un petit employé) a dû passer en état de "travail à domicile". Le problème, c'est que l'entreprise a toujours interdit d'apporter du travail à la maison, donc il n'y a pas d'infrastructure appropriée (VPN dans le réseau du bureau) pour supporter le travail à domicile. Même s'il y en a une, la capacité supportée n'est pas suffisante pour que tout le monde soit sur le VPN simultanément. Pour me préparer au jour où je serai autorisé à faire quelque chose à ce sujet, j'ai décidé de comprendre comment mettre en place mon propre serveur VPN privé.

Ce guide est un résumé des étapes nécessaires à la mise en place d'un serveur VPN de base, après avoir rencontré plusieurs problèmes au cours du processus. La configuration sera faite en utilisant une machine hôte Windows (le client VPN), une VM Linux (le serveur OpenVPN), et une autre VM Linux (agissant comme une machine dans un autre réseau privé non directement accessible depuis la machine hôte).
Avis de non-responsabilité
Applicabilité générale

Bien que j'essaie de rendre ce guide aussi générique que possible pour Linux, il est basé sur mon expérience avec la mise en place sur CentOS 7, donc il peut y avoir quelques parties qui ont besoin d'être modifiées en commandes équivalentes alternatives.

Ce que ce guide n'est pas

Si vous avez accès à un routeur passerelle qui supporte le VPN, vous pouvez toujours vous référer à son manuel d'utilisation et l'utiliser. Ce guide est destiné aux cas où, pour une raison quelconque, vous n'avez pas accès (en raison de la politique de l'entreprise, etc.) à un routeur passerelle avec une capacité VPN, et donc besoin de configurer un serveur VPN sur une machine Linux derrière le routeur.

Exigences et contexte de configuration

Connaissances

Connaissances de base sur l'administration de Linux
Connaissance de base des réseaux informatiques, du routage, du DNS et du pare-feu.
Connaissances de base sur le fonctionnement de l'authentification du client et du serveur TLS

Logistique

VirtualBox (les paramètres VM mentionnés ici s'appliquent à VirtualBox)
Adresse IP statique (dans le même sous-réseau que votre routeur) pour le serveur VPN.
Un sous-réseau d'adresse IP privé qui n'est pas accessible depuis la machine hôte
Un sous-réseau d'adresses IP à attribuer aux clients VPN.

Contexte

Le sous-réseau du routeur est 191.167.1.0/24
L'adresse IP statique du serveur VPN est 191.167.1.39
Le sous-réseau du réseau privé des 2 VMs est 191.167.3.0/24
Le sous-réseau du client VPN est 191.167.4.0/24

Configuration des VMs

Créer une VM pour le serveur VPN. Pour les paramètres réseau, utilisez un adaptateur ponté (appelé enp0s3 ci-après) et un adaptateur réseau interne (appelé enp0s8 ci-après). Assignez l'adresse IP statique du serveur VPN à enp0s3 et 191.167.3.1/24 à enp0s8 . Pour la passerelle par défaut et le DNS de enp0s3 , définissez-les sur l'adresse IP du routeur. S'il n'y a pas de serveur DNS disponible, vous pouvez le définir sur 8.8.8.8 .

Créez une VM pour la machine du réseau privé. Pour les paramètres réseau, utilisez une carte réseau interne (appelée enp0s8 ci-après). Attribuez l'adresse IP 191.167.3.2/24 à enp0s8 .

Assurez-vous que le système et les paquets sont à jour avant de continuer.
Installation d'OpenVPN sur le serveur VPN
Installation des dépendances

Pour ce guide, nous allons installer OpenVPN à partir des sources car cette méthode nous permet d'installer la dernière version stable disponible. Certains gestionnaires de paquets comme YUM ont tendance à utiliser des versions plus anciennes pour la cohérence des versions sur les serveurs de production.

Installez les paquets suivants ou l'équivalent, en fonction de votre distribution Linux.

gcc
make
Tout paquet qui fournit l'utilitaire route (pour CentOS 7, c'est net-tools).
openssl et openssl-devel
lzo et lzo-devel
pam et pam-devel
lz4 et lz4-devel
systemd et systemd-devel si vous avez l'intention d'exécuter OpenVPN en tant que service Systemd.

Installation d'OpenVPN

Téléchargez le code source compressé ici.

En tant qu'utilisateur avec les privilèges root, placez le code source compressé dans votre répertoire personnel et extrayez-le.

tar xfz openvpn-2.4.8.tar.gz

Entrez dans le dossier du code source extrait.

cd openvpn-2.4.8

Construire et installer OpenVPN à partir du code source.

./configure
make
make install

Si vous avez l'intention de l'exécuter en tant que service Systemd, changez la première commande en ceci.

./configure --enable-systemd

Si vous avez l'intention de fonctionner en mode non privilégié, changez la première commande en celle-ci.

./configure --enable-iproute2

Notez que les deux commandes ne font que passer des options au script configure, il est donc possible de lui fournir une combinaison d'options, en fonction de la façon dont vous voulez exécuter le serveur VPN.

Si vous rencontrez des problèmes dans l'une des étapes ci-dessus, regardez les messages d'erreur et essayez de trouver la cause du problème (je ne peux pas couvrir toutes sortes de problèmes ici).
État final

Vous devriez voir un dossier appelé sample , qui contient des exemples de fichiers de configuration pour le client et le serveur. Si vous avez activé Systemd pendant la configuration, vous devriez également voir le dossier distro/systemd, qui contient un exemple de fichier de service Systemd.

L'exécution de openvpn devrait fournir un chemin vers le binaire OpenVPN.
Configuration du serveur OpenVPN

Copiez le dossier sample/sample-config-files/server.conf dans /etc/openvpn/server/server.conf (ce dossier est le répertoire de travail spécifié dans le fichier de service Systemd). Vous devrez peut-être créer les dossiers s'ils n'existent pas.

Changez de répertoire dans /etc/openvpn/server et éditez /etc/openvpn/server/server.conf en quelque chose comme ceci. Vous pouvez changer certaines des valeurs si vous comprenez que cela affecte. Notez que ce qui suit n'est qu'un résumé de ce qui doit être activé.

local 191.167.1.39
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
topologie sous-réseau
serveur 191.167.4.0 255.255.255.0
push "route 191.167.3.0 255.255.255.0" # Commenter si le client doit envoyer tout le trafic par le serveur VPN
;push "redirect-gateway def1 bypass-dhcp" # Décommenter si on force le client à envoyer tout le trafic par le serveur VPN
;push "dhcp-option DNS 8.8.8.8 " # Décommenter si le client doit envoyer tout le trafic par le serveur VPN
auth SHA256
tls-auth ta.key 0
cipher AES-256-CBC
utilisateur nobody
groupe nobody
persist-key
persist-tun
status openvpn-status.log
verbe 3
explciit-exit-notify
remote-cert-eku "Authentification du client web TLS

Générer les paramètres Diffie Hellman.

openvpn dhparam -out dh2048.pem 2048

Générer la clé d'authentification TLS.

openvpn --genkey --secret ta.key

Configurer SSL

Utilisez OpenSSL pour générer une clé et un certificat CA. Créez une clé OpenSSL pour le serveur et utilisez la clé CA pour signer un certificat pour le serveur.

Placez le certificat CA, la clé du serveur et le certificat dans le répertoire /etc/openvpn/server. Les détails sur l'utilisation d'OpenSSL sont omis car il s'agit d'un sujet distinct en soi.

En utilisant la même AC, générez une paire clé-certificat pour CHAQUE client qui se connectera au serveur VPN.

Regardez ici pour quelques points clés dans le durcissement de la vérification TLS.
Configuration du pare-feu et du routage

Ici, nous utilisons Firewalld pour contrôler les interfaces réseau. Définissez enp0s3 comme zone publique et enp0s8 comme zone de confiance. Activez le service openvpn sur la zone publique.

firewall-cmd --permanent --zone=trusted --change-interface enp0s8
firewall-cmd --permanent --zone=public --add-service=openvpn
firewall-cmd --reload

Activez le masquage sur la zone publique.

firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --reload

De par sa nature, l'activation de la mascarade devrait activer la redirection d'IP. L'exécution de sysctl -p devrait contenir cette ligne dans la sortie.

net.ipv4.ip_forward = 1

Sinon, ajoutez la ligne ci-dessus à /etc/sysctl.conf et redémarrez le réseau.
Démarrer le serveur VPN pour tester

openvpn server.conf

Le terminal devrait être bloqué avec la dernière ligne disant quelque chose comme "Initialization process completed". Si ce n'est pas le cas et qu'il se termine, regardez le message d'erreur et essayez de remédier aux problèmes décrits.
Configuration de notre client

Téléchargez et installez OpenVPN Connect.

Depuis le serveur VPN, copiez le client.conf depuis le dossier sample/sample-config-files du dossier du code source. Renommez-le en utilisant l'extension de fichier .ovpn.

Aussi, copiez le certificat CA, la clé et le certificat du client, et ta.key .

Assurez-vous que tous ces fichiers se trouvent dans le même dossier.

Modifiez client.ovpn pour qu'il ressemble à ceci.

client
dev tun
proto udp
distant 191.167.1.39 1194
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
serveur remote-cert-tls
tls-client
auth SHA256
tls-auth ta.key
clé-direction 1
chiffrement AES-256-CBC
verbe 3

Importez ce fichier OVPN dans OpenVPN Connect et essayez de vous connecter au serveur.

En cas de succès, l'exécution de ipconfig /all dans Command Prompt devrait attribuer à la machine hôte une adresse IP de 191.167.4.0/24 . Vous pouvez également essayer d'envoyer un ping à 191.167.1.39 .

Vérifiez également que vous pouvez toujours accéder à Internet sur la machine hôte. Pour vérifier si le trafic passe par la machine hôte ou par le serveur VPN, utilisez la commande tracert pour vous aider.
Dépannage

Cette section ne garantit en aucun cas l'exactitude de la solution ou de la description du problème. Elle est juste basée sur mon expérience limitée pendant le processus d'installation.
La machine virtuelle du réseau interne ne peut pas atteindre (ping) ma machine hôte connectée au VPN.

Pour que les machines à l'intérieur du réseau privé puissent accéder aux clients du réseau VPN, la première étape est d'ajouter le routage sur ces machines pour atteindre le réseau VPN via le serveur VPN.

Dans ce cas,

ip route add 191.167.4.0/24 via 191.167.3.1 dev enp0s8

devrait faire l'affaire. Notez que cette route ne survivra pas à un redémarrage.

Quelque chose d'autre doit être fait du côté du serveur VPN pour que le routage fonctionne.

TK
Le client ne peut toujours pas accéder au réseau privé ni à Internet alors qu'il est en VPN

Essayez une règle de masquage explicite.

firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 191.167.4.0/24 -o enp0s3 -j MASQUERADE