Xiaomi Roborock : contrôle à distance sécurisé avec nginx

Le robot est rooté, Valetudo est installé dessus et vous pouvez désormais faire nettoyer votre appartement en toute intimité et sécurité mais il reste un problème : que faire quand vous vous rendez compte que vous avez oublié de lancer le robot avant de partir de la maison ?

Avoir le robot accessible de l’extérieur c’est facile, il vous suffit de configurer votre routeur (opération assez simple dans la plupart des box françaises – et encore mieux avec un vrai routeur tournant sous OpenWRT !) pour rediriger un port quelconque inutilisé de celui-ci vers le port 80 du robot (là où Valetudo écoute). Et éventuellement, si vous n’avez pas d’IP fixe, utiliser un service de Dynamic DNS tel que votre registrar (OVH/…) via un nom de domaine vous appartenant ou un service dédié comme no-ip.com ou dyndns.com (pareil, votre box/routeur propose normalement une option pour gérer ce DynDNS)

Mais le gros problème c’est que n’importe qui entrant votre domaine/IP avec le bon port dans son navigateur aura accès directement au robot (et qu’une IP publique se fera scanner en permanence pour découvrir des services ouverts et potentiellement exploitables) et que, pour l’instant, Valetudo ne propose aucun système d’authentification (ce qui n’est pas son rôle de toute façon). Heureusement il est facile de placer Valetudo derrière un reverse-proxy comme Nginx qui nous fournira la sécurité nécessaire !

Connectez vous au robot par SSH (toujours avec le compte root) puis commencez par installer nginx (la version « core » suffit vu qu’elle contient le module d’authentification qui nous intéresse)

apt update && apt install nginx-core

Après nous allons créer l’utilisateur qui pourra se connecter à Valetudo via nginx (en remplacant roborock par ce que vous voulez)

echo -n 'roborock:' >> /etc/nginx/.htpasswd

Puis le mot de passe (qui vous sera demandé dans le shell après avoir exécuté cette commande)

openssl passwd -apr1 >> /etc/nginx/.htpasswd

Vous pouvez répéter les deux commandes au dessus plusieurs vous si vous voulez plusieurs comptes. Maintenant créons le fichier de configuration (port 8880 et domaine fictif pour l’exemple, changez à ce que vous voulez/avez)

echo "server {
    listen 8880;
    server_name monroborock.mamaison.com;

    location / {
        auth_basic \"Restricted Content\";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://127.0.0.1:80;
    }
}" > /etc/nginx/sites-available/roborock

Puis on le place dans les serveurs actifs :

ln -s /etc/nginx/sites-available/roborock /etc/nginx/sites-enabled/

Il nous faut aussi modifier le serveur par défaut de Nginx qui va rentrer en conflit avec Valetudo sur le port 80 sinon. On en profite pour mettre un catch all qui affichera une page d’erreur pour tout autre domaine que ceux configuré (ou ce que vous voulez tant que ça n’écoute pas sur le port 80)

echo "server {
	listen 8880 default_server;
	server_name _;
	return 403;
}" > /etc/nginx/sites-available/default

Il ne reste plus qu’à redémarrer nginx pour prendre en compte les modifications

service nginx restart

Et voilà votre robot est accessible depuis l’extérieur via le domaine/port choisi ! Et il va sans dire que la technique marche pour n’importe quelle interface de contrôle via navigateur que vos appareils peuvent avoir, vous avez juste à créer d’autres serveurs (sur d’autres port ou d’autres domaines) et éventuellement d’autres fichiers de mots de passe si vous ne voulez pas avoir le même pour tous vos appareils.

Astuces pour configurer le routeur/box

Pour me simplifier la vie je voulais une configuration qui me permette de toujours accéder au robot depuis monroborock.mamaison.com y compris depuis le réseau local. Et comme je fais confiance au VLAN où mes appareils principaux sont connectés, je voulais ne pas avoir à utiliser de mot de passe pour ces appareils là.

Version “box opérateur”

Tout ce que vous pouvez faire est d’ouvrir les ports sur la box. Il faut donc configurer la box pour que le port 8880 redirige sur l’IP du robot qui sera accessible sur http://monroborock.mamaison.com:8880 depuis l’extérieur (et l’intérieur en bouclant via votre FAI)

Version routeur OpenWRT (ou similaire)

Configuration supposée : votre box est en mode “bridge” ou bien son port 80 est déjà redirigé sur le routeur juste derrière elle.

La première étape est d’indiquer au routeur que le nom d’hote monroborock.mamaison.com est à rediriger sur l’IP du robot. Ainsi toutes les connections depuis le réseau local se feront sur le port 80 directement sur Valetudo sans passer par nginx.

Ensuite il faut ajouter une règle de firewall pour dire au routeur de rediriger les connexions entrantes sur le port 80 depuis “wan” sur l’IP du robot sur le port 8880 pour que les utilisateurs extérieurs soient filtrés par l’authentification nginx.

Et voilà ! http://monroborock.mamaison.com fonctionne aussi bien dans la maison que dehors, ce qui est pratique pour mettre un raccourci de navigateur sur son écran d’accueil.