Forum Linux.général Double reverse proxy

Posté par  .
Étiquettes :
1
23
oct.
2012

Sommaire

Problème

Bonjour Forum,

j'utilise avec succès le logiciel SOGo, et notamment son webmail qui est fort sympathique.

Aujourd'hui, le webmail est hébergé sur la même machine que le serveur mail Dovecot/Postfix, via Apache utilisé comme reverse proxy.

Je souhaite cependant séparer le webmail du serveur mail, pour mieux sécuriser la plateforme.

J'essaie alors de configurer un 2ème reverse-proxy avec nginx sur une autre machine, qui redirige vers le serveur apache (qui lui-même redirige vers SOGo)… et ça marche pas trop :/ .

Alors, cher forum, sauras-tu m'aider à configurer le tout correctement ?

J'ai 2 solutions en tête :
1 - Client -> Reverse Proxy Nginx (Machine A) -> Reverse Proxy Apache (Machine B) -> SOGo (Machine B)
2 - Client -> Reverse Proxy Nginx (Machine A) -> SOGo (Machine B)

Voici ci dessous ma conf Apache, et plus bas ma conf nginx non fonctionnelle.

Conf Apache

    <VirtualHost *:80>
       Servername webmail.societe.com
       RedirectMatch permanent ^/ https://webmail.societe.com/SOGo
       RedirectMatch permanent ^/SOGo https://webmail.societe.com/SOGo
    </VirtualHost>

    <VirtualHost *:443>
       Servername webmail.societe.com
       SSLEngine On
       SSLCertificateFile /etc/apache2/certs/webmail.societe.com.ssl.crt
       SSLCertificateKeyFile /etc/apache2/certs/webmail.societe.com.ssl.key
       DocumentRoot /usr/lib/GNUstep/SOGo/WebServerResources/
       ErrorLog /var/log/apache2/error.log
       Customlog /var/log/apache2/access.log combined
       ServerSignature Off
       <IfModule mpm_itk_module>
           AssignUserId sogo-a sogo-a
      </IfModule>

       Alias /SOGo.woa/WebServerResources/ /usr/lib/GNUstep/SOGo/WebServerResources/
       Alias /SOGo/WebServerResources/ /usr/lib/GNUstep/SOGo/WebServerResources/
       AliasMatch /SOGo/so/ControlPanel/Products/(.*)/Resources/(.*) /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2

       <Directory /usr/lib/GNUstep/SOGo/>
          AllowOverride None
          Order deny,allow
          Allow from all
       </Directory>

       <LocationMatch "^/SOGo/so/ControlPanel/Products/.*UI/Resources/.*\.(jpg|png|gif|css|js)">
         SetHandler default-handler
       </LocationMatch>

       ProxyRequests Off
       SetEnv proxy-nokeepalive 1
       ProxyPreserveHost On
       ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0

       <Proxy http://127.0.0.1:20000/SOGo>
         RequestHeader set "x-webobjects-server-port" "443"
         RequestHeader set "x-webobjects-server-name" "webmail.societe.com"
         RequestHeader set "x-webobjects-server-url" "https://webmail.societe.com"
         RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
         RequestHeader set "x-webobjects-remote-host" %{REMOTE_HOST}e env=REMOTE_HOST
         AddDefaultCharset UTF-8
         Order allow,deny
         Allow from all
       </Proxy>
       ## We use mod_rewrite to pass remote address to the SOGo proxy.
       # The remote address will appear in SOGo's log files and in the X-Forward
       # header of emails.
       RewriteEngine On
       RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT]
       Redirect permanent /index.html https://webmail.societe.com/SOGo
    </virtualhost>

    <virtualhost *:8800>
    # this virtualhost is only for carddav on Mac (Mail and Iphone)
      RewriteEngine Off
      ProxyRequests Off
      SetEnv proxy-nokeepalive 1
      ProxyPreserveHost On
      ProxyPassInterpolateEnv On
      ProxyPass /principals http://127.0.0.1:20000/SOGo/dav/ interpolate
      ProxyPass /SOGo http://127.0.0.1:20000/SOGo interpolate
      ProxyPass / http://127.0.0.1:20000/SOGo/dav/ interpolate
      <Location />
        Order allow,deny
        Allow from all
      </Location>
      <Proxy http://127.0.0.1:20000>
        RequestHeader set "x-webobjects-server-port" "8800"
        RequestHeader set "x-webobjects-server-name" "webmail.societe.com:8800"
        RequestHeader set "x-webobjects-server-url" "https://webmail.societe.com:8800"
        RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
        RequestHeader set "x-webobjects-remote-host" "127.0.0.1"
        AddDefaultCharset UTF-8
      </Proxy>
      ErrorLog /var/log/apache2/error.log
      Customlog /var/log/apache2/access.log combined
    </virtualhost>

Conf Nginx

    server {
            listen   443;
            server_name  proxyweb.societe.com;

            access_log /var/log/nginx/proxyweb.societe.com.log;
            error_log /var/log/nginx/proxyweb.societe.com.error.log debug;

            ssl  on;
            ssl_certificate  /etc/nginx/ssl/webmail.societe.com/webmail.societe.com.ssl.crt;
            ssl_certificate_key  /etc/nginx/ssl/webmail.societe.com/webmail.societe.com.ssl.key;

            ssl_session_timeout  5m;

            ssl_protocols  SSLv3 TLSv1;
            ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
            ssl_prefer_server_ciphers   on;

            location ^~ /SOGo {
                    proxy_pass https://<ip_apache_mail>:443/SOGo/;
                    #proxy_redirect off;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    # re-write redirects to http as to https, example: /home
            }
    }

  • # je ne connais pas bien ngnix mais la 2 me semble mieux

    Posté par  . Évalué à 2.

    J'ai 2 solutions en tête :
    1 - Client -> Reverse Proxy Nginx (Machine A) -> Reverse Proxy Apache (Machine B) -> SOGo (Machine B)
    2 - Client -> Reverse Proxy Nginx (Machine A) -> SOGo (Machine B)

    la solution 1 me semble bien compliquée
    sachant que tu as sogo qui tourne sur le port 20000 sur machine B, pour l'instant uniquement sur localhost, il suffirait de faire la solution 2 en configurant sogo pour ecouter sur l'adresse IP de serveurB

    ainsi tu pourrais faire 2 choses :
    pour le client qui vient de l'exterieur, il arrive sur A et tu fais un proxypass vers machineB:20000
    pour un client qui vient de l'interieur, soit tu l'envoie aussi sur machineA, soit tu l'envoies direct sur machineB (via un DNS interne par exemple)

    • [^] # Re: je ne connais pas bien ngnix mais la 2 me semble mieux

      Posté par  . Évalué à 1.

      Pour la solution 2, le problème c'est que la conf Apache va taper dans des alias locaux avec GNUStep, du coup je ne sais pas comment faire la même conf sur un serveur distant.

      Merci quand même pour l'idée, j'essaierai si je n'en ai pas de meilleure ;)

  • # Proxy IMAP

    Posté par  . Évalué à 0.

    J'ai aussi une configuration avec un webmail SOGo.
    Pour séparer le serveur de webmail du serveur mail, j'ai plutôt utilisé un proxy IMAP.
    Cela marche très bien. Si cette piste t’intéresse, je peux te donner les détails de ma configuration.

Suivre le flux des commentaires

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