Avoir des adresses IPV4 chez soi (Tunnel WireGuard)


J’ai serveur chez moi sur lequel j’ai installé ESXi, un hyperviseur qui me permet de créer plein de machines virtuelles. Dans ces machines virtuelles j’héberge divers services pour moi et pour d’autres.

Seulement, avec une seule IP (résidentielle), je suis vite limité par le nombre de ports à ma disposition et le nombre de services que je souhaite faire tourner dans les meilleures conditions.

J’ai donc donc cherché un moyen d’avoir des IP chez moi, dédiées, protégées par un Anti-DDOS et peu cher. Je n’avais jusqu’ici pas trouvé de résultat convenable, qui fonctionne bien, qui est modulaire, j’ai donc décidé d’en créer un.

Je précise que je ne suis pas un expert réseau, pour certaines personnes cette technique peut sembler sale ou incomplète, mais pour mon utilité elle semble parfaite. De plus, ce tuto est une seconde version grâce à la contribution de beaucoup de personnes qui m’ont aidé à avoir un résultat très qualitatif et stable, ils sont mentionnés à la fin de cet article.

1 – Les prérequis

  • Un VPS HMS
  • 1 ou plusieurs IP Additionnelles (Ce sont les IPs supplémentaires que nous utiliserons sur nos différents clients)
  • Debian 11 ≥ (Du moment qu’on a un Kernel Linux 5.10≥, qui supporte nativement WireGuard)

Justifications :

  • Aujourd’hui, j’utilise HostMyServers, un hébergeur français 🇫🇷. C’est le seul autre host que je connaisse qui propose des ipv4 à tarifs « à vie ». Il propose lui aussi un Anti-DDOS correct, et existe depuis un certain temps.

  • J’ai choisi WireGuard pour notre tunnel, un protocole VPN qui utilise de l’UDP. Il est compatible avec énormément de plateformes, est extrêmement léger, très facile à déployer et beaucoup plus performant que ses concurrents, tout en restant sécurisé. C’est un petit nouveau qui viens d’arriver dans le domaine de l’open-source et qui as fait ses preuves chez moi ces deux dernières années.

  • La qualité de l’interconnexion dépendra de votre réseau, WireGuard ne nécessite pas une bonne connexion internet, et ne réduira pas votre débit. Cependant, vous devrez rajouter le ping entre vous → HMS et HMS → vous.
⚠ Pour la suite de ce guide, il est nécessaire que vous utilisiez Debian 12 ⚠
Voici la grille tarifaire d’HMS (au 29/12/2022) : (VPS SSD NVME)
ModèleSSD-1SSD-2SSD-4SSD-8SSD-12SSD-12′
Prix mensuel sans engagement (TTC)2,99€5,99€9,99€19,99€29,99€39,99€
Bande passante250 Mbit/s500 Mbit/s800Mbit/s1 Gbit/s2 Gbit/s3 Gbit/s
vCore(s)12481212
Mémoire RAM2 Go4 Go8 Go16 Go24 Go32 Go
Stockage SSD20 Go40 Go60 Go120 Go160 Go200 Go

Ces offres ne disposent pas de limites d’IP Failover, vous pouvez en prendre autant que vous le souhaitez. Elles coûtent 1,99€ à vie.

Pour commander une IP Additionnelle, il faut qu’une fois le VPS Livré, vous vous rendez dans l’Espace Client (Votre VPS → Configuration → Commander une Nouvelle IP), une fois la commande passée, un mail de confirmation vous sera envoyé.

À l’heure où j’écris cette documentation les débits ne semblent pas bridés côté VPS. Le débit indiqué sur les offres commercialisées sont simplement une garantie.

Avertissements/Conseils :
  • Ne commandez pas de manière abusive des adresses IPV4, il n’y en a presque plus aujourd’hui. Préférez plutôt l’usage de l’IPV6 qui (à l’heure actuelle) ne souffre pas encore de pénuries.
  • WireGuard est un protocole qui rajoute une couche de chiffrement, cela demande de la puissance de calcul supplémentaire pour le VPS.
    Si vous souhaitez utiliser 250Mbps, 1 coeur devrait suffir
    Si vous souhaitez utiliser 500Mbps, je vous recommande 2 coeurs
    Si vous souhaitez utiliser 1Gbps+, je vous recommande 4 cœurs serait nécessaire au minimum.
    Ce soucis est lié directement au chiffrement, en cas de speedtest sur le VPS en lui-même, vous verrez bien les débits annoncés.
  • L’anti-DDOS peut se déclencher en cas de fort traffic sur votre tunnel WireGuard.
    WireGuard utilisant l’UDP, il sera probablement filtré ou très mal mitigé, pouvant avoir un impact sur la qualité de votre tunnel.
    Pour éviter ce genre de soucis je vous recommande vous limiter à une offre inférieure ou égale à 500Mbps.

