Forum Linux.général Proxy web inverse « invisible »

Posté par  . Licence CC By‑SA.
Étiquettes :
3
24
déc.
2018

Bonjour,

Je tente d'utiliser une application web écrite avec les pieds. Je n'ai pas le choix de l'application. Bien entendu, je n'ai pas le code source.

C'est une application qui ne fait que HTTP, et qui filtre en fonction du nom du serveur web demandé. Par exemple si je configure l'application pour répondre à app.example.com alors la connexion HTTP devra obligatoirement contenir Host: app.example.com sinon la connexion est rejetée.
Donc ça ne fonctionne pas depuis le réseau local si l'application est également sur le réseau local (ou alors il faut un DNS split-horizon, ou bricoler un fichier hosts sur chaque machine).

Mon objectif est de gérer HTTP et HTTPS, et de pouvoir me connecter depuis le réseau local et depuis l'internet (l'application est sur le réseau local, sur une Debian 9 toute fraîche).

Je n'arrive pas à faire fonctionner avec ce que je connais de nginx ou Apache en proxy inverse : j'ai la page de garde de l'application, et ensuite plus rien. Le journal de l'application indique ne pas servir l'adresse demandée, sans précision, avec d'autres infos totalement inexploitables. Rien de particulier dans les journaux des proxies.

J'aimerais faire en sorte que le proxy se fasse passer pour le navigateur (en principe c'est le cas non ? Comme si le navigateur était sur la même machine que le proxy, donc la même machine que mon application problématique), et qu'il réécrive Host: xxx dans tous les cas (en principe c'est le cas aussi non ?). Cela permet alors d'accéder à l'application depuis le réseau local via http://10.1.2.3 ou depuis internet via http://app.example.com

En plus je veux HTTP et HTTPS. L'application ne fait que le HTTP. Je n'ai habituellement pas de soucis avec ça non plus.

--> ça peut venir de quoi ce dysfonctionnement ? Sachant que la page de garde est ok, mais la suite ne fonctionne pas si j'utilise un proxy (sans proxy c'est ok, mais je n'ai pas HTTPS, ni possibilité de réseau local + internet)
--> je tente avec un autre proxy inverse ? Si nginx et Apache2 ne s'en sortent pas, je doute que ce soit mieux ailleurs

