Aller au contenu

WireGuard avec espaces de nom

Cette documentation est destinée à un public d’utilisateurs avertis et avancés.
Pour une utilisation basique d'un VPN wireguard se référer à cette documentation.

La méthode exposée ici va utiliser les espaces de noms réseau via ip-netns(8) ainsi que l’outil en ligne de commandes wg(8).

Présentation du modèle

Sous Linux par défaut, vous utilisez déjà un espace de nom, celui couramment appelé init qui n’a pas de nom à la base mais parce qu’il est attaché au PID 1.

Nous allons à présent créer un nouvel espace de nom, dédié ici à la connexion du FAI commercial.

Pour simplifier les choses, on va schématiser notre réseau de la manière suivante :

Interface Représentation Espace de nom
eth0 FAI commercial novpn
eth1 LAN 1
wg-illyse VPN WireGuard Illyse 1
veth0 Interface virtuelle côté Illyse 1
veth1 Interface virtuelle côté FAI commercial novpn

Nous allons donc créer un espace de nom que l’on va appeler novpn pour indiquer qu’elle contiendra l’interface du FAI commercial en souhaitant utiliser le VPN comme connexion principale. Sachez que l’inverse est également possible.

Commandes de configuration des espaces de nom

Commençons par créer notre espace de nom novpn

ip netns add novpn

À présent, nous allons ajouter l’interface du FAI commercial à notre nouvel espace de nom

ip link set eth0 netns novpn

À présent vous pouvez constater que l’interface eth0 n’est plus visible lorsque vous tapez ip link show. Les espaces de noms isolent les interfaces.

Pour pouvoir agir sur l’espace de nom novpn, il est nécessaire de précéder sa commande par ip netns exec novpn.

Par exemple, pour lister eth0 :

ip netns exec novpn ip link show

Il nous faut activer l’interface loopback sur novpn ainsi que eth0.

ip netns exec novpn ip link set lo up
ip netns exec novpn ip link set eth0 up

Libre à vous ensuite de définir la configuration pour eth0. Par exemple en dhcp avec le client de votre choix :

ip netns exec novpn dhclient eth0
ou
ip netns exec novpn dhcpcd eth0

WireGuard supporte les espaces de nom. Lorsque son interface est créée dans un espace donné, puis qu’elle est déplacée dans un autre espace, elle conserve le lien vers son espace d’origine. Ainsi, nous allons créer l’interface de WireGuard dans novpn puis la déplacer vers l’espace de nom du PID 1.

ip netns exec novpn ip link add dev wg-illyse type wireguard
ip netns exec novpn ip link set wg-illyse netns 1

Il est aussi à souligner que la configuration d’une interface n’est pas transmissible lors de son déplacement dans un autre espace de nom. C’est pour cela que nous déplaçons l’interface du VPN directement après sa création.

On va à présent attribuer la configuration WireGuard à l’interface à l’aide de wg(8) :

wg setconf wg-illyse /etc/wireguard/wg-illyse.conf

Configurons également les adresses, le MTU, et les routes.

ip -4 address add 89.234.140.XXX/32 dev wg-illyse
ip -6 address add 2a00:5881:4008:YY00::Z/128 dev wg-illyse
ip link set mtu 1400 up dev wg-illyse
ip -6 route add ::/0 dev wg-illyse
ip -4 route add 0.0.0.0/0 dev wg-illyse

Pensez à remplacer les XXX, YY, et Z par les valeurs de vos adresses. Elles sont à retrouver dans COIN, section Mes abonnements / Configuration puis IPv4 et IPv6. WireGuard étant un réseau point à point, il est normal qu’il n’y ai pas de passerelle sur les routes.

Nous avons à présent deux espaces de noms, l’un avec WireGuard, l’autre le FAI commercial. La configuration ici réalisée est beaucoup plus simple (et potentiellement plus robuste et efficace) qu’avec des tables de routage et le marquage des paquets.

Mise en place d’un proxy vers le FAI commercial

Actuellement nous avons configuré le VPN Illyse comme destination par défaut. Pour soulager l’infrastructure d’Illyse qui n’est pas illimitée, on peut choisir lors de gros téléchargements, de passer par la connexion du FAI commercial.

Pour ce faire, il nous faut créer un lien entre l’espace de nom du PID 1 sur lequel se trouve l’interface du LAN et l’espace de nom novpn. Ce lien, ce sont les interfaces ethernet virtuelles veth.

Commençons par créer nos interfaces virtuelles et plaçant directement veth0 sur l’espace de nom du PID 1 et veth1 sur l’espace de nom novpn.

ip link add veth0 type veth peer name veth1 netns novpn

Activons maintenant les interfaces et attribuons leur une adresse.

ip link set veth0 up
ip address add 192.168.53.1/30 dev veth0
ip netns exec novpn ip link set veth1 up
ip netns exec novpn ip address add 192.168.53.2/30 dev veth1

Les deux interfaces peuvent communiquer, étant sur le même réseau. ping 192.168.53.2 et ip netns exec novpn ping 192.168.53.1.

Cependant, en l’état, veth1 est inaccessible depuis le LAN sur l’interface eth1. Pour rendre le dialogue possible, il faut faire du SNAT sur veth0.

iptables -A POSTROUTING -o veth0 -j SNAT --to-source 192.168.53.1

Aussi bien évidemment, vous avez activé le forwarding sur votre noyau :

sysctl net.ipv4.ip_forward=1
sysctl net.ipv4.ip_dynaddr=1

Maintenant que veth1 est joignable depuis le LAN, on peut faire écouter un serveur proxy sur cette interface. Ici par exemple avec microsocks :

ip netns exec novpn microsocks -i 192.168.53.2 -p 1080 &

En se connectant sur le proxy SOCKS5, on passe par la connexion du FAI commercial. Pour s’en assurer :

curl --socks5 192.168.53.2:1080 https://ifconfig.me

Résolution DNS dans les différents espaces de nom

Il est possible également de définir une liste de résolveur DNS par espace de nom. Au lieu de se reposer sur le fichier /etc/resolv.conf dans notre espace de nom novpn par exemple, on peut définir les résolveurs DNS dans /etc/netns/novpn/resolv.conf