3 – Installons notre VPS

⚠ Il est important d’avoir (au moins) une IP Additionnelle commandée et livrée pour la suite du tutoriel. ⚠

Connectez vous en SSH à votre VPS via les identifiants qui vous ont été transmis par mail ou que vous avez rentré lors de la première installation.

3.1 ⚠⚠⚠⚠ Préparation du réseau ⚠⚠⚠⚠

Récemment, les images des VPS Debian ont changé, et utilisent désormais netplan.io comme gestionnaire de réseau.
Cela compromettant la documentation, il est nécessaire que nous revenions à ifupdown.

Étape 1 : VÉRIFIEZ SI VOUS ÊTES IMPACTÉS :

systemctl status networking

Si la commande ci-dessus vous retourne l’erreur suivante :

Alors vous devez CONTINUER les commandes suivantes.
Si elle vous retourne bien comme quoi un service fonctionne, alors NE FAITES PAS les commandes suivantes, et passez au 3.2.

Étape 2 : Installer ifupdown et resolvconf

apt install ifupdown net-tools resolvconf -y

Étape 3 : Désinstaller netplan et ses composants

apt-get purge netplan.io --autoremove -y

Étape 4 : Relancer Cloud-Init pour qu’il re-crée les configurations réseau sous ifupdown

cloud-init clean
cloud-init init

Étape 5 : Activer les services de ifupdown

systemctl unmask networking 
systemctl enable networking resolvconf

Étape 5 : Désactiver tous les services liés à netplan :

systemctl stop systemd-networkd.socket systemd-networkd systemd-networkd-wait-online
systemctl disable systemd-networkd.socket systemd-networkd systemd-networkd-wait-online
systemctl mask systemd-networkd.socket systemd-networkd systemd-networkd-wait-online

Étape 6 : Réparer la résolution DNS

rm /etc/resolv.conf
ln -s /run/resolvconf/resolv.conf /etc/resolv.conf

Étape 7 : Relancer ifupdown (Il va retourner une erreur, ce n’est pas grave)

systemctl start networking

Étape 8 : Redémarrer

reboot

Le VPS va redémarrer, les empreintes SSH auront changé il faudra donc accepter sur le client les avertissements comme quoi il y a eu un changement.

Une fois le vps redémarré, vérifiez que :

ping google.fr

Renvoie bien une IP et non pas une erreur,

Et que la commande suivante :

systemctl status networking

Vous affiche ceci :

Si tout est bon, alors vous pouvez passer à la suite.

Sinon, vous avez peut-être mal copié-collé les commandes ci-dessus, ou pire, le réseau à encore changé et je dois apporter une modification à ma documentation. N’hésitez pas à me contacter.

3.2 Allons-y

Commençons par une mise à jour de l’OS :

sudo su -
apt update && apt upgrade -y
reboot

Une fois le redémarrage terminé, installons les dépendances nécessaires :

sudo su -
apt install wireguard wireguard-tools resolvconf bash curl arping wget -y

Une fois ceci fait, nous pouvons maintenant préparer notre serveur WireGuard.
Pour cela, j’ai choisi d’utiliser un script maintenu par quelqu’un sur GitHub qui crée un tunnel et génère facilement des profils :

curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh
chmod +x wireguard-install.sh
bash wireguard-install.sh

Une fois ceci fait il va lancer un petit setup interactif :

Welcome to the WireGuard installer!
The git repository is available at: https://github.com/angristan/wireguard-install

I need to ask you a few questions before starting the setup.
You can leave the default options and just press enter if you are ok with them.

IPv4 or IPv6 public address: <ipvps>
Public interface: ens3
WireGuard interface name: wg0
Server's WireGuard IPv4: 10.66.66.1
Server's WireGuard IPv6: fd42:42:42::1
Server's WireGuard port [1-65535]: XXXXXX
First DNS resolver to use for the clients: 1.1.1.1
Second DNS resolver to use for the clients (optional): 1.0.0.1
WireGuard uses a parameter called AllowedIPs to determine what is routed over the VPN.
Allowed IPs list for generated clients (leave default to route everything): 0.0.0.0/0,::/0

Ne touchez pas aux options, elles sont très bien auto-générées et on les modifiera par la suite.

Press any key to continue...

Une fois tout ce QCM rempli, il va tout préparer et nous demandera ensuite le nom de notre tout premier client.

