Router un subnet IPv4 chez soi avec WireGuard + VyOS

Le but de ce tutoriel est de router un subnet IPv4 de n'importe quelle taille chez vous en utilisant un tunnel WireGuard et un routeur VyOS sous forme de machine virtuelle.

💡
Ce tutoriel, bien qu'assez simple, nécessite au moins quelques connaissances de base en réseau. Si vous ne les avez pas, n'essayez pas de mettre en place cette solution.
Vous devriez au minimum être familier avec le concept de routes statiques, et le principe de sous-réseau sous forme cidr
⚠️
Les IPv4 sont en pénurie, utilisez les avec parcimonie et privilégiez l'IPv6 ou le NAT là où c'est possible. Par ailleurs, quand vous avez des IPv4 que vous n'utilisez plus, résiliez-les.

Quelle utilité ?

Si vous souhaitez auto-héberger certains services chez vous, vous allez assez rapidement vous retrouver limités par l'unique IPv4 publique fournie par votre opérateur. Il se peut même que votre opérateur ne permette l'accès à internet qu'à travers un CGNAT, et que vous partagiez donc votre IP avec vos voisins. Dans ce cas, vous ne pourrez pas ouvrir de ports, ou alors un nombré limité. Vous pourriez aussi avoir une IP dynamique, là aussi, c'est beaucoup de galères pour du selfhost.

Par ailleurs, si vous souhaitez héberger quelques VMs pour vos amis, partager votre IP publique peut être ennuyant, voire dangereux.

Ce tutoriel permet in fine de mettre à disposition des IPv4 sur votre réseau personnel, un bridge virtuel sous Proxmox ou autre, ou sur un VLAN dédié, vous permettant par exemple d'assigner une IP publique a des équipements réseaux qui ne permettent pas d'installer WireGuard.

Ce tutoriel n'a pas pour but d'expliquer la manipulation pour une seule IPv4 ou quelques VMs avec un tunnel monté sur chaque VM. Pour cela, je vous recommande le tutoriel de Creeper, qui est plus simple, mais qui nécessite de monter un tunnel vers chaque VM: https://creeper.fr/wireguard/

⚠️
Si c'est pour une utilisation commerciale telle que de l'hébergement, SVP, privilégiez l'acquisition d'un numéro d'AS et obtenez vos propres IPs. La solution que je présente ici, ou toute autre solution se basant sur des tunnels pour rapatrier des IPs ne vous appartenant pas, sont considérées comme du bricolage, et enfreignent parfois les CGU/CGV de l'hébergeur chez qui vous louez vos VPS.

Quel matériel nécessaire ?

Pour commencer, il vous faudra un VPS ou un serveur dédié chez un quelconque hébergeur, quoi que je recommande personnellement de partir chez HostMyServers, qui permettent de bénéficier d'IPs à 2€ one time au moment de l'écriture de ce tuto, ainsi que de VPS à très bas prix avec une grande bande passante. (LES BANDES PASSANTES AFFICHÉES CI-DESSOUS SONT LES BPs GARANTIES, TOUS LES VPS ONT UNE BP DE 10Gbps en BestEffort)

Les différentes offres VPS NVMe chez HMS

D'après mes essais passés, le VPS SSD-1 permets ~500Mbps de throughput, le VPS SSD-2 devrait être suffisant pour saturer une ligne fibre 1Gbps, en tout cas, il sature la mienne.

Il vous faudra aussi un serveur chez vous, idéalement sous Proxmox (ça devrait fonctionner sur ESXi, etc. Mais il y aura probablement des options à changer sur les bridges virtuels.), sur lequel vous préparerez une machine virtuelle sur laquelle vous installerez VyOS (expliqué ci-dessous).

Et évidemment, il faudra acheter un ou plusieurs blocs d'IPs (attention à la taille du bloc, il faudra d'office soustraire une IP au bloc afin de l'assigner au VyOS).

Ok, j'ai mon VPS chez HMS et mon serveur Proxmox, que faire maintenant ?

Chez HMS

  1. Installez Debian 12 sur votre VPS, vous recevrez vos infos de connexion par email.
  2. Achetez vos IPs, ⚠️PRENEZ BIEN UN BLOC ET NON PAS UNE SEULE IP. Pour ce tuto, je me contenterai d'un bloc /30 (4IPs (-1 pour le routeur, donc 3 IPs utilisables))
  3. Installez WireGuard et activer l'IPv4 forwarding sur votre VPS:
apt-get update && apt-get install wireguard-tools resolvconf arping -y
echo "nameserver 1.1.1.1" > /etc/resolv.conf
echo -e "net.ipv4.ip_forward=1\nnet.ipv4.conf.all.proxy_arp=1\n" | sudo tee -a /etc/sysctl.conf > /dev/null
sysctl -p
curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh
chmod +x wireguard-install.sh
bash wireguard-install.sh

Vous allez vous retrouver face au script wireguard-install d'angristan. Laissez la config par défaut, vérifiez juste que l'IPv4 publique de votre VPS soit correctement détectée, et retirez l'IPv6 qui est proposée dans la liste des Allowed IPs pour ne laisser que 0.0.0.0/0

WireGuard est désormais installé, passons à la config.

Éditez le fichier /etc/wireguard/wg0.conf pour qu'il ressemble à celui-ci (Supprimez le bloc avec les "PostUp", et "PostDown", retirez l'IPv6 dans "Address", et mettez votre bloc IP dans le AllowedIPs de votre client) :

45.1432.96.124/30 étant le bloc que j'ai commandé, ajuste en mettant le/les vôtres

