Salut la communauté,

Je souhaite vous partager mon retour d'expérience pour l'installation et la configuration de Wireguard comme solution VPN utilisée sur ma seedbox.

Je cherchais en effet une solution pour remplacer l'utilisation d'openvpn par Wireguard. Je m'étais inspiré de l'excellent (mais non moins daté) tuto de Zobrak @http://mondedie.fr/d/5933 pour faire transiter uniquement le trafic rtorrent via le tunnel VPN, monitorer la connexion et arrêter le cas échéant rtorrent pour préserver "l'anonymat".

Ce tuto est en grande partie une traduction/adaptation de ce post sur reddit. Il m'a permis de faire transiter l'ensemble du trafic du serveur via le VPN à l'exclusion de certains services, à savoir dans mon cas, une interface rutorrent, un serveur Plex et l'accès en SSH.

Introduction / Prérequis

Wireguard est une solution de tunnel VPN rapide, moderne et sécurisée. Ce n'est pas moi qui le dit, c'est le slogan du projet, pour plus d'informations, rendez-vous sur www.wireguard.com.

Ce tuto fonctionne sur un serveur Debian 10 virtualisé sur proxmox derrière un firewall pfsense, sur lequel j'ai installé une seedbox grâce à l'excellent script d'ex_rat, que l'on ne présente plus (@https://mondedie.fr/d/5399).
L'installation et la configuration de wireguard étant relativement simples, cela devrait aussi fonctionner sur d'autres distributions Linux (attention Wireguard n'est pas compatible avec openvz et si vous utilisez LXC, l'hôte doit avoir installé le module kernel).

Il vous faudra bien entendu un serveur Wireguard. Vous avez le choix entre l'auto-hébergement ou une solution commerciale comme NordLynx de NordVPN, mais nul doute que d'autres services similaires existent ou existeront chez votre fournisseur VPN préféré.

Personnellement, j'ai choisi d'héberger mon serveur Wireguard sur un VPS. Pour faire simple et efficace j'ai installé le serveur Wireguard avec ce script https://github.com/angristan/wireguard-install. Il installe Wireguard, configure le serveur et les règles iptables, fourni les fichiers de configuration client et permet même de récupérer la configuration par QR code pour les appareils mobiles par exemple. Vous pouvez aussi utiliser ce script sur la machine client pour l'installation de wireguard mais le fichier de configuration sera à adapter.

Installation de Wireguard sur le client

1 - Wireguard n'est pas disponible sur les dépots stable de buster, nous allons donc ajouter le dépôt unstable aux sources.

#en root

echo "deb http://deb.debian.org/debian/ unstable main" >/etc/apt/sources.list.d/unstable.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' >/etc/apt/preferences.d/limit-unstable

2 - On rafraichit les dépôts, et on installe les linux-headers correspondant au kernel puis Wireguard.

sudo apt update
sudo apt install -y "linux-headers-$(uname -r)"
sudo apt install -y wireguard iptables resolvconf

Configuration sur le client

A ce stade, vous pouvez copier la configuration du client fournie par le serveur dans le fichier /etc/wireguard/wg0.conf et démarrer l'interface simplement grâce à l'outil wg-quick. Mais je vous le déconseille car vous risqueriez de vous bloquer l’accès par ssh au client.

Pourquoi ? En fait la commande wg-quick est un script qui va entre autre exécuter une série de configuration d'interfaces réseau, de table de routage, de règles de routage... comme préconisé dans la doc Wireguard. C'est plutôt bien expliqué et l'on y apprend notamment que les paquets passant par l'interface wg0 sont marqués par une marque de firewall (fwmark) pour utiliser une table de routage spécifique. La commande fait aussi transiter tous les autres paquets non marqués via cette table de routage, sauf s'il existe une route avec un préfixe non nul afin de maintenir l'accès au réseau local.

Ce que nous souhaitons faire c'est donc exclure certains services (utilisés sur des ports spécifiques) de ce traitement pour leur dire d'utiliser l'interface réseau connectée au WAN et non l'interface du tunnel VPN (wg0).

Pour ce faire nous allons marquer les paquets entrants via le ou les ports d'écoute de nos services, puis nous allons les router au travers de la passerelle Internet par défaut au lieu de la passerelle VPN.

1 - Création de 3 scripts

  • Le premier, checkVPN, servira à contrôler la connexion au serveur, arrêter le service rtorrent si la connexion est interrompue et relancer rtorrent une fois la connexion rétablie.
sudo nano /usr/bin/checkVPN

Vous copiez cela en adaptant à votre configuration avec l'ip du serveur Wireguard (ici 10.66.66.1), et le nom d'utilisateur de la session rtorrent (ici foo, vous pouvez en avoir plusieurs).

#!/bin/sh
#while true cree une boucle sans fin
while true
do
    sleep 5
    #ping ip du vpn serveur, si pas de reponse arret de rtorrent + restart du vpn
    TRANS=$(pgrep rtorrent)
    ping -q -c4 10.66.66.1 > /dev/null
    if [ $? -ne 0 ]  || [ -z  "$TRANS" ]
    then
        systemctl stop foo-rtorrent.service
        systemctl restart wg-quick@wg0.service
        sleep 20
        #si le ping revient alors restart de rtorrent
        ping -q -c1 10.66.66.1 > /dev/null  && systemctl restart foo-rtorrent.service
    fi
done
  • Le second script, up.sh, sera exécuté au démarrage de l'interface client Wireguard
sudo nano /etc/wireguard/up.sh

Vous copiez ceci en adaptant

#! /bin/sh

sleep 3

#Demarrage de rtorrent
systemctl start foo-rtorrent.service

#Demarrage du script verifiant que le VPN est toujours actif
killall checkVPN
/usr/bin/checkVPN &
  • Le dernier, down.sh, sera exécuté juste avant d’arrêter l'interface client Wireguard.
sudo nano /etc/wireguard/down.sh

Même topo, vous adaptez!

#! /bin/sh
# This script disables policy routing before the tunnel interface is brought down

#On arrete le script qui va verifier l'existence du tunnel VPN
killall checkVPN

#On stoppe rtorrent
systemctl stop foo-rtorrent.service
  • On rend ces 3 scripts exécutables.
cd /etc/wireguard && sudo chmod +x up.sh down.sh /usr/bin/checkVPN

2 - Création d'une table de routage "novpn"

#en root
echo "2 novpn" >> /etc/iproute2/rt_tables

3 - On édite /etc/sysctl.conf pour autoriser l'ip forwarding

net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1

4 - On applique les changement de sysctl.conf

sudo sysctl --system

5 - (Optionnel) Eteindre l'interface Wireguard
Normalement vous ne l'avez pas encore démarrée, mais sinon :

sudo wg-quick down wg0

6 - On édite la configuration Wireguard, /etc/wireguard/wg0.conf

Vous copiez si ce n'est déjà fait la configuration client fournie par le script de votre serveur ou par votre fournisseur, et vous ajoutez les lignes suivantes dans la partie [Interface]:

PostUp = ip route add default via 192.168.1.254 dev eth0 table novpn
PostUp = ip rule add fwmark 0x2 table novpn
PostUp = /sbin/iptables -A OUTPUT -t mangle -o wg0 -p tcp --sport 22 -j MARK --set-mark 2 #ssh
PostUp = /sbin/iptables -A OUTPUT -t mangle -o wg0 -p tcp --sport 32400 -j MARK --set-mark 2 #plex
PostUp = /etc/wireguard/up.sh

Attention, ici vous devez adapter à votre cas, ce n'est qu'un exemple :
vérifiez notamment l'adresse de la passerelle internet par défaut (ici 192.168.1.254) et le nom de l'interface réseau associée (ici eth0). Vous pouvez exécuter sudo route -n | grep ^0.0.0.0 si vous ne les connaissez pas.

Dans cet exemple, seuls les ports utilisés par ssh (22 mais peut être différent si vous l'avez modifié, ce que je vous recommande) et le serveur plex (32400) verront les paquets marqués 2 (0x2 en hexadécimal). Ces paquets utiliserons la table novpn dont la route par défaut est la passerelle internet 192.168.1.254.

Libre à vous de compléter la liste de ports à router par la passerelle internet selon vos besoins, comme un serveur web (80,443) pour une interface rutorrent par exemple.

7 - On n'oublie pas d'ajouter les règles inverses pour rétablir la configuration par défaut en cas d'arrêt de l'interface Wireguard

PreDown = /etc/wireguard/down.sh
PreDown = /sbin/iptables -D OUTPUT -t mangle -o wg0 -p tcp --sport 22 -j MARK --set-mark 2
PreDown = /sbin/iptables -D OUTPUT -t mangle -o wg0 -p tcp --sport 32400 -j MARK --set-mark 2
PreDown = ip rule del fwmark 0x2 table novpn
PreDown = ip route del default via 192.168.1.254 dev eth0 table novpn

8 - Avant de démarrer l'interface Wireguard, on va indiquer à rtorrent d'utiliser l'adresse de l'interface Wireguard client. Vous la trouvez dans le wg0.conf côté client, dans mon cas 10.66.66.2.

En fonction de l'utilisateur rtorrent :

sudo systemctl stop foo-rtorrent.service #si rtorrent est démarré
sudo nano /home/foo/.rtorrent.rc

Et vous ajoutez ou modifiez l'option:

bind = 10.66.66.2

9 - On sauvegarde tout ça et on démarre l'interface Wireguard. Pas besoin de relancer rtorrent, le script up.sh s'en chargera.

sudo wg-quick up wg0

Tests

Si tout ce passe bien l'interface wg0 est démarrée. Pour vérifier:

sudo wg show

Le script checkVPN et rtorrent sont eux aussi actifs.

pgrep checkVPN && pgrep rtorrent

devrait vous retourner les PID des 2.

Pour vérifier votre ip sur internet :

curl ifconfig.co

devrait vous retourner l'adresse ip du serveur Wireguard.

Et pour vérifier votre adresse ip visible sur rtorrent : https://torguard.net/fr/checkmytorrentipaddress.php

Pensez aussi à vérifier que vous avez bien accès aux services exposés hors du tunnel : Plex, serveur http, https, ssh...

Wireguard au démarrage

Lorsque vous êtes certains que tout fonctionne vous pouvez autoriser Wireguard au démarrage du serveur.

sudo systemctl enable wg-quick@wg0

Conclusion

Nous avons mis en place une interface VPN utilisant Wireguard sur un serveur Debian 10 exécutant une seedbox avec rtorrent ainsi qu'un serveur Plex. Le fonctionnement de rtorrent est conditionné à l'état de la connexion VPN et nous pouvons toujours nous connecter en ssh au serveur, utiliser Plex en dehors du tunnel VPN.

J'espère que vous aurez réussi comme moi à faire fonctionner cela chez vous. Si vous avez des idées d'améliorations, n'hésitez pas à les partager en commentaire. Je songe notamment à une approche légèrement différente qui utiliserait les namespace pour lier l'interface Wireguard à un ou plusieurs services voire à des conteneurs spécifiques. Je tacherai de vous faire un retour lorsque j'aurai testé cette méthode.

7 mois plus tard

Salut! Merci pour ce tutoriel, il est super clair et fonctionne nikel!
Cependant, j'utilise Pterodactyl pour héberger mes serveurs de jeux, et celui-ci utilise sa propre interface. Du coup, même lorsque je spécifie les ports à laisser tel quel, je ne peux plus accéder aux serveurs. 🙁

Est-ce que tu saurais comment je pourrais faire pour ignorer l'interface de Pterodactyl?
Merci d'avance. ^^

Répondre…