Pourquoi ?

Ayant une connexion ADSL très instable et de débit en dessous du seuil d’acceptabilité, j'ai voulu mettre une box4G à la place.

Le gain en débit était au rendez-vous mais la plupart des services qui ne passent pas par le cloud n’étaient plus accessibles de l'exterieur (Home Assistant, portier vidéo, NVR, interaction Google Home / Home Assistant…).

L'explication est la suivante :

Sur une box ADSL, le réseau internet commence sur la partie WAN de la box et l’adresse IP qui lui est attribuée est accessible sur internet. Cela permet facilement de rediriger les ports de cette adresse ip publique vers un poste de votre réseau interne afin d’y accéder hors de chez vous.

Sur un réseau 4G l'adresse IP publique est partagée par un grand nombre de clients 4G et ne permet pas de faire de la redirection de port de la même façon qu’en ADSL. En effet, ce n’est pas l’adresse de votre box 4G qui est directement exposée sur internet. Votre box4G possède l’adresse d'un sous-réseau privée de votre opérateur et elle est inaccessible depuis lextérieur.

J’ai donc cherché à mettre en place une solution de redirection de port pour accéder à mes machine interne quand je suis à l’extérieur.

Le cas d’usage présenté ici consiste à accéder à une instance d’Home Assistant qui est utilisée en interne à l’adresse https://192.168.1.63:8123

Le concept est d’avoir un serveur avec un adresse ip dédiée accessible sur internet et de rediriger les requêtes effectuées sur ce serveur vers la machine de notre réseau interne.

Création d’un VPN

Cette étape permet d’accéder au réseau interne de façon sécurisée depuis une machine externe, le VPS.

J’ai choisi la solution Zerotier qui est assez simple à mettre en place, et j’ai créé un réseau VPN de 2 clients, un sur une machine du réseau interne qui servira de passerelle vers tout le reseau interne et l’autre sur le VPS qui servira de porte d’entrée depuis l’extérieur.

Vous trouverez toutes les informations nécessaires sur ce post : https://www.canaletto.fr/post/zero-vpn

On commence par créer un compte sur zerotier.com et par noter l’id du réseau , dans mon cas 8850XXXXXXXXXfe1.

J’ai ensuite installé dans un premier temps un client Zerotier dans un docker sur une machine de mon réseau interne (une VM ESXI Debian 10).

Note
L'installation d'un container sous  Docker n'est pas décrite ici, vous trouverez de la documentation par là. Vous pouvez également utiliser une autre méthode d'installation selon votre matériel.

J’ai utilisé le container disponible ici : https://hub.docker.com/r/henrist/zerotier-one

Une fois le container installé, on rejoint le reseau Zerotier avec la commande:

docker exec zerotier-one zerotier-cli join 8850XXXXXXXXXfe1

Dans l'interface zerotier, il faut autoriser le client qui a dû apparaitre et noter  sont adresse IP  (managed IP’s), dans mon cas 172.30.104.14

On va maintenant définir ce client comme passerelle pour atteindre le réseau interne qui est sur la plage 192.168.1.1/24.

Pour cela on ajoute une route :

destination : 192.168.1.0/23 et la passerelle (via) l'adresse du client qu'on vient de créer: 172.30.104.14

Installation du VPS

J’ai pris l’abonnement le moins cher chez firstheberg.com , le GP1 à 2,49 € HT/mois. Il semble qu’on puisse également utiliser celui de ionos.fr , le VPS S à 1 € HT/mois mais je n’ai pas testé.

J’ai choisi l’installation Debian 10 que j’ai configuré comme suit en me connectant en ssh avec Putty à l'aide des informations de connexion reçu par mail:

Mise à jour et installation de curl:

    apt update
    apt upgrade
    apt install curl

Installation de zerotier:

apt install gnupg
curl -s https://install.zerotier.com | bash

On rejoint notre réseau VPN zerotier:

zerotier-cli join 8850XXXXXXXXXfe1

Il faut maintenant autoriser le vps qui a dû apparaitre dans l'interface zerotier.

De nouveau sur le VPS, on active la redirection d’IP en modifiant le fichier sysctl.conf :

nano /etc/sysctl.conf 

On y ajoute la ligne suivante :

net.ipv4.ip_forward=1

On prend en compte la modification:

sysctl -p /etc/sysctl.conf
/etc/init.d/procps restart

On vérifie que tout est ok :

ip a
  • La première interface reseau est l'interface de lookback
  • La seconde est l’interface publique avec son adresse ip publique (ici 188.XX.XX.240)
  • La troisième est l’interface zerotier du VPN (172.30.35.171)

A ce stade, on doit pouvoir atteindre  depuis le VPS, la machine qui héberge Home Assistant :

ping 192.168.1.63

Redirection de port

Il reste à rediriger les requètes de l’ip publique du vps vers le réseau interne pour un port donné.

Dans mon cas d’usage, il s’agit du port 8123 qui doit être dirigé vers l’adresse ip 192.168.1.63 en passant par l’IP de l’interface VPN 172.30.35.171 :

  • Prerouting sur l'interface publique, dans mon cas eth0
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8123 -j DNAT --to-destination 192.168.1.63:8123
  • Postrouting sur l'interface zerotier, dans mon cas ztbpapkhdr
iptables -t nat -A POSTROUTING -o ztbpapkhdr -p tcp --dport 8123 -d 192.168.1.63 -j SNAT --to-source 172.30.35.171

Ces deux lignes sont à répéter pour chaque port qu’on souhaite ouvrir.
Si on souhaite également faire une translation de port, il suffit de changer le port indiqué dans --dport, ce qui peut être utile pour accéder depuis l’extérieur à plusieurs machines différentes qui utilisent le même port.

On test maintenant qu’on accède bien à l’interface d’Home Assistant depuis l’IP publique du VPS: https://188.XX.XX.240:8123

  • On rend ensuite les règles persistantes sinon elles seront perdues au prochain démarrage du VPS :
apt-get install iptables-persistent
systemctl enable netfilter-persistent
iptables-save > /etc/iptables/rules.v4

L’adresse IP du VPS est fixe mais j’utilise quand même le service duckdns.org afin de conserver la connexion SSL et de ne pas avoir d’IP fixe dans mes urls et autres composants. En cas de changement de VPS pour une raison ou une autre, il n’y a rien à changer. Par ailleurs, quel que soit le mode d’accès à internet du réseau interne (ADSL ou 4G), tout reste fonctionnel.

On peut maintenant se passer de la connexion adsl et se contenter d’une connexion en full 4G.