From 551971e3f808d69306267aba22270cec435eabf8 Mon Sep 17 00:00:00 2001 From: jdubois Date: Wed, 11 Oct 2023 12:32:33 +0200 Subject: [PATCH] =?UTF-8?q?R=C3=A9-=C3=A9criture=20compl=C3=A8te=20pour=20?= =?UTF-8?q?utiliser=20wg=20et=20wg-quick?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtoWireGuard.md | 258 ++++++++++++++++++---------------------------- 1 file changed, 103 insertions(+), 155 deletions(-) diff --git a/HowtoWireGuard.md b/HowtoWireGuard.md index 80059830..b33bb66b 100644 --- a/HowtoWireGuard.md +++ b/HowtoWireGuard.md @@ -3,194 +3,147 @@ title: Howto Wireguard categories: sysadmin network vpn ... +* Site officiel WireGuard : * OpenBSD Manpage -* Debian 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. +Sous Debian (Kernel >= 5.6) et OpenBSD (>= 6.8), Wireguard fait partie du Kernel. -## Commandes utiles - -Configurer une interface [wg(4)](https://man.openbsd.org/wg) côté serveur : +### Debian ~~~ -server# ifconfig wg0 create wgkey $(openssl rand -base64 32) wgport XXXXX +# apt install wireguard + +$ wg --version +wireguard-tools v1.0.20210223 - https://git.zx2c4.com/wireguard-tools/ ~~~ -Configurer une interface [wg(4)](https://man.openbsd.org/wg) côté client : +### OpenBSD ~~~ -client# ifconfig wg0 create wgkey $(openssl rand -base64 32) +# pkg_add wireguard-tools + +$ wg --version +wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/ ~~~ -Ajouter un client côté serveur (on indique le clé publique du client ainsi que son IP publique) : +## Configuration du serveur + +Autoriser le routage via `sysctl` : ~~~ -server# ifconfig wg0 wgpeer x90CP/5AdicGeJxYY+rj0uXGtE+dvW9Dyi5SL8HJsSg= wgaip 203.0.113.2/32 +# echo "net.ipv4.conf.all.forwarding = 1" >> /etc/sysctl.d/wireguard.conf +# echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.d/wireguard.conf +# sysctl -p /etc/sysctl.d/wireguard.conf ~~~ -Initier une connexion au serveur côté client (on indique la clé publique du serveur, son adresse « wgendpoint » ainsi que que les flux à autoriser) : +Générer une clé privée pour le serveur et sa clé publique : ~~~ -client# ifconfig wg0 wgpeer gbLaHdkEhFxikmRaC5seub45rVQBZcHuzZFMq/ylXg8= wgendpoint vpn.example.com 51820 wgaip 0.0.0.0/0 +# mkdir /etc/wireguard/keys/ +# wg genkey | tee /etc/wireguard/keys/serveur_priv | wg pubkey > /etc/wireguard/keys/serveur_pub ~~~ -## Configuration sous OpenBSD - -### Manuelle - -On commence par créer une interface [wg(4)](https://man.openbsd.org/wg) en générant une clé privée et en indiquant un port d'écoute (UDP). +Créer un fichier de configuration `/etc/wireguard/wg0.conf`, pour l'interface `wg0` : ~~~ -server# ifconfig wg0 create wgkey $(openssl rand -base64 32) wgport 51820 +[Interface] +Address = 192.0.2.1/24, 2001:db8::1/64 +SaveConfig = false +ListenPort = 51820 +PrivateKey = ***** # Contenu de /etc/wireguard/keys/serveur_priv ~~~ -On voit maintenant la clé publique à utiliser côté client « wgpubkey » au retour de la commande qui suit. +Avec : + +* `Address` : l'IP dans le réseau WireGuard attribuée au serveur +* `SaveConfig` : si true, la configuration est mise en mémoire (et protégée) tout le temps que l'interface est active ; signifie que si le fichier de configuration est modifié pendant que le VPN est UP, alors il sera remis comme il était au moment de son démarrage lorsqu'il sera coupé +* `ListenPort` : le port d'écoute de WireGuard, 51820 est celui par défaut +* `PrivateKey` : la valeur de la clé privée du serveur, générée plus tôt + +Il suffit ensuite de démarrer notre VPN avec `wg-quick` : ~~~ -server# ifconfig wg0 -wg0: flags=8082 mtu 1420 - index 9 priority 0 llprio 3 - wgport 51820 - wgpubkey gbLaHdkEhFxikmRaC5seub45rVQBZcHuzZFMq/ylXg8= - groups: wg +# wg-quick up wg0 +OU +# systemctl start wg-quick@wg0.service ~~~ -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. +On peut voir la configuration en cours avec `wg` : ~~~ -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 trafic 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 - -__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 | grep 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 | grep 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 -~~~ - -## Configuration sous Debian - -Sur le serveur : - -~~~ -# cd /root/wg -# umask 077 -# wg genkey > private -# ip link add wg0 type wireguard -# ip address add dev wg0 10.10.10.1/24 -# wg set wg0 private-key ./private -# ip link set wg0 up # wg -# wg set wg0 peer ${La clé publique du client} allowed-ips 10.10.10.2/32 endpoint ${IPLAN client:port} +interface: wg0 + public key: ***** + private key: (hidden) + listening port: 51820 ~~~ -Sur le client : +Enfin, on peut activer le démarrage automatique de notre interface `wg0` : + +~~~ +# systemctl enable wg-quick@wg0.service +~~~ + +## Déclaration des clients côté serveur + +Générer une clé privée pour un client et sa clé publique, puis une clé pré-partagée : + +~~~ +# wg genkey | tee /etc/wireguard/keys/client_priv | wg pubkey > /etc/wireguard/keys/client_pub +# wg genpsk > /etc/wireguard/keys/client_psk +~~~ + +Dans le fichier de configuration `/etc/wireguard/wg0.conf`, sous le bloc `[Interface]`, on crée un bloc `[Peer]` par client : + +~~~ +[Peer] # Client 1 +PublicKey = ***** # Contenu de /etc/wireguard/keys/client_pub +PresharedKey= ***** # Contenu de /etc/wireguard/keys/client_psk +AllowedIPs = 192.0.2.0/24, 2001:db8::/64 +~~~ + +Puis on redémarre l'interface `wg0` : + +~~~ +# wg-quick down wg0 && wg-quick up wg0 +OU +# systemctl restart wg-quick@wg0.service +~~~ + +Et on peut vérifier que la déclaration du peer est bonne : ~~~ -# cd /root/wg -# umask 077 -# wg genkey > private -# ip link add wg0 type wireguard -# ip address add dev wg0 10.10.10.2/24 -# wg set wg0 private-key ./private -# ip link set wg0 up # wg -# wg set wg0 peer ${La clé publique du serveur} allowed-ips 10.10.10.1/32 endpoint ${IPWAN serveur:port} +interface: wg0 + public key: ***** + private key: (hidden) + listening port: 51820 + +peer: ***** + allowed ips: 192.0.2.0/24, 2001:db8::/64 +~~~ + +Quand le client aura monté sa connexion WireGuard, son adresse IP sera visible dans une valeur `endpoint`. + +## Configuration du client + +Il faut donner au client les paramètres générés côté serveur : + +~~~ +[Interface] +PrivateKey = ***** # Contenu de /etc/wireguard/keys/client_priv +Address = 192.0.2.2/24, 2001:db8::2/64 + +[Peer] +PublicKey = ***** # Contenu de /etc/wireguard/keys/serveur_pub +PresharedKey = ***** # Contenu de /etc/wireguard/keys/client_psk +Endpoint = :51820 +AllowedIPs = 0.0.0.0/0, ::/0 ~~~ ## Débogage @@ -202,9 +155,4 @@ 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) +~~~ \ No newline at end of file