---
title: Howto Wireguard
categories: sysadmin network vpn
...

* OpenBSD Manpage <https://man.openbsd.org/wg>
* Debian Manpage <https://manpages.debian.org/unstable/wireguard-tools/wg.8.en.html>

[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.

## Commandes utiles

Configurer une interface [wg(4)](https://man.openbsd.org/wg) côté serveur :

~~~
server# ifconfig wg0 create wgkey $(openssl rand -base64 32) wgport XXXXX
~~~

Configurer une interface [wg(4)](https://man.openbsd.org/wg) côté client :

~~~
client# ifconfig wg0 create wgkey $(openssl rand -base64 32)
~~~

Ajouter un client côté serveur (on indique le clé publique du client ainsi que son IP publique) :

~~~
server# ifconfig wg0 wgpeer x90CP/5AdicGeJxYY+rj0uXGtE+dvW9Dyi5SL8HJsSg= wgaip 203.0.113.2/32
~~~

Initier une connexion au serveur côté client (on indique la clé publique du serveur, son adresse « wgendpoint » ainsi que que les flux à autoriser) :

~~~
client# ifconfig wg0 wgpeer gbLaHdkEhFxikmRaC5seub45rVQBZcHuzZFMq/ylXg8= wgendpoint vpn.example.com 51820 wgaip 0.0.0.0/0
~~~

## 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).

~~~
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<BROADCAST,NOARP,MULTICAST> 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<BROADCAST,NOARP,MULTICAST> 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<BROADCAST,NOARP,MULTICAST> 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<BROADCAST,NOARP,MULTICAST> 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}
~~~

Sur le client :

~~~
# 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}
~~~

## 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)
