From 69e04694465d35fc101a3b0470ba1b62da7058d1 Mon Sep 17 00:00:00 2001 From: Tristan PILAT Date: Mon, 29 Jun 2020 15:18:58 +0200 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20du=20Howto=20avec=20notamme?= =?UTF-8?q?nt=20l'ajout=20de=20la=20configuration=20sous=20OpenBSD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtoWireGuard.md | 157 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/HowtoWireGuard.md b/HowtoWireGuard.md index 0627a6fa..bfcfcc85 100644 --- a/HowtoWireGuard.md +++ b/HowtoWireGuard.md @@ -1,3 +1,144 @@ +--- +title: Howto Wireguard +categories: sysadmin network vpn +... + +* OpenBSD Manpage +* Debian Manpage + +[WireGuard](https://www.wireguard.com/) est une solution de communication Open source qui implémente la technique de réseau privé virtuel (VPN) pour créer des connexions point à point sécurisées. C'est une solution simple, moderne et rapide qui utilise une cryptographie moderne. Il vise à être plus rapide, plus simple et plus léger que IPsec. Il est également considérablement plus performant que OpenVPN. Initialement publié pour le noyau Linux, il est désormais multiplateforme (Windows, macOS, BSD, iOS, Android) et largement déployable. Il est déjà considéré comme la solution VPN la plus sécurisée et la plus simple à utiliser. + +## Installation + +Sous Debian (Kernel >= 5.6) et OpenBSD (>= 6.8), Wireguard fait désormais partie du Kernel. + +## Configuration + +### Manuelle sous OpenBSD + +On commence par créer une interface wg en générant une clé privée et en indiquant un port d'écoute (UDP). + +~~~ +server# ifconfig wg0 create wgkey $(openssl rand -base64 32) wgport 51820 +~~~ + +On voit maintenant la clé publique à utiliser côté client « wgpubkey » au retour de la commande qui suit. + +~~~ +server# ifconfig wg0 +wg0: flags=8082 mtu 1420 + index 9 priority 0 llprio 3 + wgport 51820 + wgpubkey gbLaHdkEhFxikmRaC5seub45rVQBZcHuzZFMq/ylXg8= + groups: wg +~~~ + +On utilise la même commande côté client sans besoin ici d'indiquer le port d'écoute puisqu'il s'agit d'une configuration cliente. + +~~~ +client# ifconfig wg0 create wgkey $(openssl rand -base64 32) +client# ifconfig wg0 +wg0: flags=8082 mtu 1420 + index 13 priority 0 llprio 3 + wgpubkey x90CP/5AdicGeJxYY+rj0uXGtE+dvW9Dyi5SL8HJsSg= + groups: wg +~~~ + +On note la clé publique affichée côté client. + +Côté serveur, on définit les clients autorisés. Il s'agit des adresses IP à partir desquelles le traffic entrant à déchiffrer sera autorisé. On indique donc l'adresse IP et la clé publique du client à autoriser : + +~~~ +server# ifconfig wg0 wgpeer x90CP/5AdicGeJxYY+rj0uXGtE+dvW9Dyi5SL8HJsSg= wgaip 203.0.113.2/32 +server# ifconfig wg0 +wg0: flags=8082 mtu 1420 + index 9 priority 0 llprio 3 + wgport 51820 + wgpubkey gbLaHdkEhFxikmRaC5seub45rVQBZcHuzZFMq/ylXg8= + wgpeer x90CP/5AdicGeJxYY+rj0uXGtE+dvW9Dyi5SL8HJsSg= + tx: 0, rx: 0 + wgaip 203.0.113.2/32 + groups: wg +~~~ + +On fait la même chose côté client en indiquant également l'adresse et le port à utiliser pour se connecter au serveur. Pour pouvoir envoyer tout le trafic via le tunnel VPN, les adresses IP autorisées sont définies sur 0.0.0.0/0. + +~~~ +client# ifconfig wg0 wgpeer gbLaHdkEhFxikmRaC5seub45rVQBZcHuzZFMq/ylXg8= wgendpoint vpn.example.com 51820 wgaip 0.0.0.0/0 +client# ifconfig wg0 +wg0: flags=8082 mtu 1420 + index 13 priority 0 llprio 3 + wgpubkey x90CP/5AdicGeJxYY+rj0uXGtE+dvW9Dyi5SL8HJsSg= + wgpeer gbLaHdkEhFxikmRaC5seub45rVQBZcHuzZFMq/ylXg8= + wgendpoint 203.0.113.1 51820 + tx: 0, rx: 0 + wgaip 0.0.0.0/0 + groups: wg +~~~ + +Enfin, il ne nous reste plus qu'à attribuer une adresse IP de chaque côté. + +~~~ +server# ifconfig wg0 192.0.2.1/24 up +~~~ + +~~~ +client# ifconfig wg0 192.0.2.2/24 up +~~~ + +On peut maintenant tester le bon fonctionnement du VPN : + +~~~ +client$ ping 192.0.2.1 +PING 192.0.2.1 (192.0.2.1): 56 data bytes +64 bytes from 192.0.2.1: icmp_seq=0 ttl=255 time=32.350 ms +64 bytes from 192.0.2.1: icmp_seq=1 ttl=255 time=25.615 ms +~~~ + +Côté client on peut ajouter des routes vers des IPs spécifiques voire plus généralement la route par défaut. + +Pour une configuration « roadwarrior », par exemple, deux routes sont nécéssaires : + +* Une route spécifique vers l'IP publique du serveur WireGuard avec une priorité importante +* Une route par défaut vers l'IP privée du serveur avec une priorité moindre + +~~~ +client# route add -priority 2 198.51.100.1 192.0.2.1 +client# route add -priority 7 default 192.0.2.1 +~~~ + +### Persistante sous OpenBSD + +__Côté serveur__ + +Création d'une interface wg contenant la clé privée, le port d'écoute, le ou les clients autorisés ainsi que l'IP privée du serveur. +On générera préalablement une clé privée à l'aide de la commande « openssl rand -base64 32 ». La clé publique à indiquer pour « wgpeer » sera la sortie de « ifconfig wg0 | wgpubkey » sur le client. + +~~~ +server# cat /etc/hostname.wg0 +wgkey XXXXXXXXXXXXXXXXXXXXX +wgport 51820 +wgpeer x90CP/5AdicGeJxYY+rj0uXGtE+dvW9Dyi5SL8HJsSg= 203.0.113.2/32 +inet 192.0.2.1/24 +up +~~~ + +__Côté client__ + +On fait la même chose côté client à la différence que l'on omettra le paramètre « wgport ». On peut également indiquer des routes à charger lors de l'initialisation de l'interface. La clé publique à indiquer pour « wgpeer » sera la sortie de « ifconfig wg0 | wgpubkey » sur le serveur. + +~~~ +client# cat /etc/hostname.wg0 +wgkey XXXXXXXXXXXXXXXXXXXXX +wgpeer gbLaHdkEhFxikmRaC5seub45rVQBZcHuzZFMq/ylXg8= wgendpoint vpn.example.com 51820 wgaip 0.0.0.0/0 +inet 192.0.2.2/24 +#!route add -priority 2 198.51.100.1 192.0.2.1 +#!route add -priority 7 default 192.0.2.1 +up +~~~ + +### Sous Debian + Sur le serveur : ~~~ @@ -25,3 +166,19 @@ Sur le client : # wg # wg set wg0 peer ${La clé publique du serveur} allowed-ips 10.10.10.1/32 endpoint ${IPWAN serveur:port} ~~~ + +## Débogage + +Sous OpenBSD : + +En cas de besoin, il est possible d'activer ou désactiver le débogage. + +~~~ +# ifconfig wg0 debug +# ifconfig wg0 -debug +~~~ + +## Liens + +* [Creating a Wireguard VPN on OpenBSD](https://xosc.org/wireguard.html) +* [Simple-network-interface](https://www.wireguard.com/#simple-network-interface)