Bonjour à tous.

Avant toute chose, je tiens à préciser que cet article n’est pas le produit de ma réflexion mais bien le reflet d’heures passées dans un premier temps avec Seph29 puis avec Sillundil sur le serveur Discord Tonton Jo.

Sans ces deux personnes, jamais je n’aurais été capable d’y arriver seul. Tout le mérite leur revient.

En deux mots, voici la problématique qui m’a mené à vouloir accèder aux éléments situés derrière mon routeur 4G. Suite à l’achat d’une maison secondaire, je me suis trouvé face à un problème. Cette maison n’étant habitée que ponctuellement et l’offre ADSL proposée sur place étant proche du néant, j’ai décidé d’opter pour l’installation d’un routeur 4G avec une carte SIM FreeMobile.

19,99€ (ou 15,99€ si vous êtes abonnés) pour une connexion qui tourne autour de 50 à 100 Mb/s valait mieux qu’un forfait ADSL poussif, même peu onéreux, me proposant une connexion entre 1 et 3 Mb/s ! L’avantage du forfait FreeMobile pour moi est principalement qu’il est illimité. J’avais commencé avec un Forfait RED by SFR à 200 Go par mois mais la limite a vite été atteinte. Après, libre à vous de choisir l’abonnement qui vous convient en fonction de vos besoins, la problématique n’est pas là et je n’ai aucun lien d’intérêt, ni avec l’un, ni avec l’autre.

Possédant une box domotique dans mes placards, je me suis dit qu’il serait intéressant de la mettre en place pour, par exemple, déclencher le chauffage à distance afin d’avoir une maison chauffée à notre arrivée. Après les problématiques et intérêts sont propres à chacun. Seulement, impossible d’accéder à ma box domotique à distance.

En standard, les fournisseurs de services 4G ne vous octroient pas d’adresse IP Publique sur votre routeur (d’ailleurs, c’est la même chose sur votre téléphone portable). Le plus souvent c’est une adresse IP Privée dans leur réseau, c’est à dire une adresse IP en 10.x.x.x. Le problème, c’est que si vous souhaitez configurer DynDNS par exemple sur votre routeur, pour éventuellement rediriger un port sur une machine dans votre réseau, vous ne pouvez malheureusement pas le faire car l’adresse envoyée à votre prestataire de DynDNS est en 10.x.x.x. L’idée est donc d’installer un serveur VPN (VPS) chez soi, là ou vous avez une réelle IP Publique (fixe ou dynamique) et derrière le routeur 4G, d’installer un Raspberry Pi qui fera office de client VPN afin de créer une liaison entre les deux sites au travers du routeur 4G.

Et pour rendre tout cela plus sympa, la mise en place d’un reverse proxy permettra de rendre les redirections plus simple à mettre en place.

0. Ce dont vous avez besoin comme matériel

