Forum général.général Reverse Proxy avec Apache

Posté par .
Tags : aucun
1
26
juil.
2010
Salut,
aaa
J'essaie de mettre en place un reverse proxy avec Apache.
Ça fonctionne presque mais un problème persiste.

J'utilise des hôtes virtuels pour chaque site web derrière le proxy basés sur le nom (plusieurs entrés dans le DNS pour la même IP).

Exemple:
Site A : a.domaine.fr:80
Site B : b.domaine.fr:443

Je peux joindre mes deux sites sur leur adresse (http et https) mais si je rentre l'URL http://b.domaine.fr je tombe sur le site A et inversement. Si je rentre l'URL https://a.domaine.fr, j'arrive sur le site B.

Voila la conf d'Apache :


ServerRoot "/usr/local"

Listen 1.2.3.4:80
Listen 1.2.3.4:443

LoadModule include_module libexec/apache22/mod_include.so
LoadModule log_config_module libexec/apache22/mod_log_config.so
LoadModule logio_module libexec/apache22/mod_logio.so
LoadModule deflate_module libexec/apache22/mod_deflate.so

LoadModule headers_module libexec/apache22/mod_headers.so
LoadModule proxy_module libexec/apache22/mod_proxy.so
LoadModule proxy_http_module libexec/apache22/mod_proxy_http.so
LoadModule proxy_html_module libexec/apache22/mod_proxy_html.so
LoadFile /usr/local/lib/libxml2.so
#LoadModule xml2enc_module libexec/apache22/mod_xml2enc.so
LoadModule proxy_connect_module libexec/apache22/mod_proxy_connect.so
LoadModule ssl_module libexec/apache22/mod_ssl.so

<IfModule !mpm_netware_module>
<IfModule !mpm_winnt_module>

User www
Group www

NameVirtualHost 1.2.3.4:80
NameVirtualHost 1.2.3.4:443

<VirtualHost 1.2.3.4:80>
ServerName a.domaine.fr:80
ServerAdmin help@domaine.fr
ProxyRequests off
ProxyPass / http://a.interne.domaine.fr:8180/
ProxyHTMLURLMap http://a.interne.domaine.fr:8180 /
<\Location />
ProxyPassReverse /
ProxyHTMLEnable On
ProxyHTMLURLMap / /
RequestHeader unset Accept-Encoding
<\/Location>
</VirtualHost>

<VirtualHost 1.2.3.4:443>
ServerName b.domaine.fr:443
ServerAdmin help@domaine.fr
ProxyRequests off

SSLEngine on
SSLProxyEngine On
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /usr/local/etc/apache22/ssl/mycert.crt
SSLCertificateKeyFile /usr/local/etc/apache22/ssl/mykey.key

ProxyPass / https://b.interne.domaine.fr/
ProxyHTMLURLMap https://b.interne.domaine.fr/ /
<\Location />
ProxyPassReverse /
ProxyHTMLEnable On
ProxyHTMLURLMap / /
RequestHeader unset Accept-Encoding
<\/Location>
</VirtualHost>


