đŸ Archived View for deblan.io âș posts âș 599.gmi captured on 2023-01-29 at 02:44:15. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
Les VPN ont le vent en poupe depuis quelques temps. Rares sont les vidĂ©astes qui n'auront pas fait l'Ă©loge de services comme NordVPN. Cependant, avant de permettre de visualiser le contenu US de Netflix, un VPN permet de crĂ©er un rĂ©seau entre plusieurs machines au travers d'autres rĂ©seaux comme Internet. Ainsi, quand des machines sont connectĂ©es au mĂȘme rĂ©seau VPN, elles peuvent communiquer de la mĂȘme façon que dans un rĂ©seau local. C'est donc trĂšs intĂ©ressant lorsque l'ont souhaites isoler une application d'internet en la rendant tout de mĂȘme accessible dans ce rĂ©seau isolĂ©.
Il existe tout un tas de solutions pour réaliser son VPN. La plus connue est certainement OpenVPN mais je lui préfÚre Wireguard pour sa trÚs grande simplicité d'installation.
Dans mon cas d'usage, j'ai un serveur Wireguard sous Debian et des clients qui tournent principalement sur Debian mais aussi Windows et Android.
Sous Debian 10, il est nécessaire d'utiliser les dépots backports pour insaller Wireguard.
echo "deb http://deb.debian.org/debian buster-backports main contrib non-free" \ | sudo tee /etc/apt/sources.list.d/buster-backports.list
Une fois le dépot ajouté, il suffit de mettre à jour la liste des paquets et d'installer Wireguard.
sudo apt update && sudo apt install wireguard
Sur d'autres distributions, il faudra installer `wireguard-tools` mais je vous laisse vous rĂ©fĂ©rer Ă
pour plus d'informations.
En complément de Wireguard, je vous invite à installer `iptables` et `resolvconf` sur le serveur [^1] et uniquement `resolvconf` sur vos clients [^1] linux. `iptables` va permettre de realiser le routage des paquets tandis que `resolvconf` va permettre de gérer les DNS via la connexion VPN.
Une fois l'installation terminée, on va générer un couple de clés sur le serveur.
cd /etc/wireguard umask 077 wg genkey | tee privateKey | wg pubkey > publicKey
Suite Ă ces commandes, 2 nouveaux fichiers ont Ă©tĂ© gĂ©nĂ©rĂ©s : `privateKey` contient la clĂ© privĂ©e et `publicKey` contient la clĂ© publique. Il faudra conserver la clĂ© privĂ©e secrĂšte tandis que la clĂ© publique va permettre d'identifier le serveur auprĂšs des clients. Son contenu sera donc partagĂ© sur d'autres machines. Vous pouvez rĂ©aliser la mĂȘme opĂ©ration sur vos machines clientes qui seront elles aussi identifiĂ©es avec leur clĂ© publique. Les interfaces graphiques de Wireguard rĂ©aliseront la gĂ©nĂ©rations des clĂ©s automatiquement. Bien sur, vous pouvez crĂ©er autant de clĂ©s que vous le dĂ©sirez. Je recommande de crĂ©er un couple de clĂ© par serveur VPN.
Nous allons ensuite gĂ©nĂ©rer le fichier `/etc/wireguard/wg0.conf` oĂč `wg0` dĂ©signe le nom de l'interface rĂ©seau qui sera crĂ©Ă©e par wireguard. Selon vos besoins, vous pourrez en ajouter autant que vous le dĂ©sirez.
[Interface] Address = 10.0.0.1/24 SaveConfig = false PostUp = sysctl -w net.ipv4.ip_forward=1; iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.0.0.1/24 -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.0.0.1/24 -o eth0 -j MASQUERADE ListenPort = 51820 PrivateKey = clé_privée_du_serveur
Dans cette configuration, je dĂ©finie la page IP du rĂ©seau (`10.0.0.1/24`) et l'IP du serveur (`10.0.0.1`). Veillez Ă modifier le nom de l'interface connectĂ©e Ă Internet (ici `eth0`). InsĂ©rer Ă©galement le contenu de la clĂ© privĂ©e Ă la derniĂšre ligne. `SaveConfig` Ă `false` indique que le fichier pourra ĂȘtre modifiĂ© pendant que le serveur est lancĂ©. Enfin, on indique que le serveur Ă©coute sur le port `51820`. Vous pourrez rĂ©pĂ©ter cette opĂ©ration sur vos client mais vous devrez omettre les lignes avec `PostUp`, `PostDown` et `ListenPort`. Vous devrez Ă©galement changer `Address` en incrĂ©mentant l'ip et en fixant la page Ă 32 (exemple : `10.0.0.2/32`, `10.0.0.3/32`, etc.).
Enfin, il faudra renseigner la liste des clients du réseau VPN en utilisant leur clé publique et l'adresse IP qu'ils auront configurée.
[Interface] ... [Peer] PublicKey = clé_publique_du_client_1 AllowedIPs = 10.0.0.2/32 [Peer] PublicKey = clé_publique_du_client_2 AllowedIPs = 10.0.0.3/32
Coté client, il faudra renseigner le serveur :
[Interface] ... [Peer] PublicKey = clé_publique_du_server AllowedIPs = 10.0.0.0/24 Endpoint = ip.du.serveur.vpn:51820 PersistentKeepalive = 20
Dans cet exemple, j'ai dĂ©finie que seuls les paquets Ă destination du rĂ©seau VPN seront routĂ©s dans le VPN : `AllowedIPs = 10.0.0.0/24`. Si vous voulez router tout votre traffic, saisissez `AllowedIPs = 0.0.0.0/0` [^2]. Pour ajouter plusieurs plages, il suffit de les sĂ©parer par des virgules. Dans le bloc `[Interface]` des clients, vous avez la possibiltĂ© d'ajouter une propriĂ©tĂ© `DNS` afin de paramĂ©trer un ou plusieurs serveurs DNS. Les serveurs DNS devront ĂȘtre accessibles par le serveur VPN ou le client selon le paramĂ©trage de `AllowedIPs`. Attention, les DNS seront paramĂ©trĂ©s comme des DNS classiques et ils seront sollicitĂ©s pour rĂ©soudre tous les noms.
Une fois les configuration effectuĂ©e, vous pourrez dĂ©marrer ou arrĂȘter la connexion VPN avec `sudo wg-quick up wg0` et `wg-quick down wg0` sur le serveur et sur les clients. Vous pourrez monitorer les connexions avec la commande `sudo wg`.
[^1]: Techniquement, chaque pair (ou peer) est à la fois client et serveur. Quand je parle de "serveur", je fais référence à la machine qui va jouer le rÎle de routeur pour les différents pairs du VPN. Techniquement, un pair peut s'interconnecter à autant d'autres pairs qui lui est possible de joindre (cf la
et la
).
[^2]: Que ce soit sur un "serveur" ou un "client", `AllowedIPs` indique pour quelle(s) plage(s) IP le pair sera emprunté pour router les paquets. Sur le serveur, on souhaite que chaque pair reçoivent exclusement les paquets qui leur sont destinés (IP du pair/32) tandis que sur le client, 2 cas d'usages classiques seront généralement retenus : soit on utilise le serveur pour router que le traffic du réseau VPN (`10.0.0.0/24`) soit on veut que le serveur serve de proxy et tout le traffic réseau passera par lui (`0.0.0.0/0`).