Procédure pour créer son propre serveur VPN sur Linux
Pour commencer nous allons définir ce qu'est le VPN, Un VPN, ou Réseau Privé Virtuel, crée une sorte de passage secret sécurisé entre deux points, comme entre deux réseaux d'entreprise (VPN site à site) ou entre un ordinateur personnel et un réseau d'entreprise (VPN client à site). Dans ce passage secret, appelé tunnel, toutes les données sont cryptées et séparées du reste du trafic. C'est là que réside l'avantage du VPN et son côté "privé". De nos jours, beaucoup de gens utilisent les VPN à des fins personnelles, comme contourner la censure ou protéger leur vie privée en masquant leur activité sur Internet.
Installation d'OpenVPN Server sur Ubuntu 20
A. Télécharger le script d'installation
Connectez-vous sur votre futur serveur VPN, et commencez par mettre à jour le cache des paquets. On en profite aussi pour installer cURL.
sudo apt-get update
sudo apt-get install curl
Ensuite, téléchargez le script d'installation avec cURL :
curl -O https://raw.githubusercontent.com/Angristan/openvpn-install/master/openvpn-install.sh
Dès que le script est téléchargé, vous devez ajouter des droits d'exécution afin de pouvoir l'exécuter par la suite :
chmod +x openvpn-install.sh
Ensuite, exécutez le script pour commencer la configuration pas à pas d'OpenVPN Server :
sudo ./openvpn-install.sh
B. Configurer le VPN
Quand vous lancez l'installation d'OpenVPN, vous verrez un message de bienvenue. Vous devrez fournir l'adresse IP du serveur VPN. Pas de souci, le système le détecte automatiquement. Si c'est une adresse locale, c'est normal. Sinon, l'adresse publique de votre serveur apparaîtra. Il vous montrera quelque chose comme "192.168.100.51". Il suffit de dire "OK".
Le script vérifie automatiquement si le NAT est utilisé et affiche l'adresse IP publique. Il vous suffit de confirmer, à moins que vous ne préfériez utiliser un nom de domaine particulier ou corriger l'information récupérée par le script (qui utilise cURL pour obtenir votre IP publique).

Si on vous demande pour IPv6, dites simplement "non". Ensuite, choisissez un port personnalisé, tapez "2" et entrez un numéro de port, comme "44912". Pour le protocole, appuyez sur "Enter" pour choisir le paramètre par défaut.
Pour le protocole, choisissez UDP, sauf si vous utilisez le port 443, auquel cas optez pour TCP pour simuler le HTTPS.
En ce qui concerne les résolveurs DNS pour le VPN, utilisez le choix 13 pour un serveur personnalisé ou sélectionnez un serveur dans la liste en indiquant son numéro.

Do you want to use compression ?
Pour la compression, dites "non" en tapant "n".
Customize encryption settings ?
Pour personnaliser les paramètres de chiffrement, tapez "y" si vous souhaitez le faire, sinon tapez simplement "n".

Ci-dessous, voici les différentes options proposées (ainsi que les choix recommandés et correspondants à la configuration automatique) pour ceux qui décident de personnaliser les options de chiffrement.

La première partie est terminée ! Appuyez simplement sur "Entrée" pour démarrer l'installation du serveur OpenVPN.

C. Création d'un premier client
Après la configuration du serveur VPN, le script crée un premier client VPN. Donnez un nom au PC qui utilisera le VPN, comme "pc-flo". Ensuite, quand on vous demande si vous voulez protéger le fichier de configuration par un mot de passe, répondez "2" pour oui et définissez un mot de passe.

Cela va créer un fichier de configuration OVPN dans le profil de l'utilisateur actuel. Comme je suis connecté en tant que root, la configuration est générée dans "/root/". Du côté du serveur VPN, l'ajout de ce client générera deux fichiers :
1. Certificat du client : "/etc/openvpn/easy-rsa/pki/issued/<nom du client>.crt"
2. Clé privée du client : "/etc/openvpn/easy-rsa/pki/private/<nom du client>.key"
Remarque en rapide : Vous pouvez à tout moment ajuster la configuration de votre serveur OpenVPN en modifiant le fichier de configuration : "/etc/openvpn/server.conf".
D. Ajouter un nouveau client OpenVPN
À tout moment, vous pouvez ajouter un nouveau client pur que chaque machine qui se connecte dispose de son propre certificat. Que ce soit pour ajouter ou supprimer un nouveau client, il suffit de réexécuter le script et de faire le choix "1".
sudo ./openvpn-install.sh