Merci d'avance à ceux qui tentent de répondre :-)

  • # Une piste

    Posté par  (site web personnel) . Évalué à 5.

    J'avais écrit une fois un proxy (python) qui se connectait à un proxy d'entreprise qui filtrait mes requêtes si celles-ci n'avaient pas de User-Agent. Ce petit code crée un proxy, qui ajoute un user-agent par défaut si la requête n'en possède pas.

    Ça n'est pas exactement ce que tu veux, mais le code est assez simple pour être modifié dans le sens que tu souhaites (il y a beaucoup de « je veux » dans ton message)

    À toi de jouer !

  • # HaProxy

    Posté par  . Évalué à 4. Dernière modification le 24 décembre 2018 à 13:55.

    Essayes avec HaProxy qui est conçu pour faire se que tu demandes.
    Par défaut tes User-Agent sont conservé. Tu peux modifier tout et n'importe quoi à la volée.

    • [^] # Re: HaProxy

      Posté par  . Évalué à 2.

      Pour tes questions :

      ça peut venir de quoi ce dysfonctionnement ? Sachant que la page de garde est ok, mais la suite ne fonctionne pas si j'utilise un proxy (sans proxy c'est ok, mais je n'ai pas HTTPS, ni possibilité de réseau local + internet)

      Probablement une vérification de l'hostname ($_SERVER["REMOTE_HOST"]) qui s'effectue partout sauf la page d'accueil.
      Beaucoup de CMS ont ce comportement (par exemple Prestashop ou Nextcloud).

      Si nginx et Apache2 ne s'en sortent pas, je doute que ce soit mieux ailleurs

      Ce sont des serveurs web avec quelques features de proxy, pas des soft né pour faire du proxy.

      J'aimerais faire en sorte que le proxy se fasse passer pour le navigateur (en principe c'est le cas non ?

      Par défaut avec HaProxy tout tes utilisateurs auront l'adresse IP du proxy. Tu peux voir ce tuto pour corriger ce soucis. Il y a quelques tutos/infos sur le sujet dans le wiki de linuxfr au besoin.

      • [^] # Re: HaProxy

        Posté par  . Évalué à 4.

        Par défaut avec HaProxy tout tes utilisateurs auront l'adresse IP du proxy

        il suffit de mettre la ligne

        source 0.0.0.0 usesrc clientip

        pour que l'IP du client soit directement passé au serveur

        par contre cela fonctionne mieux sur le proxy est aussi la route par defaut du serveur,
        sinon on peut se retrouver avec du routage assymetrique, qui peut etre problematique à gerer

        Client -> routeur/firewall -> haproxy -> serveur -> routeur/firewall -> client

        • [^] # Re: HaProxy

          Posté par  . Évalué à 2. Dernière modification le 25 décembre 2018 à 19:05.

          source 0.0.0.0 usesrc clientip

          Si cette ligne a vraiment ce comportement :

          Client -> routeur/firewall -> haproxy -> serveur -> routeur/firewall -> client

          Cela signifie que si un client contact ton frontend/proxy, le serveur va répondre directement au client SAUF si tu as configuré ton frontend comme passerelle réseau. (ce qui doit être assez compliqué à gérer si plus tard tu rajoutes un second frontend/proxy, ou simplement si tu ne veux pas que tes machines fassent tout transiter par ton frontend ou exposent leur IP)
          Par contre ça doit être assez puissant sur du multi-réseau, à voir comment réagissent les NAT des clients.

          La solution que j'ai linké se résume à demander à HaProxy d'ajouter un header et, côté serveur backend, utiliser le module rpaf d'apache2 (ou équivalent) :) On ne fait ainsi transiter que se qu'il y a besoin à travers le frontend/proxy.

      • [^] # Re: HaProxy

        Posté par  . Évalué à 3.

        Probablement une vérification de l'hostname ($_SERVER["REMOTE_HOST"]) qui s'effectue partout sauf la page d'accueil.

        Ce n'est hélas pas cette hypothèse : si Host: xxx n'a pas la bonne valeur je n'ai pas la page d'accueil du tout. Si Host: xxx a la bonne valeur j'ai la page d'accueil, mais si j'utilise un proxy alors je n'ai pas la suite.

        J'ai sniffé le réseau et je ne vois aucune différence entre ce qui est avant et après le proxy (sans chercher des heures non plus). Il y a donc une différence subtile mais je ne pige pas quoi.
        Autre possibilité : il y a une bonne grosse différence et je suis miro :-)

        Je vais tenter avec les deux propositions faites ici.

        • [^] # Re: HaProxy

          Posté par  . Évalué à 3.

          Ce n'est hélas pas cette hypothèse : si Host: xxx n'a pas la bonne valeur je n'ai pas la page d'accueil du tout.

          • y a un virtualhosting sur le serveur applicatif ?
          • peut-etre meme un reverse sur le serveur applicatif, chargé de mapper : ta requete port 80 <=> lelogiciel port xxxx
          • [^] # Re: HaProxy

            Posté par  . Évalué à 2.

            y a un virtualhosting sur le serveur applicatif ?
            peut-etre meme un reverse sur le serveur applicatif, chargé de mapper : ta requete port 80 <=> lelogiciel port xxxx

            C'est l'application qui fait directement office de serveur web (le truc dégueux à la mode depuis quelques années). Le proxy que je tente de faire fonctionner est sur la même machine.

  • # Cookies ?

    Posté par  . Évalué à 2.

    Cela pourrait être un problème de session/cookies, cf. http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_domain pour nginx. Si tu réécris l'en-tête host, assures-toi de réécrire l'attribut domain du set-cookie de la réponse, si présent. Bon je dis ça c'est juste une autre piste… La question est de savoir si cela fonctionne déjà en mode reverse proxy simple, c.-à-d. sans réécrire le Host mais en bidouillant le /etc/hosts du client et/ou du proxy.

    • [^] # Re: Cookies ?

      Posté par  . Évalué à 2.

      Pas mieux :-)

      Ça ne fonctionne pas non plus en reverse proxy en mettant à jour le fichier hosts. C'est ce qui m'avait étonné dès le départ.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.