Reverse-proxy et Letsencrypt: comment ça marche?

Mon serveur YunoHost

Matériel: Ordinateur
Version de YunoHost: 11.2.5 sur les deux mahines
J’ai accès à mon serveur :
Serveur 1: En SSH | Par la webadmin |
Serveur 2: En direct avec un clavier/écran et par la webadmin sur le reseau local seulement
Êtes-vous dans un contexte particulier ou avez-vous effectué des modificiations particulières sur votre instance ? : oui ?
Si oui, expliquer:
Serveur 1: redirections des ports classiques depuis ma box (fritzbox)
Serveur 2: via reverse proxy

Description du problème

Bonjour,
j’ai récemment installé un deuxieme PC YNH (Serveur2) sur mon réseau local, avec un domain distinct. Cependant je n’arrive pas à y accéder depuis internet (ie depuis l’extérieur de mon réseau local)

Mon Serveur1 fonctionne bien depuis une paire d’années et est accessible depuis internet (ports redirigés dans ma box ISP).

En installant Serveur2, j’ai pris du temps pour comprende que ce n’était pas si facile de l’exposer aussi; j’ai bien songé à modifier les ports de chaque appli pour les rendre différents de Serveur1 mais il reste les incontournables 80 et 443

Après de longues heures de recherche j’ai appris qu’un Reverse proxy etait peut etre ma solution. N’étant pas prêt à bidouiller nginx j’ai abandonné un temps.
Puis j’ai vu cette appli dans le catalogue:
https://apps.yunohost.org/app/reverseproxy
Là encore ça m’a pris du temps pour comprendre comment fonctionne un RP et la doc n’est pas vraiment beginner friendly. Naivement je l’ai installée sur le Serveur2, et j’ai fini par comprendre que ça ne sert à rien.

Maintenant installé sur Serveur1 (je l’ai installé deux fois, une fois avec le nom de domaine de serveur2; une fois avec son ip locale, juste parce que je sais pas ce que je fais), j’ai pu enfin accéder à Serveur2 avec le nom de domaine mais toujous en local (avant ça juste l’IP locale fonctionnait pour accéder à l’admin de Serveur2, mais accéder à l’interface utilisateur switchait au nom de domaine et donc ne fonctionnait pas meme en local)

Cependant je ne peux toujours pas accéder à Serveur2 depuis l’extérieur (warning de sécurité, que je ne peux même pas ignorer):

Connexion bloquée : problème de sécurité potentiel

Firefox a détecté une menace potentielle de sécurité et a interrompu le chargement de nomserveur2, car ce site web nécessite une connexion sécurisée.

Que pouvez-vous faire ?

nomserveur2 a recours à une stratégie de sécurité HTTP Strict Transport Security (HSTS), une connexion sécurisée est obligatoire pour y accéder. Vous ne pouvez pas ajouter d’exception pour visiter ce site.

Installer Letsencrypt ne fonctionne pas sur Serveur2 à cause du diagnostic:
DNS: tout OK
Ports: inaccessibles en IPv6 (donc IPv4 ok??)
Web:

Le domaine <nom du Serveur2> est inaccessible en HTTP depuis l'extérieur.

    Le système de diagnostique n'a pas réussi à contacter votre serveur. Il se peut qu'une autre machine réponde à la place de votre serveur. Vérifiez que le port 80 est correctement redirigé, que votre configuration Nginx est à jour et qu'un reverse-proxy n'interfère pas.

J’ai essayer de forcer un certicat autosigné sur Serveur2 avec succes, mais ça ne change rien.

A noter:
-le nom de domaine de Serveur2 à été un temps ajouté sur Serveur1 (quand je n’avais qu’une machine), pour une appli qui nécessitait un domaine distinct. J’ai bien sur supprimé cette appli et ce domaine2 de mon Serveur 1.
-Je n’ai jamais réussi à me connecter à Serveur2 via ssh, même sur le réseau local (pourtant sur un port différent de Serveur1). J’ai un message de termux me mettant en garde contre le DNS spoofing, je pense une conséquence du fait que domaine2 etait un jour sur serveur1, ou alors le manque de letsencrypt sur serveur2? j’en sais rien (j’avais retiré serveur2 du fichier known_hosts de termux sans succès - mais c’est secondaire car j’ai accès à serveur2 en direct la plupart du temps)

