Accès Distant HTTPS (DuckDNS) + Local HTTP (NGINX) facile (avec les infos manquantes pour les freebox entre autres)

Accès Distant HTTPS (DuckDNS) + Local HTTP (NGINX) facile (avec les infos manquantes pour les freebox entre autres)

J’ouvre ce sujet pour ceux qui comme moi sont restés bloqués sur des tutos incomplets ou trop complexes, alors que la solution est finalement plutôt facile…
Pour ma part j’avais déjà configuré l’accès distant DuckDNS donc je reprends l’explication pour les 2 cas de figure, pour ceux qui avaient déjà l’accès HTTPS et pour ceux qui partent de zéro.

Prérequis

Un éditeur de fichier de configuration, par ex. le module File Editor

Objectifs

  1. Une solution gratuite
  2. Accès distant en sécurisé (HTTPS) pour piloter votre Home Assistant depuis l’extérieur
  3. MAIS conserver l’accès classique non sécurisé (HTTP) pour piloter votre Home Assistant depuis chez vous (surtout si le serveur distant ou si internet ne fonctionne plus il vaut mieux garder ça fonctionnel)

Pourquoi/pour qui ce complément aux tutos existants?

Il manque quelques explications claires sur

  • comment configurer l’accès distant (DuckDNS) avec en plus l’accès simple HTTP ?
  • comment gérer les redirections de port avec une freebox qui par exemple exige un port supérieur à 16384 ?
  • comment passer de sa config (réalisée avec l’un des nombreux tutos existants, par exemple chez les alexiens) de DuckDNS seul (donc en tuant son accès local en http, plus d’accès HA en cas de panne internet) vers DuckDNS+NGINX ?

Principe

(j’ai refais le schéma incomplet que l’on trouve dans un autre tuto un peu trop compliqué à mon avis, inutile d’installer MariaDB en particulier)
on veut changer le truc par défaut

en ça (approximativement):

on le voit sur le schéma il suffit de 3 trucs : un serveur DNS (duckDNS.org ici) + NGINX qui gère la réception https + DUCKdns (module HA) pour gérer les certificats httsp [*]

Tuto sur la base d'un très bon autre tuto

Je reprends ici les étapes du très bon (mais incomplet) tuto en vidéo de Raynox

https://www.youtube.com/watch?v=dNfSp9BcywE
Et voici les étapes (avec mes ajouts & modifications) étape par étape:

  1. Adresse externe de votre box: https://www.whatsmyip.org/ qui vous donne donc mon_NumeroIP_externe (en IPv4 pour ma part)
  2. Redirections de ports (comme sur mon schéma) on veut rediriger un port vers le 443 pour NGINX, si vous avez une freebox on choisit au pif un port TCP n°YYYYY supérieur à 16384 (en se connectant sur l’interface mafreebox.freebox.fr) que l’on redirige (début et fin = YYYYY) vers 443.
  3. OPTION si vous avez déjà configuré DuckDNS et déjà fait une redirection de port n°ZZZZZZ vers 8123 pour DuckDNS avant, vous la supprimerez à la fin (donc pas maintenant) quand tout fonctionne (sinon plus de connexion à HA… il suffirait alors de la remettre…). Mais du coup, utilisez un port n°YYYYY différent de n°ZZZZZ.
  4. Créer son accès DNS avec DuckDNS (gratuit): connectez-vous puis créez votre adresse DNS au nom que vous voulez (par ex HeleneAstuce.duckdns.org) en précisant bien l’adresse IP de votre box (mon_NumeroIP_externe).
  5. Dans Home Assistant > Paramètre > Modules Complémentaires installer le module DuckDNS avec dans l’onglet configuration (avant de démarrer le module): (a) copier/coller le nom de votre domaine sans le https (HeleneAstuce.duckdns.org) et (b) copier/coller le token (qui est affiché quand vous vous connectez) et éventuellement (c) ajouter la ligne algo: secp384r1 après accept_terms: true (sans ça pour ma part ça ne marche pas)
  6. Dans Home Assistant > Paramètre > Modules Complémentaires installer le module NGINX Home Assistant SSL Proxy (dans le catalogue) avec dans l’onglet configuration (avant de démarrer le module): (a) copier/coller le nom de votre domaine sans le https (HeleneAstuce.duckdns.org) et … C’est TOUT
  7. Dans File Editor (ou tout autre editeur) ouvrir configuration.yaml et ajoutez (et enregistrer)