E. En mode NAT : la règle de redirection de ports
En mode NAT, c'est-à-dire avec un serveur VPN connecté derrière un routeur/pare-feu où le NAT est activé, vous allez devoir créer une règle de redirection de port. Sinon, les flux à destination de votre adresse IP publique sur le port 44912 ne seront pas redirigés vers le serveur VPN.
Si ces concepts sont flous pour vous : Le NAT et le PAT pour les débutants
Ainsi, sur mon pare-feu, je crée une règle pour rediriger les flux UDP/44912 à destination de mon adresse IP publique à destination du serveur VPN (192.168.100.51).
Tester la connexion VPN
Le fichier de configuration généré précédemment (/root/pc-flo.ovpn) dans le profil de l'utilisateur doit être transféré sur l'ordinateur qui doit se connecter au VPN. Si vous êtes sur Windows, vous pouvez utiliser WinSCP ou SCP, et sous Linux vous pouvez utiliser SCP.
A. Sur Windows
Sur Windows, il faudra installer OpenVPN GUI ou OpenVPN Connect. Personnellement, j'utilise OpenVPN GUI donc je dois copier-coller le fichier OVPN dans le répertoire suivant :
C:\Program Files\OpenVPN\config
Ainsi, dans mon client VPN, je vois bien ma nouvelle connexion VPN apparaître qui reprend pour nom celui du fichier OVPN :

En cliquant sur "Connecter", entrez le mot de passe du client "PC-FLO" pour vous authentifier avec votre certificat.
Une fois connecté, vous pouvez utiliser SSH pour accéder à votre serveur Ubuntu 20 via son adresse IP locale, "192.168.100.51". Vous pouvez également atteindre d'autres serveurs dans votre infrastructure distante. Lorsque vous accédez à Internet, votre trafic passe par le VPN, utilisant ainsi la connexion Internet de votre serveur VPN !
Sur Windows, vérifiez la configuration IP de votre machine. Le tunnel VPN opère sur le réseau "10.8.0.0/24", avec une adresse IP comme "10.8.0.2/24". Ce sous-réseau est défini dans le fichier "/etc/openvpn/server.conf" du serveur VPN via la ligne "server 10.8.0.0 255.255.255.0". Les serveurs DNS sont ceux de Cloudflare (1.0.0.1 et 1.1.1.1), choisis lors de la configuration initiale.

B. Sur Linux
Si votre poste client, qui doit utiliser le VPN, est sous Linux, vous pouvez installer OpenVPN via cette commande :
sudo apt-get install openvpn
Ensuite, le fichier de configuration OVPN devra être déposé à cet emplacement :
/etc/openvpn/client/
Pour déclencher une connexion basée sur ce fichier de configuration, il suffira de faire :
openvpn --client --config /etc/openvpn/client/pc-flo.ovpn

C. Les journaux sur le serveur VPN
La connexion du poste client est visible dans les journaux du serveur VPN, en exécutant la commande ci-dessous.
journalctl --identifier ovpn-server
Par exemple, lors de la connexion depuis mon poste client sous Windows, les journaux suivants sont visibles :
SRV-DEB-1 ovpn-server[436393]: MULTI: multi_init called, r=256 v=256
SRV-DEB-1 ovpn-server[436393]: IFCONFIG POOL IPv4: base=10.8.0.2 size=252
SRV-DEB-1 ovpn-server[436393]: IFCONFIG POOL LIST
SRV-DEB-1 ovpn-server[436393]: Initialization Sequence Completed
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 TLS: Initial packet from [AF_INET]89.87.49.50:53471, sid=eb971c1d a6a6884b
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 VERIFY OK: depth=1, CN=cn_uIEY50Oeg1zhnla8
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 VERIFY OK: depth=0, CN=pc-flo
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_VER=2.5.6
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_PLAT=win
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_PROTO=6
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_NCP=2
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_CIPHERS=AES-256-GCM:AES-128-GCM
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_LZ4=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_LZ4v2=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_LZO=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_COMP_STUB=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_COMP_STUBv2=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_TCPNL=1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_GUI_VER=OpenVPN_GUI_11
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 peer info: IV_SSO=openurl,crtext
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, 256 bit EC, curve: prime256v1
SRV-DEB-1 ovpn-server[436393]: <IP du serveur VPN>:53471 [pc-flo] Peer Connection Initiated with [AF_INET]<IP publique du PC Client>:53471
En complément, vous pouvez visualiser les règles IPtables avec la commande ci-dessous :
iptables -t nat -L -n -v
Cette commande doit vous permettre de voir que la chaîne POSTROUTING contient cette ligne :
 2200 971K MASQUERADE all -- * ens192 10.8.0.0/24 0.0.0.0/0
Une ligne indispensable pour que les flux du VPN soient correctement routés et acheminés.
Conclusion
Tutoriel terminé ! Nous avons vu comment installer facilement un serveur OpenVPN sur Ubuntu 20 grâce à un script. Pour un usage personnel, c'est parfait, mais pour une infrastructure plus complexe, il vaut mieux le configurer sur le pare-feu pour une gestion plus précise des flux. C'est idéal pour contourner la censure ou sécuriser votre navigation.
YEBOAH Samuel