Client name: MaVM

Ici, pour lui donner un nom facile à reconnaître je vais l’appeler MaVM, mais vous pouvez l’appeler comme vous le souhaitez.

Client's WireGuard IPv4: 10.66.66.2
Client's WireGuard IPv6: fd42:42:42::2

Il nous demande ici une ip (qui sera incrémentée pour les futurs clients), on la retirera plus tard, laissez là comme elle est.

Une fois cette pré-installation terminée, nous allons pouvoir nettoyer ce que ce script à généré. Il est initialement conçu pour router tout le traffic de nos profils sur l’IP du VPS, ce qui n’est pas vraiment ce que nous souhaitons.

nano /etc/wireguard/wg0.conf

Puis retirez les lignes commençant par PostUp et PostDown :

PostUp = ....................................................
PostDown = ....................................................

Une fois ceci fait, nous allons également ajuster quelques réglages de notre réseau linux pour autoriser le passage des paquets un peu partout :
Il faut ajouter les lignes suivantes dans :

nano /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.all.proxy_arp=1
net.ipv6.conf.all.forwarding=1

Une fois ceci fait, nous pouvons appliquer avec :

sysctl -p

4 – Fabriquons nos profils WireGuard

Le Script à déjà créé un premier profil (MaVM), mais il va maintenant falloir l’ajuster pour qu’il ai sa bonne IP Failover.
Je précise qu’à partir, d’ici ce sera la même chose pour n’importe quel profil généré à l’aide du script.
Pour regénérer un autre profil : bash wireguard-install.sh

Adaptons déjà les paramètres du côté serveur :

nano /etc/wireguard/wg0.conf
### Client MaVM
[Peer]
PublicKey = jeSuiSuNeCléeVrAimeNtTrèsComPliquÉe==
PresharedKey = jeSuiSuNeCléepArtAgéEVrAimeNtTrèsComPliquÉe==
AllowedIPs = 10.66.66.2/32,fd42:42:42::2/128

Ce qui nous intéresse ici, ce sont les AllowedIPs, ce sont les adresses IP qui ont été attribuées pour le profil MaVM. Modifions celle-ci en retirant l’IP locale (10.66.66.2/32) et en rajoutant l’IP FO HMS (par exemple : 92.122.45.218) .
Vous devez également retirer l’IPV6, et en rajouter une manuellement (voir plus loin).

Cela devrais nous donner ceci :

AllowedIPs = 92.122.45.218/32

Je précise que sur un VPS il est important de mettre un /32 à la fin de l’IP pour ne pas avoir de problèmes de routage.

Une fois cette modification réalisée, nous pouvons sauvegarder puis effectuer la même du côté de notre client.
Dans notre dossier nous devrions avoir un wg0-client-MaVM.conf, modifions-le !

nano wg0-client-MaVM.conf
[Interface]
PrivateKey = jeSuiSuNeCléeVrAimeNtTrèsComPliquÉe==
Address = 10.66.66.2/32,fd42:42:42::3/128
DNS = 1.1.1.1,1.0.0.1

[Peer]
PublicKey = jeSuiSuNeCléeVrAimeNtTrèsComPliquÉe==
PresharedKey = jeSuiSuNeCléepArtAgéEVrAimeNtTrèsComPliquÉe==
Endpoint = 54.39.36.154:55563
AllowedIPs = 0.0.0.0/0,::/0

Ici également il faut remplacer à côté de Address, l’IP Locale par l’IP Failover (avec le /32 à la fin !). Cela devrais nous donner ceci :

Address = 92.122.45.218/32

Une fois ce profil sauvegardé et nos deux configurations sauvegardées, veuillez redémarrer votre VPS HMS :

reboot

Si ce n’est pas la première fois, un simple redémarrage du service WireGuard suffira :

systemctl stop wg-quick@wg0
systemctl start wg-quick@wg0

Si après tout ce que nous avons fait, la commande systemctl status wg-quick@wg0 ne vous donne pas d’erreur alors tout est prêt !

5 – Déployons nos profils WireGuard :rocket:

Et voici !

Notre profil est maintenant prêt à être déployé sur n’importe quelle plateforme (Windows, Linux, Android, MacOS, IOS, et plein d’autres !)

Je vais vous faire un petit exemple de comment déployer sur linux :

# Installer Wireguard (en étant sur Ubuntu 22> ou Debian 11>) :
apt install wireguard wireguard-tools resolvconf

