Utiliser ngrok pour accéder à un YoctoHub

Utiliser ngrok pour accéder à un YoctoHub

Depuis quelque temps, nous vous proposons une solution logicielle pour vous connecter à distance sur vos hubs Yoctopuce, même lorsqu'ils sont derrière un filtre NAT: le GatewayHub. Cette solution doit toutefois être hébergée par vos soins sur un serveur connecté à internet disposant de Node.js. Aujourd'hui nous vous montrons une autre solution un peu différente, qui ne gère pas les hubs GSM mais permet par contre d'éviter de devoir gérer soi-même un hébergement public: ngrok.

Qu'est-ce que ngrok ?


ngrok est une solution proposée par @inconshreveable, composée de serveurs publics connectés sur internet, qui acceptent des connexions entrantes, et d'un programme que vous lancez sur une machine locale pour faire le lien entre le serveur public et les services que vous désirez rendre accessible. ngrok peut donc créer un tunnel bien spécifique entre une adresse publique et un service de votre choix sur votre réseau local.

L'utilisation classique de ngrok consiste à offrir l'accès depuis un réseau public à une machine de développement durant le codage et la phase de test d'un serveur web. Cela peut par exemple permettre de tester un callback HTTP ou WebSocket avec un YoctoHub-GSM. Mais l'utilisation qui nous concerne aujourd'hui est l'application inverse: obtenir un accès sécurisé à un YoctoHub, lorsqu'il est disposé intentionellement sur un réseau local protégé par un filtre NAT.

L'utilisation de ngrok est gratuite si l'on se contente de quatre tunnels et 40 connexions par minute, ce qui est largement suffisant pour accéder à des YoctoHubs puisque l'interface Web utilise des connexions Websocket persistantes. Pour un usage à long terme, les plans payants proposent quelques fonctions supplémentaires intéressantes:

  • Vous pouvez sécuriser le tunnel ngrok par une connexion TLS (accès https) de bout en bout, de sorte à ce qu'aucune donnée de circule en clair sur le réseau public
  • Vous pouvez utiliser un nom arbitraire pour votre point d'accès public, voire une adresse IP réservée
  • Avec un plan "Business", vous pouvez limiter l'accès à votre tunnel à certains clients, par adresse IP


Exemple simple


Voici un premier exemple pour accéder à distance à un YoctoHub-Ethernet, à l'aide d'un compte ngrok gratuit. Vous pouvez utiliser par exemple un Raspberry Pi comme relais pour le tunnel sur le réseau local:

Utilisation d'une passerelle ngrok pour accéder à un YoctoHub-Ethernet
Utilisation d'une passerelle ngrok pour accéder à un YoctoHub-Ethernet


Commencez par vous créer un compte sur ngrok.com. Téléchargez la version Linux (ARM) de ngrok, et copiez l'exécutable contenu dans le ficher zip dans le répertoire de votre choix, par exemple /usr/share/bin. Pour terminer l'installation, liez votre votre installation à votre compte ngrok à l'aide de la commande (en remplaçant VOTRE_AUTHTOKEN par la valeur disponible sur votre compte sur le site ngrok.com:

ngrok authtoken VOTRE_AUTHTOKEN


Vous pouvez ensuite créer un tunnel vers votre YoctoHub, dans notre exemple à l'adresse 192.168.1.100, avec la commande

ngrok http 192.168.1.100:4444


Le programme ngrok vous affichera alors l'adresse publique sur laquelle vous pouvez désormais contacter votre YoctoHub, tant que le tunnel fonctionnera:

ngrok by @inconshreveable Session Status online Account Yoctopuce (Plan: Pro) Version 2.2.8 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://af55f0c8.ngrok.io -> 192.168.1.100:4444 Forwarding https://af55f0c8.ngrok.io -> 192.168.1.100:4444 Connnections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00


Et vous pouvez faire l'essai, cela marche:

Accès au YoctoHub-Ethernet à travers le tunnel ngrok
Accès au YoctoHub-Ethernet à travers le tunnel ngrok


Notez qu'on peut même accéder au hub via l'adresse https:, et donc que la communication entre le navigateur et le serveur ngrok.io sera cryptée.

Exemple plus sérieux


Pour plus de sécurité, on peut configurer un tunnel sécurisé de bout en bout sur le réseau public: à la place d'être vérifiée par le serveur ngrok.io, c'est directement sur le Raspberry Pi que la connexion sera authentifiée. Les données seront donc cryptées lors de leur transit sur ngrok.io. Pour cela, on va donc utiliser

  • un nom de domaine privé, réservé
  • un certificat SSL correspondant à ce nom de domaine.

Pour cette version, vous devez donc disposer d'un nom de domaine et pouvoir configurer le serveur DNS correspondant. Vous trouverez les informations sur la configuration DNS à effectuer dans la documentation de ngrok, sous la rubrique Tunnels on custom domains (white label URLs).

Vous devez aussi vous procurer les fichiers .crt et .key qui assurent la sécurité de la connexion https pour ce domaine. Pour ne pas causer d'avertissement sur les navigateurs, ces fichiers doivent être générés par une autorité SSL reconnue par les navigateurs Web. Il suffit de poser ces fichiers sur la machine, et de les référencer dans la configuration de ngrok.

Plutôt que de fournir tous les paramètres sur la ligne de commande, on crée un fichier de configuration pour ngrok, nommé /etc/ngrok/ngrok.yml:

authtoken: VOTRE_AUTHTOKEN region: eu tunnels: demo: proto: tls addr: 192.168.1.100:4444 hostname: www.yoctopuce-demo.org crt: /etc/ngrok/yoctopuce-demo-2019.crt key: /etc/ngrok/yoctopuce-demo-2019.key



Vous pouvez tester votre fichier de configuation avec la commande suivante:

/usr/share/bin/ngrok start -config=/etc/ngrok/ngrok.yml -all



Et finalement, pour que le tunnel soit lancé automatiquement au démarrage du Raspberry Pi, on ajoute un script systemd appelé /etc/systemd/system/ngrok.service

[Unit] Description=Start ngrok tunnels [Service] Type=simple ExecStart=/usr/share/bin/ngrok start -config=/etc/ngrok/ngrok.yml -all Restart=on-failure RestartSec=30 User=pi Group=pi [Install] WantedBy=multi-user.target


Le service ngrok peut être ensuite activé pour chaque démarrage et lancé immédiatement avec les commandes

sudo systemctl enable ngrok.service sudo systemctl start ngrok.service


Voici le résultat:

Accès au YoctoHub-Ethernet à travers un tunnel ngrok sécurisé de bout en bout
Accès au YoctoHub-Ethernet à travers un tunnel ngrok sécurisé de bout en bout



Conclusion


La plus importante limitation de cette solution est qu'elle exige un ordinateur dans le même réseau local que le YoctoHub, et n'est donc pas applicable pour accéder aux YoctoHubs GSM, pour lesquels le GatewayHub reste la meilleure solution. Mais pour les autres cas, c'est une alternative crédible à la mise en place du GatewayHub, plus sécurisée que l'ouverture d'un port dans votre firewall... pour autant que vous fassiez confiance à ngrok pour ne pas contenir de vulnérabilité.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.