http:
#  ssl_certificate: /ssl/fullchain.pem
#  ssl_key: /ssl/privkey.pem
  use_x_forwarded_for: true
  trusted_proxies:
    - 172.30.33.0/24

(ssl key et certif sont à commenter si vous aviez déjà configuré duckDNS, sinon ignorer | Les 2 lignes du bas (pas dans la vidéo) sont peut-être dispensables (mais ça ne coûte rien) | L’option ip_ban de la vidéo c’est bonus en option si tout le reste fonctionne(mieux vaut s’assurer que le reste fonctionne d’abord))

  1. On redémarre Home Assistant et on vérifie que tous les accès fonctionnent: (a) purger avant les cookies du navigateur sur PC et le cache de l’application sur mobile, (b) on accède à l’accès local en HTTP (http://homeassistant.local:8123) et distant HTTPS avec (https://HeleneAstuce.duckdns.org:YYYYY), (c) et SI on avait déjà configuré DuckDNS (avant ça) alors l’accès distant HTTP est opérationnel (http://HeleneAstuce.duckdns.org:ZZZZZ) et on le désactive (car c’est ennuyeux d’avoir un accès ouvert non secure de l’extérieur) en supprimant la redirection de port ZZZZZ vers 8123, comme précisé en (3)

PS: pour accéder avec son appli mobile il faut bien sûr modifier dans les paramètres l’adresse du serveur externe avec le bon numéro de port externe (https://HeleneAstuce.duckdns.org:YYYYY)

EDIT: pour être vraiment COMPLET (même si tout est fonctionnel avec ce qu’il y a au-dessus), on peut en plus…

  • ajouter l’adresse externe (https://HeleneAstuce.duckdns.org:YYYYY) dans Paramètres > Système > Réseau > URL de Home Assistant
  • ajouter le wifi local Dans l’application mobile Paramètres > Application Compagnon > Serveur "Maison" > SSID du réseau wifi domestique > sélectionnez votre wifi (à condition d’être connecté en wifi) de façon à passer en HTTP local quand vous êtes sur votre wifi local (et vraiment indépendant d’internet du coup)

[*] Pour un autre DNS que duckdns il y a l’option d’utiliser le module Let's Encrypt (cf. McFly).
Pour l’utilisation de NGINX seul (sans duckDNS ni Let’sEncrypt), c’est peut-être une possibilité (à confirmer sur les limitations, cf. aussi ce post de Sylvain_G que je n’ai pas testé jusqu’au bout).
Et il y a certainement encore d’autres possibilités

8 « J'aime »

Félicitations pour ce tuto, complet mais aussi explicatif du principe par l’intermédiaire des 2 schémas (pour des non experts en réseaux c’est important de mettre des schémas)

1 « J'aime »

Cool d’avoir pris le temps de faire un tuto pour ça.
Tjrs sympa de penser aux autres.

Ce qui est cool avec NGINX, c’est qu’on peut donner un accès à différentes machines via des sous-domaines sans pour autant ouvrir d’autres ports sur la box. Perso j’adore.

1 « J'aime »

J’utilise une configuration HA core (docker) avec NPM (Nginx Proxy Manager) bien entendu je n’ai nullement besoin d’installer DuckDNS car NPM intègre la fonction.

Je me posais la question de l’intérêt d’installer DuckDNS dans la config que vous proposez ?

Quelqu’un chez Proximus utilise ce système, j’ai bel et bein l’impression que la Box de proximus nous empêche de mettre cette méthode

Bonjour
Très intéressant.
J’avoue que je ne me rappel même plus pourquoi j’avais décidé de faire un connexion https entre NPM et HA … Il n’y a pas des services auxquels ca pose problème d’atterrir en http sur HA?
Sinon sur le schéma on vois que rentrer l’IP local de HA depuis le PC envoi vers nginx mais avec le port 8123 c’est pas possible, si ?

Bon déjà on pourra dire qu’on a là une version sans MariaDB utilisé dans un autre tuto, mais si on peut simplifier encore plus pourquoi pas…

J’avoue que je ne suis pas sûr de la nécessité d’utiliser l’extension duckdns… Peut-être pour mettre à jour et faire le lien entre ton IP et celle de duckdns.org? En tout cas pour ma part je n’ai pas HA en installation docker, mais pas sûr que ce soit un paramètre important.

un spécialiste réseau pourrait nous dire ça ? Je suis curieux d’avoir une explication complètement limpide…

1 « J'aime »

En fait l’installation par défaut de HA est en http et en local uniquement… donc je suis curieux de savoir ce que ça impliquerait comme problème…

Oui bien sûr, et c’est tout l’intérêt de la manip, sinon le module DuckDNS seul ne permet qu’un accès en passant par l’extérieur pour revenir en local…

Pour les services qui pourrait poser problème je pensais aux assistants vocaux et autres accès a l’API HA par l’extérieur par des services qui réclamerait du https de bout en bout.
Mais ca ne semble pas poser de problème et tant mieux.
Ce que je ne comprends pas sur le schéma c’est que 8123 c’est un port d’écoute de HA pas de nginx. Qu’une requête en local sur 8123 transit d’abord sur nginx m’échappe mais ça doit venir du fait qu’il sont sur la même machine avec la même IP.

En tout ça me paraît tellement simple et efficace que je pense le rajouter entre NPM et HA pour pouvoir virer les restrictions en local.
Tout fonctionne bien chez moi mais si panne d’internet je vais perdre les API HA alors que tout est en local

Effectivement pour l’update de l’IP publique en cas d’adresse dynamique.

1 « J'aime »

Non car si c’était le cas ces services ne fonctionneraient pas avec HA.

En fait les services vont voir HA en HTTPS avec le le proxy peu importe que derrière le proxy on soit en HTTP.

C’est une coquille sur le schéma, la requête sur le port 8123 ne passera pas par NGINX mais ira directement sur HA.

1 « J'aime »

Merci pour les éclaircissements. Je vais installer ça ce weekend et rebasculer tout ce qui peux l’être sur l’ip local.

Malheureusement ca ne fonctionne pas chez moi. J’ai une erreur 502.
Peut être un rapport avec algo: secp384r1 que je n’ai pas mis car pas duckdns. Il doit y avoir un équivalent mais je ne sais même pas si il serait a mettre au niveau d’OVH ou de NPM

peut-être avec le module Let’s Encrypt (je n’ai pas testé)

Merci beaucoup @ebz pour ce tuto :pray:. Le sujet a été abordé de très nombreuses fois sur ce forum avec les évolutions tant de HA que des modules complémentaires(Lt’s encrypt, …), néanmoins à travers toutes ces lectures je n’y arrive pas … enfin presque.

  1. Avec seulement le module DuckDNS j’arrive à me connecter à distance sans soucis et en HTTPS. Par contre en locale je ne peux pas me connecter en HTTP.
  2. Si je suis ton tuto pour pouvoir être en HTTPS à distance et en HTTP en local, je bloque sur les redirections de port qu’il faut mettre en place dans la box. Est-ce que tu m’éclaircir ce point avec un exemple concret de port et d’adresse à créer en NAT dans la box internet (je ne comprends pas bien le schéma …):

Merci pour ton aide !!

Merci pour le retour, et il faudrait que je nettoie et clarifie encore un peu plus l’article (mais comme il est un peu au fin fond du forum, je n’ai pas pris la peine, cool si ça peut servir :+1: )

C’est pour ça qu’il faut installer le module NGINX, il y a « malheureusement » beaucoup de tutos qui proposent de n’installer que le module DuckDNS… ça marche en https en redirigeant vers le port 8123 qui du coup n’est plus disponible pour la connexion locale en http (sans « s »). C’est une solution « facile » pas vraiment correcte à je trouve. En général beaucoup de tutos quand celui qui l’a fait a trouvé une solution qui marchait pour lui (typiquement pourquoi pas dire qu’on peut prendre autre chose que 443 à l’extérieur, surtout quand plein de gens sont concernés par ce problème).

Note: le module DuckDNS remplace LetsEncrypt (et il fait plus encore, car il renouvelle automatiquement le certificat au besoin)

Il faut d’abord ouvrir le 443 dans ta box, si tu as freebox comme moi tu ne peux pas avoir de 443 à l’extérieur, il faut donc prendre un numéro supérieur à 16384. Par exemple tu prends 16385.
quand je vais sur http://mafreebox.freebox.fr je fais ça (j’active la redirection vers 443 et je désactive celle vers 8123 des tutos qui n’utilisaient pas NGINX):

En résumé (important au niveau de l’ouverture des ports)

  • inutile d’ouvrir le port 8123
  • inutile d’ouvrir le port 80 (le module DuckDNS se débrouille tout seul pour renouveler le certificat tandis que les tutos passant par LetsEncrypt ajoutent cette étape)
  • uniquement ouvrir le port 443 pour le https (ici WAN = 16385 pour LAN = 443 dans l’interface de la box en protocole tcp, ce qui signifie ensuite qu’il faut accéder en distanciel par https://ton-adresse-duckdns.duckdns.org:16385 depuis l’extérieur, et par contre depuis l’intérieur c’est l’adresse par défaut http://homeassistant.local:8123 que « tout » le monde utilise et qui n’est active que si tu as bien configuré nginx en parallèle de duckdns)
1 « J'aime »

Top ! Merci pour ta réactivité !!
Avec les modules DuckDNS et Nginx j’arrivais à accéder du réseau LAN en HTTP mais de l’extérieur aussi en HTTP :upside_down_face: pas top …
Donc dernière étape je désactive ma redirection de port externe 8123 vers interne 8123 et créé la redirection de port externe 16938 (choisi arbitrairement) vers interne 443. Est ce que dans le module Nginx ou quelque part d’autre je dois préciser l’utilisation de ce port 16938 ?

Je teste tout ça ce soir.
Merci et bonne journée.

oui c’est l’idée, désactiver le http depuis l’extérieur en désactivant la redirection vers le port 8123

non, ton home assistant « écoute » le côté intérieur de ton réseau (donc le port 443) et il n’a pas besoin de savoir que c’est le 16938 depuis l’extérieur.
(Sauf bien entendu dans les paramètres systèmes de ton appli companion sur téléphone où tu précises l’adresse externe de ton duckdns: https://HeleneAstuce.duckdns.org:16938)

1 « J'aime »

Bonjour à tous,

Je découvre Home assistant et j’ai suivi votre tuto pour installer duckdns et NGINX. J’ai ouvert un port sur ma freebox, je pense avoir suivi toutes étapes mais impossible d’accéder à home assistant en local et de l’extérieur en même temps.
Je suis obligé de commenter les lignes ‹ # ssl_certificate: et # ssl_key: › pour pouvoir accéder à home assistant en local mais, du coup, je n’ai plus accès à home assistant de l’extérieur. Et inversement, dès que j’enlève les #, ça me fait l’effet inverse.

J’ai ouvert 2 ports sur ma freebox car j’avais suivi l’installation de Duckdns sur un autre tuto, donc j’ai un port ouvert 443 vers 8123 et un autre port ouvert 16385 vers 443.

Auriez vous une idée de (ou des) erreur(s) que j’ai pu commettre ?