# Installer le profil Wireguard :
nano /etc/wireguard/wg0.conf
(puis coller le profil wireguard modifié à l'intérieur)

# Activer et lancer notre profil wireguard au démarrage :
systemctl enable wg-quick@wg0 --now

# Et voici ! Votre IP est maintenant montée sur cet appareil !
# Vous pouvez vérifier en faisant un
ip a 
# ou un
curl ifconfig.me

C’est vraiment très rapide et simple ! Et ça marche 🤩

Profil qui ne fonctionne pas ?

Il peut arriver qu’il y ai un soucis de routage sur le VPS, pour corriger le problème effectuez la commande suivante (SUR LE VPS) :

arping -q -c1 -P <ipfailover> -S <ipfailover>

L’IP est censée de nouveau fonctionner !

Bonus : Pas d’internet dans les containers Docker/Pterodactyl ?

J’ai constaté récemment qu’après mise à jour de Docker et Pterodactyl, certains de mes containers n’avaient plus ou difficilement internet.
Ils bloquaient lors d’un apt update, ou bien n’arrivaient tout simplement pas à faire des requêtes web mais les pings semblaient passer.

Après avoir eu confirmation de plusieurs personnes, nous avons trouvé un fix qui semble très bien fonctionner.
Voici la démarche à suivre :

  1. Modifier le fichier /etc/pterodactyl/config.yml pour mettre comme mtu 1370 :

  2. Si vous souhaitez que ce soit effectif de manière globale à tous vos containers docker, vous pouvez modifier le service docker :

    Modifiez le fichier suivant : /lib/systemd/system/docker.service

    Et ajoutez à la fin de la ligne ExecStart : --mtu=1370

    ExecStart=/usr/sbin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_OPTS --mtu=1370

    Vous pouvez ensuite recharger la configuration de systemd (systemctl daemon-reload)

  3. Il faut ensuite éteindre les services, systemctl stop wings docker, puis supprimer l’interface réseau de docker ip link delete docker0

  4. Une fois ceci fait, vous pouvez relancer docker : systemctl start docker, puis nettoyer les interfaces réseau et images de pterodactyl, docker system prune.

  5. Vous pouvez optionnellement donner un petit coup de frais à votre wings avec la commande suivante : rm /var/lib/pterodactyl/wings.db

  6. Et enfin, relancer wings : systemctl start wings

Vos containers devraient désormais avoir de nouveau accès pleinement à internet.
J’ai utilisé 1370 en MTU car il fallais une valeur plûtot basse. Cependant, si jamais vos services rencontrent des problèmes de stabilité au niveau du réseau, ou bien de débit, cela peut-être lié au MTU trop bas.

Pour les personnes ayant des compétences en réseau, il faudrait essayer de modifier le MTU de WireGuard (sachant qu’il est idéal de le changer également côté serveur) afin de régler le problème pour tous les processus.

(6) – Conclusion & Remerciements

Et voici, vous avez maintenant (16) IP Failovers disponibles chez vous, protégées par HMS sur n’importe quel appareil !

Cette astuce m’a permise de franchir un grand pas dans l’auto-hébergement que ce soit dans des services pour moi ou pour les autres car elle m’offre la puissance d’avoir des VPS (grâce à un hyperviseur comme Proxmox ou ESXi) avec des IP dédiées à prix réduit et avec un service de qualité similaire.

Ce tutoriel existe initialement depuis Juillet 2020, mais a été remasterisé récemment en Décembre 2022 avec beaucoup d’améliorations et de mises à jour.
WireGuard a enfin été merge dans le kernel linux stable et est encore plus simple à installer qu’avant. Et ce tutoriel a également été amélioré par la communauté et les personnes qui utilisent actuellement cette solution chez-eux ou autre part.

Je tiens à remercier :
  • @Aven678 : Pour avoir simplifié énormément la gestion des IP’s et la création de profils
    Et également pour l’intégration de l’IPV6 au sein de cette documentation.

  • @DrKnaw : Pour avoir patché des bugs liés à mon système qui n’était pas tout à fait fini à l’époque

  • Mael : Qui a entièrement est testé le tutoriel pour voir que tout fonctionne

  • @Twistky: Qui m’as également fais débugger plusieurs fois ma doc.

  • @Diggyworld : Qui a remarqué et passé toute une soirée à trouver une solution pour ces fichus soucis de réseau.

  • @titin : Pour m’avoir aidé à trouver pourquoi les ips ne se montaient pas parfois.

Et plein d’autres personnes qui m’ont envoyé un message sur Discord pour m’aider à améliorer cette documentation ou me remercier.

Liens Utiles :

Merci d’avoir suivi cette documentation, j’espère qu’elle vous sera très utile.


Publié

dans

par

Étiquettes :

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *