Wireguard
Présentation
Wireguard est un VPN dont le but est d'être simple à utiliser et rapide. Il est à rapprocher d'IPsec. Son fonctionnement se fait en peer 2 peer, contrairement à OpenVPN par exemple. Le principe d'utilisation n'est pas si loin de SSH : les pairs sont connectés entre eux à l'aide de paires de clefs.
Mise en place
Manuelle
Page quickstart de la doc Je commence par installer les paquets :
apt install wireguard wireguard-tools
Je vais ici avoir deux pairs : leurs addresse réelles sont en 192.148.1.0/24 et leur adresses wireguard sont en 172.16.0.0./16. On commence, pour chacun d'entre eux, par leur créer des clefs. On crée une clef privée de laquelle on dérive une clef publique. <source> wg genkey > wireguard-private wg pubkey < wireguard-private > wireguard-public
- Ou en une seule commande
wg genkey | tee privatekey | wg pubkey > publickey </source>
Puis je vais créer une interface virtuelle pour wireguard pour chacun de mes pairs. <source> sudo ip addr add 172.16.0.1/16 sudo ip addr add 172.16.0.1/16 dev wg0 </source>
J'attribue ma clef privée à mon interface
sudo wg set wg0 private-key ./wireguard-private
Et j'active l'interface
sudo ip link set wg0 up
Je peux voir mes clefs et le port d'écoute simplement
``` root@exploit:~# wg interface: wg0
public key: I3iw8gOHB7sVNQJANC1AK7EkxV2P3DX7wrZEAZA+5U0= private key: (hidden) listening port: 37673
```
Je vais ensuite relier mes pairs. Sur chacun d'entre eux:
wg set wg0 peer mYJruEkvquUv3vHRgkKBd7TuYUZqB7U6EoZYeNC5fzQ= allowed-ips 172.16.0.2/32 endpoint 192.168.1.70:58733
Ici:
- wg set wg0 : wg0 est mon interface wireguard
- peer mYJruEkvquUv3vHRgkKBd7TuYUZqB7U6EoZYeNC5fzQ= : je donne la clef publique du pair
- allowed-ips 172.16.0.2/32 : les ips que le pair a le droit d'avoir dans le tunnel
- endpoint 192.168.1.70:58733 : L'adresse "réelle" du pair ainsi que son port (donné par la commande wg sur ce dernier).
Et voilà :)
Et si je veux supprimer l'interface :
ip link add wg0 type wireguard
Bien entendu, c'est long.
Avec un fichier de config
Je peux créer un fichier de config dans /etc/wireguard/wg0.conf: <source lang="ini"> [Interface] Address = 172.16.0.1/16 SaveConfig = true ListenPort = 58733 PrivateKey = XXXXXXXXXXXXXXXXX
[Peer] PublicKey = I3iw8gOHB7sVNQJANC1AK7EkxV2P3DX7wrZEAZA+5U0= AllowedIPs = 172.16.0.2/32 Endpoint = 192.168.1.205:58733
- Je peux aussi avoir des commandes PreUp, PostUp, PreDown, PostDown
- PostUp = echo bidule
</source> On voit ici ma section "Peer", que je peux répéter au besoin.
Et derrière, utiliser la commande wg-quick. <source> root@exploit:~# wg-quick Usage: wg-quick [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ]
- Je monte mon interface
root@exploit:/home/justine# wg-quick up wg0 [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 172.16.0.1/16 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] wg set wg0 peer mYJruEkvquUv3vHRgkKBd7TuYUZqB7U6EoZYeNC5fzQ= allowed-ips 172.16.0.1/32 endpoint 192.168.1.70:58733 </source>
Et voilà : la connexion est faite. <source> [root@Ulysses ~]# wg interface: wg0
public key: mYJruEkvquUv3vHRgkKBd7TuYUZqB7U6EoZYeNC5fzQ= private key: (hidden) listening port: 51194
peer: I3iw8gOHB7sVNQJANC1AK7EkxV2P3DX7wrZEAZA+5U0=
endpoint: 192.168.1.205:58733 allowed ips: 172.16.0.2/32
</source>
Monter l'interface au démarrage
Pas besoin de créer un service ! Pour une interface wg0, il suffit de faire
systemctl enable wg-quick@wg0.service