2020-06-29 15:18:58 +02:00
---
title: Howto Wireguard
categories: sysadmin network vpn
...
2023-10-11 12:32:33 +02:00
* Site officiel WireGuard : < https: // www . wireguard . com />
2020-06-29 15:18:58 +02:00
* OpenBSD Manpage < https: // man . openbsd . org / wg >
2023-10-11 12:32:33 +02:00
* Debian Manpage < https: // manpages . debian . org / stable / wireguard-tools / wg . 8 . en . html >
2020-06-29 15:18:58 +02:00
[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
2023-10-13 10:46:08 +02:00
Sous Debian (Kernel >= 5.6) et OpenBSD (>= 6.8), Wireguard fait partie du Kernel. On utilise toutefois les outils fournis par WireGuard pour faciliter l'utilisation.
2020-06-29 15:18:58 +02:00
2023-10-11 12:32:33 +02:00
### Debian
2020-06-29 15:18:58 +02:00
2020-06-30 11:20:10 +02:00
~~~
2023-10-11 12:32:33 +02:00
# apt install wireguard
2020-06-30 11:20:10 +02:00
2023-10-11 12:32:33 +02:00
$ wg --version
wireguard-tools v1.0.20210223 - https://git.zx2c4.com/wireguard-tools/
2020-06-30 11:20:10 +02:00
~~~
2023-10-11 12:32:33 +02:00
### OpenBSD
2020-06-30 11:20:10 +02:00
~~~
2023-10-11 12:32:33 +02:00
# pkg_add wireguard-tools
2020-06-30 11:20:10 +02:00
2023-10-11 12:32:33 +02:00
$ wg --version
wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/
2020-06-30 11:20:10 +02:00
~~~
2023-10-13 10:46:08 +02:00
### Autres systèmes
WireGuard est également disponibles sous Android, macOS, iOS, Windows, et de nombreux autres : < https: / / www . wireguard . com / install / >
2023-10-11 12:32:33 +02:00
## Configuration du serveur
2020-06-30 11:20:10 +02:00
2023-10-11 12:32:33 +02:00
Autoriser le routage via `sysctl` :
2020-06-29 15:18:58 +02:00
~~~
2023-11-13 16:20:21 +01:00
## Sous Debian
2023-10-11 12:32:33 +02:00
# 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
2023-11-13 16:06:06 +01:00
2023-11-13 16:20:21 +01:00
## Sous OpenBSD
2023-11-13 16:06:06 +01:00
# echo "net.inet.ip.forwarding=1" >> /etc/sysctl.conf
# echo "net.inet6.ip6.forwarding=1" >> /etc/sysctl.conf
# sysctl -p /etc/sysctl.conf
~~~
2023-10-11 12:32:33 +02:00
Générer une clé privée pour le serveur et sa clé publique :
2020-06-29 15:18:58 +02:00
~~~
2023-11-13 16:06:52 +01:00
# mkdir -p /etc/wireguard/keys/
2023-10-11 12:32:33 +02:00
# wg genkey | tee /etc/wireguard/keys/serveur_priv | wg pubkey > /etc/wireguard/keys/serveur_pub
2023-11-13 16:32:43 +01:00
# find /etc/wireguard/ -type d -exec chmod 700 {} \; && find /etc/wireguard/ -type f -exec chmod 600 {} \;
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
Créer un fichier de configuration `/etc/wireguard/wg0.conf` , pour l'interface `wg0` :
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
[Interface]
Address = 192.0.2.1/24, 2001:db8::1/64
ListenPort = 51820
PrivateKey = ** *** # Contenu de /etc/wireguard/keys/serveur_priv
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
Avec :
2020-06-29 15:18:58 +02:00
2023-10-11 12:32:33 +02:00
* `Address` : l'IP dans le réseau WireGuard attribuée au serveur
* `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
2020-06-29 15:18:58 +02:00
2023-10-13 10:42:46 +02:00
Ces paramètres sont également possibles :
* `DNS` : serveurs DNS à utiliser sur ce tunnel VPN
* `MTU` : MTU à utiliser sur le lien ; automatiquement déterminé si non spécifié
* `PreUp` , `PostUp` , `PreDown` , `PostDown` : commandes ou scripts qui seront exécutés par bash avant ou après avoir activé ou désactivé l'interface VPN
* `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 lorsqu'il sera coupé, la configuration sera remise comme elle était au moment de son démarrage. On est donc obligé de stopper le VPN, faire notre modification, puis le démarrer à nouveau. Valeur par défaut : false.
2023-10-11 12:32:33 +02:00
Il suffit ensuite de démarrer notre VPN avec `wg-quick` :
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
# wg-quick up wg0
OU
# systemctl start wg-quick@wg0.service
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
On peut voir la configuration en cours avec `wg` :
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
# wg
interface: wg0
public key: ** ***
private key: (hidden)
listening port: 51820
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
Enfin, on peut activer le démarrage automatique de notre interface `wg0` :
2020-06-29 15:18:58 +02:00
~~~
2023-11-13 16:20:21 +01:00
## Sous Debian
2023-10-11 12:32:33 +02:00
# systemctl enable wg-quick@wg0.service
2023-11-13 16:20:21 +01:00
## Sous OpenBSD
# echo "!/usr/local/bin/wg-quick up wg0" > /etc/hostname.em0
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
## Déclaration des clients côté serveur
2020-06-29 15:18:58 +02:00
2023-10-11 12:32:33 +02:00
Générer une clé privée pour un client et sa clé publique, puis une clé pré-partagée :
2020-06-29 15:18:58 +02:00
~~~
2023-10-13 10:42:46 +02:00
# CLIENT=<nom_client>
# wg genkey | tee /etc/wireguard/keys/${CLIENT}_priv | wg pubkey > /etc/wireguard/keys/${CLIENT}_pub
# wg genpsk > /etc/wireguard/keys/${CLIENT}_psk
2023-11-13 16:32:43 +01:00
# find /etc/wireguard/ -type f -exec chmod 600 {} \;
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
Dans le fichier de configuration `/etc/wireguard/wg0.conf` , sous le bloc `[Interface]` , on crée un bloc `[Peer]` par client :
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
[Peer] # Client 1
2023-10-13 10:42:46 +02:00
PublicKey = ** *** # Contenu de /etc/wireguard/keys/${CLIENT}_pub
PresharedKey= ** *** # Contenu de /etc/wireguard/keys/${CLIENT}_psk
2023-10-11 12:32:33 +02:00
AllowedIPs = 192.0.2.0/24, 2001:db8::/64
2020-06-29 15:18:58 +02:00
~~~
2023-10-13 10:42:46 +02:00
Avec :
* `AllowedIPs` :
* Utilisé comme table de routage en sortie : pour joindre ces réseaux, je passe par ce peer sur le VPN.
* Utilisé comme ACL en entrée : ce peer sera autorisé à me joindre s'il a une de ces IPs sources.
Puis on redémarre l'interface `wg0` :
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
# wg-quick down wg0 && wg-quick up wg0
OU
2023-10-13 10:42:46 +02:00
# systemctl reload wg-quick@wg0.service
2020-06-29 15:18:58 +02:00
~~~
2023-10-11 12:32:33 +02:00
Et on peut vérifier que la déclaration du peer est bonne :
2018-08-20 22:43:45 +02:00
~~~
# wg
2023-10-11 12:32:33 +02:00
interface: wg0
public key: ** ***
private key: (hidden)
listening port: 51820
peer: ** ***
allowed ips: 192.0.2.0/24, 2001:db8::/64
2018-08-20 22:43:45 +02:00
~~~
2023-10-11 12:32:33 +02:00
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 :
2018-08-20 22:43:45 +02:00
~~~
2023-10-11 12:32:33 +02:00
[Interface]
2023-10-13 10:42:46 +02:00
PrivateKey = ** *** # Contenu de /etc/wireguard/keys/${CLIENT}_priv
2023-10-11 12:32:33 +02:00
Address = 192.0.2.2/24, 2001:db8::2/64
[Peer]
PublicKey = ** *** # Contenu de /etc/wireguard/keys/serveur_pub
2023-10-13 10:42:46 +02:00
PresharedKey = ** *** # Contenu de /etc/wireguard/keys/${CLIENT}_psk
2023-10-11 12:32:33 +02:00
Endpoint = < server_ip > :51820
AllowedIPs = 0.0.0.0/0, ::/0
2018-08-20 22:43:45 +02:00
~~~
2020-06-29 15:18:58 +02:00
2023-10-13 10:42:46 +02:00
Il peut ensuite utiliser sa configuration de la même façon que le serveur, avec `wg-quick` ou `systemctl` .
2023-11-13 16:32:43 +01:00
Pour avoir un historique et notamment une liste des IP utilisées, il peut être utile de garder la configuration client sur le serveur, par exemple dans `/etc/wireguard/configs/${CLIENT}.conf` :
~~~
# mkdir /etc/wireguard/configs/
# vim /etc/wireguard/configs/${CLIENT}.conf
# find /etc/wireguard/ -type d -exec chmod 700 {} \; && find /etc/wireguard/ -type f -exec chmod 600 {} \;
~~~
2023-10-13 10:42:46 +02:00
2020-06-29 15:18:58 +02:00
## 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
2023-10-11 12:32:33 +02:00
~~~