Pouvez-vous m'expliquer le problème ? Je ne maitrise pas beaucoup Apache.
  • # virtualhost sur IP:PORT

    Posté par . Évalué à 4.

    tu bases tes regles virtualhost sur un couple IP:PORT

    du coup quand tu vas sur
    http://b.domaine.fr
    ca se convertit en 1.2.3.4:80 => donc dans le dossier de A

    et si tu vas sur
    https://a.domaine.fr
    ca devient 1.2.3.4:443 => et donc ton apache renvoie dans le dossier de B

    il faut faire tes virtualhost sur le domaine et pas sur IP
    • [^] # Re: virtualhost sur IP:PORT

      Posté par . Évalué à 1.

      Pourtant j'utilise la directive ServerName qui permet d'établir les règles sur le domaine. Elle fait la correspondance avec le champs Host de l'entête HTTP.
      J'ai essayé de remplacer le couple IP/PORT dans le champs mais le problème est toujours le même.

      J'ai trouvé le paramètre _default_ à placer dans le champs <VirtualHost _default_:*> mais je n'arrive pas à l'utiliser dans mon cas.
      • [^] # Re: virtualhost sur IP:PORT

        Posté par . Évalué à 2.

        tu es sur que tu as le droit de mettre le PORT dans la directive
        servername a.domaine.fr:80 ?
      • [^] # Re: virtualhost sur IP:PORT

        Posté par . Évalué à 1.

        Petite question : ces 2 virtualhosts sont les seuls ?

        Dans ce cas, je crois qu'Apache, lorsqu'il ne trouve pas de ServerName correspondant parmi les VirtualHost IP:PORT de la connexion, renvoie le premier trouvé.

        Et comme A est le seul sur le port 80, et B le seul sur le port 443, ils seront toujours renvoyés pour les connexions sur chacun de ces ports.

        Une astuce qui me vient à l'esprit serait de faire une redirection systématique :
        (après la def. de B)
        <VirtualHost 1.2.3.4:80>
        ServerName b.domaine.fr
        Redirect / https://b.domaine.fr/
        </VirtualHost>

        (après la def. de A)
        <VirtualHost 1.2.3.4:443>
        ServerName a.domaine.fr
        Redirect / http://a.domaine.fr/
        </VirtualHost>

        Plus d'infos :
        http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect

        Mais ça risque de ne pas marcher très bien dans le sens https->http à cause de :
        http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts

        Si tu trouves une autre astuce, ça m'intéresse, n'hésite pas à la signaler.

        Bien joué pour le port dans le ServerName, je ne connaissais pas non plus :)
        http://httpd.apache.org/docs/2.1/mod/core.html#servername
        • [^] # Re: virtualhost sur IP:PORT

          Posté par . Évalué à 1.

          La méthode du redirect fonctionne mais je trouve pas ça super propre.
          Je pensais que le tag "_default_" serait plus approprié.
          Je continu de chercher et je vous tiens au courant.

          Merci pour l'info à propos des connexions HTTPS, je n'y avais pas songé. Du coup ça limite beaucoup le fonctionnement de mon reverse proxy et je ne sais pas si je dois continuer à envisager cette solution.
          • [^] # Re: virtualhost sur IP:PORT

            Posté par . Évalué à 1.

            Après quelque recherche, le wildcard _default_ est utile que pour des vhost basés sur le couple IP/PORT.

            J'ai donc opté pour la solution du redirect pour le cas par défaut.

            Merci de ton aide.
  • # et un simple port forwarding ?

    Posté par . Évalué à 1.

    pcq finalement, tu veux juste convertir

    1.2.3.4:80 en adresse IP interne du site A:8180
    et
    1.2.3.4:443 en adresse IP interne du serveur B

    ce ne serait pas plus simple ?

    un port forwarding au niveau du retour serait tout aussi efficace
    sauf si le proxy est là pour mettre en cache/filtrer du contenu
  • # Name-Based Virtual Hosting avec différents hôtes virtuels

    Posté par . Évalué à 1.

    D'après la doc Apache 2.0:
    Il n'est pas possible d'identifier différents hôtes virtuels SSL car tant que le handshake SSL n'est pas terminé, Apache ne peut pas obtenir le champs HOST de l'entête HTTP qui permet d'identifier l'hôte virtuel à appeler.
    Mais pour effectuer le handshake, Apache à besoin de connaître la config SSL (cipher suite, the server certificate, etc.) indiqué dans la config de l'hôte virtuel. Ainsi, ça se mord la queue.

    cf. : http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts

    Je comprends bien le problème, mais j'ai fais le test avec la conf que j'ai précédemment indiquée et ça fonctionne.
    J'ai deux hôtes virtuels définit sur deux nom DNS pointant vers l'IP de mon proxy et le reverse proxy fonctionne bien sur ces deux URL en HTTPS.

    J'utilise Apache 2.2.15 sur une FreeBSD 8.0-RELEASE.
    La doc Apache ne serait pas à jour et les dernières versions corrigeraient ce problème ?

Suivre le flux des commentaires

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