Wireguard et OpenWRT, le VPN facile

Wireguard est un logiciel et un protocole de communication pour créer un VPN en mode point à point routé ou bridgé. Il se compose d’un module noyau et d’outils en espace utilisateur.

Il se veut léger, sécurisé, facile à configurer (coucou OpenVPN) et intègre par défaut des protocoles de chiffrement modernes :

Il devrait être intégré comme module du noyau GNU/Linux dans la version 5.6 mais il est d’ores est déjà disponible via dkms sur des distributions comme Debian ou Archlinux ou encore FreeBSD.

Il est aussi disponible dans les dépôts OpenWRT, le sujet même de cet article

Installation sous OpenWRT

Je vais l’installer sur mon Turris Omnia, mais avant toute chose, je vais définir le plan d’adressage :

  • le LAN déjà en place avec la place 192.168.100.0/24 et la passerelle en 192.168.100.254 (le routeur)
  • tout ce qui concerne Wireguard avec comme adresse 10.100.100.0/24 avec comme passerelle 10.100.100.254 (notre interface wireguard sur le routeur).

Pour commencer l’installation, connectons nous en SSH1 au routeur:

opkg install wireguard wireguard-tools

Il est conseillé de redémarrer le routeur après l’installation de Wireguard pour que le module noyau soit chargé2.

Générer la paire de clefs

Pour fonctionner, Wireguard utilise une paire de clefs privée / publique qu’il est possible de générer via wg.

umask u=rw,g=,o=
wg genkey | tee wireguard.key | wg pubkey > wireguard.pub

Créer l’interface réseau

Maintenant que les clefs sont créées et le port ouvert nous allons configurer notre interface réseau dédiées à Wireguard.

uci set network.wg0="interface"
uci set network.wg0.proto="wireguard"
uci set network.wg0.private_key="$(cat /root/wireguard.key)"
uci set network.wg0.listen_port="51820"
uci add_list network.wg0.adresses="10.100.100.254/24"
uci commit network

Ouvrir le port udp nécessaire

Wireguard fonctionne exclusivement en UDP, il est donc nécessaire d’ouvrir un port sur notre pare-feu afin de laisser passer les trames nécessaires. Le port choisit est le 51820, voici les commandes à entrer (toujours via SSH)

uci add firewall rule
uci set firewall.@rule[-1].src="wan"
uci set firewall.@rule[-1].target="ACCEPT"
uci set firewall.@rule[-1].proto="udp"
uci set firewall.@rule[-1].dest_port="51820"
uci set firewall.@rule[-1].name="Allow Wireguard Inbound"
uci commit firewall

Ajouter les règles au pare-feu pour notre nouvelle interface

Il serait possible de créer une nouvelle zone de pare-feu pour régler finement le pare-feu pour notre interface wg0. Nous allons nous contenter de rattacher cette interface à notre zone lan.

uci rename firewall.@zone[0]="lan"
uci add_list firewall.lan.network="wg0"
uci commit
/etc/init.d/firewall restart

Configurer un “peer” sur le routeur

Dans le langage de Wireguard, un peer est une machine cliente. Nous allons maintenant en rajouter un. Mais avant il faut penser à créer un couple de clefs publique / privée pour celui-ci.

Il est aussi possible de générer une pre-shared key afin de renforcer le chiffrement celle-ci devra être différente pour chaque client pour des raisons de sécurité :

wg genpsk > client1.psk

Puis configurer notre premier client :

uci set network.wgclient="wireguard_wg0"
uci set network.wgclient.public_key="<cle_publique_client1>"
uci set network.wgclient.preshared_key="$(cat /root/client1.psk)"
uci add_list network.wgclient.allowed_ips="10.100.100.0/24"
uci add_list network.wgclient.description="My phone"
uci commit network
/etc/init.d/network restart

Il faut bien sûr remplacer <cle_publique_client1> par la clé publique de votre client.

Configuer son Client.

Le client se configure à l’aide d’un fichier de configuration, voici un exemple que l’on nommera wg.conf:

[interface]
Address = 10.100.100.42/32
PrivateKey = <clé_privée_client1>

[peer]
EndPoint = <ip_publique_openwrt>:51820
AllowedIPs = 0.0.0.0/24
PersistentKeepAlive = 25
PreSHaredKey = <cle_psk_client1>
PublicKey = <clé_publique_serveur>

Il faut bien sur remplacer ces éléments :

  • <clé_privée_client1> par la clé privée de votre client, nous avons utilisé la clé publique pour configurer l’accès sur notre routeur
  • <ip_publique_openwrt> par l’adresse IP publique de votre routeur (ou son nom DNS)
  • <cle_psk_client1> par la pre shared key que nous avons créé pour la configuration de notre client sur le routeur
  • <clé_publique_serveur> par la clé publique de notre Wireguard sur le routeur créée au tout début de cet article.
  • AllowedIPs = 0.0.0.0/24 signifie que tous le trafic de notre client sera envoyé vers le VPN. Cette partie est à adapter selon les besoins.

Ce fichier servira à la commande wg-quick pour lancer la connexion sur un système *NIX, ou sera à importer dans l’interface graphique de Wireguard sous Windows.

Il existe aussi une version Android disponible sur F-Droid3, dans ce cas on peut utiliser un QR-code. Il est possible de le générer dans un terminal avec qrencode. Il est disponible sur Archlinux, Debian et FreeBSD (de ce que j’ai vérifié) et sûrement d’autre distributions / systèmes.

Sous Archlinux, en root ça donne :

pacman -S qrencode
qrencode -t ansiutf8 < wg0.conf

Il ne reste plus qu’à “flasher” le QR-code avec l’application Android.

En conclusion

Voici une solution simple et efficace de mettre en place un VPN léger, robuste et fiable sur son routeur. Avec Wireguard, j’ai accès à mon réseau local depuis n’importe où que se soit sur mon ordinateur portable ou mon ordiphone. Il est bien entendu possible d’aller plus loin : routage plus fin, pare-feu plus élaboré, plan d’adressage plus complexe etc.

Bibliographie


  1. Il est possible de le faire entièrement avec LUCI, l’interface graphique d’OpenWRT mais ce n’est pas le sujet de cet article. 

  2. Certain utilisateurs on rapporté des instabilités lorsque le routeur n’était pas redémarré après l’installation. 

  3. Il l’est sûrement aussi sur le Google Play Store.