Ensuite, démarrez WireGuard et activez-le au boot:

systemctl restart wg-quick@wg0
systemctl enable wg-quick@wg0

Finalement, ce n'est pas obligatoire, mais je vous conseille de mettre à jour le fichier qui a été créé à l'endroit où vous avez exécuté le script d'installation de WireGuard (/rootdans mon cas.) qui s'appellera wg0-client-<nom de votre client>.conf, plus spécifiquement la section "Address" dans [Interface]afin de la faire correspondre avec votre bloc IP. Exemple avec ma config ci-dessous :

Gardez le contenu de ce fichier, on en aura besoin pour configurer le tunnel sur VyOS.

⚠️Ce n'est pas obligatoire non plus, mais si vous voulez avoir l'esprit tranquille, créez un fichier nommé ipsdans /rootavec comme contenu toutes les IPs de votre/vos blocs comme ceci :

Ajoutez ensuite une crontab comme ceci en faisant crontab -e:

*/5 * * * * for arg in $(< /root/ips); do arping -q -c1 -P $arg -S $arg -i eth0; done

Sur votre Proxmox

Créez un VMBR sur votre Proxmox, il servira de bridge entre le VyOS et vos VMs, ensuite, créez une VM VyOS sur votre Proxmox, pas besoin de specs folles, voici celles que je mets :

Une fois votre VM créé, allez dans son onglet Hardware, et ajoutez une nouvelle interface réseau, avec comme bridge le VMBR que vous avez créé tout à l'heure pour votre VyOS.
Vos deux interfaces réseaux devraient se présenter comme ceci :

vmbr111111 étant le vmbr que j'ai créé ppour VyOS, adaptez avec le votre

Démarrez votre VM, et laissez la boot. Connectez vous avec les logins vyos/vyos

Tapez ensuite install image, et changez le mot de passe de l'utilisateur vyosquand ça vous sera demandé.

Une fois terminé, ça devrait ressembler à ça

Tapez ensuite rebootet laissez votre VyOS redémarrer.

Une fois connecté, faites sh intafin de vérifier que vos interfaces sont bien nommées eth0, et eth1

Rentrez ensuite en mode config et passez eth0 en dhcp comme ceci:

config
edit int eth eth0 
set address dhcp 
set dhcp-options no-default-route
exit
set prot stat route <ip publique de votre VPS HMS>/32 next-hop <ip locale de votre box (192.168.1.1 par exemple)>
commit
save

Essayez ensuite de ping l'IP de votre VPS, ça devrait fonctionner

Ensuite, attaquons le tunnel !

Prenez le contenu de votre fichier wg0-client-<nom de votre client>.conf , et exécutez les commandes suivantes (vous pouvez copier-coller dans les console serial en faisant clic droit 😉):

edit int wireg wg0
set address <la première ip de votre bloc + 1>/<cidr>
set ip adjust-mss clamp-mss-to-pmtu
set private-key <Votre private key dans [Interface]>
set peer serveur address <IP de votre VPS>
set peer serveur allowed-ips 0.0.0.0/0
set peer serveur port <Le port spécifié à la ligne Endpoint>
set peer serveur preshared-key <Votre preshared key>
set peer serveur public-key <Votre public key>
exit
set prot stat route 0.0.0.0/0 interface wg0
commit
save

Essayez de faire un mtr 1.1.1.1, et vérifiez que le premier hop est bien 10.66.66.1. Si c'est bien le cas, il ne reste qu'à router les IPs vers eth1.
Il suffira de faire set prot stat route <votre bloc>/<cidr(/30 dans mon cas) interface eth1, effectuez ensuite à nouveau commitet save.

Pour finir, si vous voulez faire les choses bien, pour vous faciliter la vie dans le futur, configurons les dns et activons le SSH sur le VyOs avec les commandes suivantes:

set sys name-server 1.1.1.1
set sys name-server 1.0.0.1
set serv ssh access allow user vyos
commit
save
exit

Vous pouvez désormais tester votre tunnel en créant une VM ou un LXC sur le bridge de votre VyOS, et en le configurant avec une IP de votre bloc et le cidr (/30 dans mon cas), et comme gateway la première IP utilisable (+1) de votre bloc, que vous avez alloué à votre VyOS. Exemple pour ma config ci-dessous

Laissez aussi idéalement la dernière IP du bloc libre comme IP de broadcast

Démarrez ensuite votre LXC, et vous devriez avoir internet, vous pouvez le vérifier en faisant ping 1.1.1.1, et vérifier votre IP publique en faisant apt-get update && apt-get install curl -y && curl ifconfig.net.

Et voilà, vous avez des IPv4 routées à la maison à travers un tunnel WireGuard sur les périphériques de votre choix !

Et si je veux racheter des IPs ?

Il suffira d'ajouter le nouveau bloc dans votre fichier de config /etc/wireguard/wg0.conf comme ceci :

Ici, nous imaginons que j'ai acheté un bloc /29 et non un /30 pour bien voir la différence entre le bloc original et le nouveau.

D'exécuter ensuite systemctl restart wg-quick@wg0, et de faire ceci sur le VyOS:

config
set int wireg wg0 address <Première IP du nouveau bloc +1 >/<cidr>
set prot stat route <nouveau bloc>/cidr(29 ici) interface eth1
commit
save
exit

Et d'ajuster votre gateway en conséquence sur les VMs que vous créerez qui seront sur ce subnet, et d'encore une fois laisser la dernière IP du bloc libre.

En cas de soucis, ou de questions, rejoignez mon Discord et mentionnez-moi: https://discord.gg/Fz5cGnM7uQ