Les matériels ou solutions décrites juste en dessous ne sont pas une obligation. C’est le choix que j’ai fait mais le Raspberry Pi peut parfaitement être remplacé par un PC ou une VM hébergé sur un Nas. Le choix d’utiliser des VM reste également un choix personnel et une volonté de simplification. Quand à l’utilisation d’une routeur 4G suivi d’une routeur Ubiquity vient du fait que je possédais ce matériel. Et comme nous le verrons plus tard, le routeur doit offrir la possibilité de créer une route Statique, ce que mon routeur b818-263 de chez Huawei ne semblait pas me proposer.

  • Un Raspberry Pi 3 ou 4 (ou un
  • Un NAS Synology supportant VMM (Virtual Machine Manager)
  • Une carte micro SD de minimum 4Go
  • Un lecteur de carte micro SD pour préparer votre carte sur votre PC ou Mac
  • Un routeur 4G

1. Les logiciels nécessaires / téléchargements

2. Prérequis

  • Avoir installé Raspberry Pi OS Lite sur votre RaspBerry Pi. Pour l’installation, je vous invite à regarder les tutos qui sont nombreux sur internet, l’important étant d’avoir un système d’installé et d’activer le SSH.
  • Avoir installé Debian 10 dans deux VM séparées sur votre Nas Synology. Pour l’installation, idem que pour le Raspberry Pi. Une fois de plus, ce n’est pas une nécessité. Le choix de 2 VM étant la volonté de séparer les services. Tout peut très bien s’installer sur une seule et même VM (ou un petit PC faisant office de serveur).
  • Savoir se servir d’une console SSH et maitriser un minimum les commandes Linux.
  • Avoir un nom de domaine chez OVH par exemple, si vous voulez pousser la configuration un peu plus loin et d’avoir ajouté deux entrées de type A dans votre zone DNS redirigeant nomdedomaine.com et *.nomdedomaine.com vers votre IP fixe publique.
  • Se munir d’un peu de patience !

3. Convention

Afin de simplifier la compréhension, je conviendrai d’un certain nombre d’adresses qui faciliteront l’identification des consignes à l’application du tutoriel :

  • Adressage réseau « physique » du site A : 192.168.1.0/24
  • Adressage réseau « physique » du site B : 192.168.2.0/24
  • Passerelle (routeur) du site A : 192.168.1.1
  • Passerelle (routeur) du site B : 192.168.2.1
  • IP Publique Fixe du site A : 80.0.0.0
  • Adressage réseau « virtuel » entre le site A et B : 10.0.0.0/24
  • La VM1 accueillant WireGuard sur le site A aura pour adresse « physique : 192.168.1.10 et pour adresse « virtuelle » : 10.0.0.1
  • La VM1 accueillant Docker, Docker-Compose et Nginx Proxy Manager sur le site A aura pour adresse « physique : 192.168.1.20
  • La Raspberry Pi accueillant WireGuard sur le site B aura pour adresse « physique : 192.168.2.20 et pour adresse « virtuelle » : 10.0.0.2
  • La Box domotique sur le site B aura pour adresse « physique : 192.168.2.30
  • Le nom de domaine utilisé chez OVH sera nomdedomaine.com

4. Schéma

Et comme une image vaut mieux qu’un long discours, voici un aperçu des réseaux et des éléments qui les composent pour que vous puissiez visualiser la situation de départ et l’emplacement des différents réseaux.

5. VM1 – Installation de WireGuard

On va commencer par installer notre première machine virtuelle. On fera une installation minime. Nous n’avons pas besoin d’interface graphique, juste d’un serveur SSH et des outils de base.

On ouvre donc un session SSH dans votre première VM (VM1). Première chose à faire une fois Debian installé, mettre le système à jour :

sudo apt-get update
sudo apt-get upgrade

Si vous êtes dans une machine virtuelle, il va falloir installer quelques outils comme qemu-guest-agent, net-tools ou sudo. qemu-guest-agent est un outil qui permet par exemple de remonter l’IP de la machine virtuelle entre autre.

sudo apt install qemu-guest-agent net-tools sudo

Nous allons passer ensuite à l’installation de WireGuard. WireGuard est dans un repository « backporté ». On va donc l’autoriser dans notre Debian

sudo sh -c "echo 'deb http://deb.debian.org/debian buster-backports main contrib non-free' > /etc/apt/sources.list.d/buster-backports.list"

Avec la commande cat, on vérifie le repo

cat /etc/apt/sources.list.d/buster-backports.list

Le retour devrait vous afficher quelque chose de cet ordre :

deb http://deb.debian.org/debian buster-backports main contrib non-free

On refait une petite mise à jour.

sudo apt update

Et on attaque l’installation de WireGuard

sudo apt install wireguard

6. VM1 – Configuration de WireGuard

Une fois l’installation terminée, nous allons d’abord créer une paire de clés privée et publique pour le serveur WireGuard. On se place dans le répertoire de WireGuard

cd /etc/wireguard/

Puis on exécute la commande suivante :

umask 077; wg genkey | tee privatekey | wg pubkey > publickey

Pour voir les clés générées, utilisez la commande ls :

ls -l privatekey publickey

qui vous affichera quelque chose comme ça :

- rw -------- 1 root root 45 apr 12 08:32 privatekey
- rw -------- 1 root root 45 apr 12 08:32 publickey

Ensuite on va afficher les clés pour les copier avec la commande cat. Elles nous serviront à construire notre fichier de configuration de WireGuard. Il faudra les copier dans un coin. Le principe est qu’il y aura WireGuard sur le site A qui possèdera sa clé privée et qui détiendra la clé publique du WireGuard du site B. Et inversement. La commande :

cat privatekey

va vous afficher la clé privée qui doit ressembler à une truc dans ce genre :

eiifeiyuz24KGkAZ32DqssfqsfAF2efeeF23fee32=

Même chose pour la clé publique et on copie le résultat :

cat publickey

Pour configurer WireGuard, on va donc devoir créer un fichier de configuration et le remplir. Il faudra y revenir plus tard dans ce fichier car nous n’avons pas encore tous les éléments pour qu’il soit complet. Pour comprendre simplement et comme évoqué plus haut, le fichier de configuration de WireGuard du site A doit comporter la clé privée du site A et la clé publique du site B. Et inversement pour le site B. Seulement, nous venons de ne générer que les clés de WireGuard du site A et nous n’avons pas encore la clé publique du site B, ni même installé WireGuard du côté de ce site. On s’en tiendra donc à ne remplir que la première partie du fichier de configuration nommé wg0.conf pour y revenir par la suite et le compléter :

sudo nano /etc/wireguard/wg0.conf

Et dans le fichier on colle :

[Interface]
## Adresse virtuel de WireGuard qu'on a défini pour le site A ##
Address = 10.0.0.1/24

## Port d'écoute qui peut être modifié au besoin ##
ListenPort = 51194

## Clé privée de la VM1 ##
PrivateKey = eiifeiyuz24KGkAZ32DqssfqsfAF2efeeF23fee32=

7. RaspBerry Pi – Installation de WireGuard

L’installation de Wireguard sur le RaspBerry Pi est similaire à l’installation sur la VM1 et ne comporte pas plus de difficultés que cela.

8. RaspBerry PiConfiguration de WireGuard

Comme pour la configuration de WireGuard dans la VM1, la procédure reste exactement la même. Par contre, après avoir récupéré les clés privée et publique du RaspBerry Pi, nous serons en mesure de créer un fichier de configuration complet. On crée donc le fichier wg0.conf du RPI :

sudo nano /etc/wireguard/wg0.conf

Et on rempli les différentes rubriques avec les infos suivantes :

[Interface]
## Adresse virtuel de WireGuard qu'on a défini pour le site B ##
Address = 10.0.0.2/24

## Clé privée du RaspBerry Pi ##
PrivateKey = qGnwp/XMSkstkesdtqkDSKYSKdtjSEjk8bQcYKrydk0=

[Peer]
## Clé publique de la VM1 ##
PublicKey = ffgsdv+yCoTbVPIyaWVUUSFGqFHsdjKfykFGdhfjdJJF=

## Réseaux et IPs autorisées ##
AllowedIPs = 10.0.0.1/32, 192.168.1.0/24

## IP public de la VM1 et son port d'écoute ##
Endpoint = 80.0.0.0:51194

##  Persistance de la clé ##
PersistentKeepalive = 25

Ne pas oublier d’aller compléter le fichier wg0.conf de la VM1 puisque maintenant on dispose enfin de la clé publique du RaspBerry Pi :

[Interface]
## Adresse virtuel de WireGuard qu'on a défini pour le site A ##
Address = 10.0.0.1/24

## Port d'écoute qui peut être modifié au besoin ##
ListenPort = 51194

## Clé privée de la VM1 ##
PrivateKey = eiifeiyuz24KGkAZ32DqssfqsfAF2efeeF23fee32=

[Peer]
## Clé publique du RaspBerry Pi ##
PublicKey = b5DFilnh9CIxJtbcZq/a66PXCBO8uqMJWXsr/9EwcxM=

## Réseaux et IPs autorisées ##
AllowedIPs = 10.0.0.2/32, 192.168.2.0/24

##  Persistance de la clé ##
PersistentKeepalive = 25

Une fois le deux fichiers de configuration complétés, relancer le service sur chaque machine en l’arrêtant et en le démarrant ensuite :

Arret du service

systemctl stop wg-quick@wg0.service

Démarrage du service

systemctl start wg-quick@wg0.service

Vérification de l’état du service

systemctl status wg-quick@wg0.service

Il faudra activer également l’IP forwarding sur chacune des machines. On vérifie en tapant :

sysctl net.ipv4.ip_forward

Si ça vous renvoie 1, l’IP forwarding est activé sinon ça vous renverra 0.

Pour l’activer sans devoir rebooter, vous pouvez rentrer

sysctl -w  net.ipv4.ip- forward=1

Afin d’activer l’IP forwarding à chaque démarrage de façon perenne, je vous conseille de rentrer ceci :

echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-ipforwarding.conf

9. VM2 – Installation de Docker & Docker-Compose

Après s’est connecté en SSH sur la VM2, on va installer Docker et Docker-Compose. Mais c’est quoi Docker au juste ?

Docker est la plateforme de conteneurisation la plus utilisée. Cette plateforme va permettre de gérer des conteneurs. Un conteneur est un environnement d’exécution léger et une alternative aux méthodes de virtualisation traditionnelles basées sur les machines virtuelles. Avec la technologie Docker, vous pouvez traiter les conteneurs comme des machines virtuelles très légères et modulaires. En outre, ces conteneurs vous offrent une grande flexibilité : vous pouvez les créer, déployer, copier et déplacer d’un environnement à un autre.

Quand à Docker-Compose, c’est un outil qui permet de décrire (dans un fichier YAML) et de gérer (en ligne de commande) plusieurs conteneurs comme un ensemble de services inter-connectés.

Bon, on attaque l’installation de Docker. On commence par vérifier que la Debian est à jour.

sudo apt -y update && sudo apt -y upgrade

Ensuite, on va devoir installer les différentes dépendances nécessaires à l’installation de Docker

sudo apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common

Il nous faudra également importer la signature du dépôt pour notre système en exécutant cette commande :

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

et on ajoute le dépôt en finissant par le mettre à jour :

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt-get update

Notre système est enfin prêt à recevoir Docker en tapant :

sudo apt-get install docker-ce docker-ce-cli containerd.io

Lorsque l’installation est terminée, rentrez cette commande pour vérifier l’état du service :

sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-11-10 13:54:43 CET; 1min 3s ago
     Docs: https://docs.docker.com
 Main PID: 20675 (dockerd)
    Tasks: 8
   Memory: 43.6M
   CGroup: /system.slice/docker.service
           └─20675 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

De base, un utilisateur lambda ne peut se servir de Docker. Il va falloir l’ajouter dans le groupe de Docker. Mais auparavant, on va créé un groupe « docker »

sudo groupadd docker

et on intègre l’utilisateur :

sudo usermod -aG docker votreutilisateur

On passe ensuite à l’installation de docker-compose. On commence par installer les dépendances :

sudo apt install libffi-dev libssl-dev python3 python3-pip

Puis on installe docker-compose

sudo pip3 install docker-compose

Et on redémarre le Raspberry Pi

sudo reboot

10. Configuration des passerelles

A ce stade, pour que la configuration soit complète, il va falloir ajouter des routes statiques aux deux passerelles. Et là, il s’agit de bien suivre. Les interfaces étant différentes en fonction de votre matériel, je vous laisse le soin de faire quelques recherches pour savoir où se trouve l’ajout de route statique dans votre routeur.

Pour le site A, voici la configuration :

La route statique va s’appuyer sur le prochain saut (l’IP de la machine hébergeant votre WireGuard pour savoir où rediriger votre flux) et indiquer un réseau vers lequel il doit se diriger. Concrètement je permets ici à une machine positionnée dans le réseau 192.168.1.0/24 du site A de pinguer une machine se trouvant sur le réseau 192.168.2.0/24 du site distant B en passant par notre tunnel VPN 10.0.0.0/24 en passant par WireGuard se trouvant à l’IP 192.168.1.10

Après cette explication, la configuration de la route statique du site B devrait vous paraitre plus simple et compréhensible. Je veux rejoindre le réseau 192.168.1.0/24 en passant par l’IP 192.168.2.20 qui est mon point d’entrée du VPN :

Un fois fait, vos deux réseaux devraient être accessibles l’un l’autre grâce au VPN mis en place et de façon transparente.

Il ne nous reste plus qu’à mettre en place Nginx Proxy Manager pour rendre tout cela encore plus facile à gérer.

11. VM2 – Installation de Nginx Proxy Manager

Un serveur Nginx n’est pas toujours simple à gérer, c’est pourquoi l’outil Nginx Proxy Manager a été développé par Jamie Curnow (JC21) en 2018. Nginx Proxy Manager est open source et fournit une interface graphique pour la gestion des fichiers de configuration Nginx. Le but de ce projet est de gérer les hôtes virtuels, sans pour autant avoir de connaissances en Nginx. Il permet également de récupérer des certificats Let’s Encrypt très facilement.

Il permet également de configurer graphiquement un mandataire inversé, plus couramment appelé reverse proxy.

Mais avant toute chose, pensez à rediriger les ports 80 et 443 du routeur se trouvant sur le site A vers l’ip de Nginx Proxy Manager, ici ce sera 192.168.1.20.

On se place dans le répertoire de l’utilisateur

cd /home/votreutilisateur

et on crée notre fichier docker-compose.yaml qui va nous permettre d’installer notre conteneur Nginx Proxy Manager très facilement:

sudo nano docker-compose.yaml

Et on va venir y coller :

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

On procèdera à l’installation en lançant la commande :

docker-compose up -d

Il ne vous restera plus qu’à vous connecter à l’adresse suivante :

http://IP de la VM2:81

Donc dans notre exemple, ce sera :

http://192.168.1.20:81

Vous voici devant l’interface graphique de Nginx.

L’adresse mail par défaut est admin@example.com et le mot de passe est changeme.

Vous allez vous retrouver devant une interface vide.

Je vous conseille vivement de changer dès à présent votre adresse mail et votre mot de passe en allant cliquer en haut à droite sur le user.

Ceci fait, cliquez sur l’onglet Hosts pour aller rajouter une redirection.

En partant du postulat que nous possédons un nom de domaine nomdedomaine.com, nous allons configurer Nginx pour qu’il redirige le sous-domaine domotique.nomdedomaine.com vers l’IP locale de notre box domotique située dans le site B (rappelez-vous que Nginx Proxy Manager est situé dans la VM2 hébergée sur le site A).

Rien de plus simple. Il suffit de cliquer sur le bouton vert « Add Proxy Host« .

Et de remplir dans un premier temps les rubriques de la section Details. J’attire votre attention sur le fait qu’une fois que l’url est rentrée, il faut cliquer juste en dessous sur Add domotique.nomdedomaine.com comme sur l’illustration pour l’ajouter dans le champ sinon vous serez bon, comme moi, pour recommencer. Cela s’explique par le fait que vous n’êtes pas limité à un seul sous-domaine et que vous pouvez en ajouter plusieurs à la suite.

Si on reprend les éléments de notre exemple, on devrait avoir ça :

On passe ensuite à la partie certificat dans l’onglet SSL. Cliquez sur None pour dérouler la liste est choisissez Request a new SSL Certificate.

Une fois fait, activer Force SSL et cliquez sur Save.

Voilà, vous venez de finir de mettre en place une liaison VPN entre deux sites distants en passant au travers d’un routeur 4G. Et cerise sur le gâteau, vous avez créé votre première redirection sur un Reverse Proxy pour que votre URL domotique.nomdedomaine.com pointe sur la box domotique en passant du site A vers le site B derrière le routeur 4G.

Ce n’est qu’un exemple d’utilisation d’un VPN, les possibilités sont nombreuses. A vous d’adapter cela à vos besoins. Je suis sûr que nombres d’entre vous y trouverons une utilisation efficace.

Categories:

Tags:

2 Responses

  1. Bonjour,

    Moi aussi j’ai le même problème : accéder à mon réseau dans une résidence secondaire depuis n’importe où sur le web pour piloter mon raspberry pi qui est relié à un routeur 4G. Je dispose d’un nom de domaine, et en résidence principale d’une freebox fibre et d’un raspberry.
    Si j’ai bien compris le tuto est valable pour moi.
    Exact ?

    Pour mon chauffage en résidence secondaire actuellement depuis cet été j’ai un esp32S2 qui interroge régulièrement un fichier sur un site web, une interface web permet de changer le fichier et ainsi l’esp32S2 peut allumer ou éteindre le chauffage. Tests concluants cet été, reste à savoir si je réussirais à déclencher cet hiver avant mon arrivée. Un autre ESP32S2 me renseigne sur la température dans la maison dans un canal https://thingspeak.com/ et mon voisin peut venir déclencher manuellement le chauffage. La solution est simple, peu onéreuse quand on voit le prix des raspi actuellement, peu gourmande en électricité surtout que les Esp32S2 sont en mode sommeil profond la plupart du temps.

    • Bonsoir Francis,
      Désolé, j’ai tardé à te répondre.
      Oui ma solution est faite pour toi ! Je suis exactement dans la même configuration que toi. Pour ma part, ça fonctionne sans problème.
      N’hésite pas à me contacter sur le discord si tu veux que l’on échange, ce sera plus facile.
      Ta solution pour le chauffage m’intéresse également 😉
      A très vite.

Laisser un commentaire

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