Est-ce qu’il y a quelque chose que je fais mal? est-ce que Serveur1 devrait gérer les certificats de Serveur2? (et donc remettre domaine2 sur Serveur1 aussi? ça me semble très contre-intuitif)
Est-ce que j’utilise bien l’appli Reverse_proxy? En gros dois-je mettre l’IP ou le nom de domaine dans le champs d’installation
Emplacement de destination (unix:/fichier pour socket)
Et est-ce que la tuile de l’appli sert à quelque chose dans l’interface utilisateur?

Merci

Ce n’est peut-être pas la solution magique, mais en général j’entends plus parler de l’appli Redirect : YunoHost app store | Redirect

Au niveau des certificats, je ne suis pas 100% sûr de moi, mais voilà ce qui doit se passer :

Internet → Box → Server A → Server B (et puis chemin retour identique)

Niveau certificat, le serveur B ne pourra à priori pas gérer un certificat let’s encrypt, mais un auto-signé devrait parfaitement suffire vu qu’il n’ira pas jusqu’au poste client.
C’est uniquement le serveur A qui aura à gérer les certificats, et lui après il fait proxy vers le B (en http ou https avec certificat auto-signé)

La où ça va être moins rigolo, c’est l’accès au service de B depuis Server A.
Si le Server A essaie de passer par la Box, ça n’ira pas, vu qu’elle pointe vers lui.
Il faut donc que les services soient accessibles depuis le réseau local, avec l’ip locale.
Il y a plein de filouteries possibles si tu as besoin de passer par un nom de domaine, entre autre de modifier le fichier /etc/hosts du serveur A pour lui dire que serverb.mondomaine.ltd c’est 192.168.0.2 (a remplacer hein :stuck_out_tongue: )
Ou alors carrément de le faire au niveau de ton fournisseur de DNS (le DNS a le droit de répondre une IP sur le réseau local, qui ne sera accessible que depuis le réseau local du coup)

Et pour la tuile de l’application, c’est juste un raccourci, elle n’est pas nécessaire du tout.

Si je n’ai pas été clair, c’est normal, mais n’hésite pas à relancer :slight_smile:

Merci pour ta réponse.
Ajouter les noms de chaque serveur dans /etc/hosts de l’autre n’a rien changé.
Testé l’appli Redirect avec les options invisibles, mais ça n’a rien changé.
J’ai essayé la manière sale pour letsencrypt:
Redirigir temporairement les ports 80 et 443 vers serveur 2, et ça a fonctionné pour générer le certificat.
Puis j’ai rechangé les redirections vers serveur1, et ça me semble pire… J’ai toujours un message de sécurité pour accéder à domaine2 depuis internet, et depuis le réseau local, la machine serveur1 se substitue au domaine2 :upside_down_face:, je ne sais pas comment c’est possible… (ie je vois bien domaine2 dans la barre d’adresse de l’interface admin, mais je vois serveur1 (ses apps, son domaine… D’ailleurs cliquer sur Interface utilisateur renvoie vers le ssowat de serveur1 avec le domaine correct dans la barre d’ adresse) ).

Je me suis dit que je devais peut être réinstaller reverseproxy maintenant que serveur2 a un nouveau certificat, ça n’a rien changé. (PS j’avais retiré redirect avant tout ça).
Reboot des deux pour être sûr… Nope

Bref je mouline…
Je vais retirer les noms dans /etc/hosts

PS j’avais testé de configurer reverse proxy avec ou sans slash à la fin du domaine (le warning de l’appli reste un peu obscur pour moi concernant les chemins relatifs, mais je n’ai pas vu de différence)

Attention, pour les certificats, le serveur qui est derrière ne pourra pas se les re-générer, tu devrais rester pour des auto-signés pour lui.

La ce qu’il te faut pour que ça fonctionne, c’est de pouvoir accéder au serveur B depuis le réseau local, SANS passer par Internet (avec son IP sur le réseau local, peut-être avec un nom de domaine, et je ne sais pas comment ni si c’est géré par YunoHost d’avoir un faux nom de domaine, genre serveurb.local)

Petite recherche dans la doc : Accéder à son serveur depuis le réseau local | Yunohost Documentation

Ça ressemble grosso modo à ce que je propose :slight_smile:

Juste pour information j’ai abandonné l’idée par manque de temps à investir dans la compréhension des paramètres d’un reverse proxy. A terme je ne garderai que mon serveur2 que j’exposerai en lieu et place du serveur1 que je donnerai à un collègue que j’ai intéressé à l’auto-hébergement.
PS pour accéder à serveur 2 en local via son nom de domaine sans passer par internet, ma fritzbox le gère en ajoutant une exception sous " Protection contre les attaques par DNS Rebinding"

1 Like