Herramientas de usuario

Herramientas del sitio


servidores:apache:apache_reverseproxy

Apache: configuración de reverse proxy

Por Félix Molinuevo, FMSI Sistemas de Informática

Introducción

Un Apache reverse proxy es utilizado para tener un servidor HTTP como frontend, redirigiendo las peticiones hacia otros (uno o más) que se encuentran detrás de él, no accesibles directamente desde afuera de la intranet.

Configuración inicial

Se debe activar el módulo mod_rewrite, que provee reescritura de URLs y el módulo proxy_http, que provee el servicio de reverse proxy:

a2enmod proxy_http
a2enmod rewrite

Obviamente, si no están instalados, hay que instalarlo previamente. Lo mismo si se desea un proxy reverso HTTPS, se debe instalar el módulo ssl, y configurar lo necesario en Apache.

Archivo de configuración de reverse proxy

Se debe editar un archivo /etc/apache2/sites-available/proxysrv con el siguiente contenido, activándolo luego:

NameVirtualHost *:80

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName host.dominio

        # Rerverse proxy. No usamos ProxyPass porque impide que mod_rewrite
        # funcione.
        ProxyRequests Off
        ProxyPassReverse / http://host.dominio/
        ProxyPreserveHost on

        # Este es un hack para incluir la REMOTE_ADDR en el header
        # X-Forwarded-For. (Resulta que RequestHeader no puede ver la
        # variable REMOTE_ADDR.)
        RewriteEngine On
#        RewriteCond %{REMOTE_ADDR} ^(.*)
#        RewriteRule ^. - [env=MY_REMOTE_ADDR:%1]
#        RequestHeader set X-Forwarded-For "%{MY_REMOTE_ADDR}e"
        # Esta línea es la que hace el reverse proxy.
        RewriteRule ^/(.*)$ http://host.dominio/$1 [P]

        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel info

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

        # Para solucionar errores:
        # Error reading from remote server
        SetEnv force-proxy-request-1.0 1
        SetEnv proxy-nokeepalive 1

</VirtualHost>

<VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName host.dominio
        ServerAlias host1.dominio host2.dominio host3.dominio

        # Rerverse proxy. No usamos ProxyPass porque impide que mod_rewrite
        # funcione.
        SSLProxyEngine On
        ProxyRequests Off
        ProxyPassReverse / https://host.dominio/
        ProxyPreserveHost on

        # Este es un hack para incluir la REMOTE_ADDR en el header
        # X-Forwarded-For. (Resulta que RequestHeader no puede ver la
        # variable REMOTE_ADDR.)
        RewriteEngine On
#        RewriteCond %{REMOTE_ADDR} ^(.*)
#        RewriteRule ^. - [env=MY_REMOTE_ADDR:%1]
#        RequestHeader set X-Forwarded-For "%{MY_REMOTE_ADDR}e"
        # Esta línea es la que hace el reverse proxy.
        RewriteRule ^/(.*)$ https://host.dominio/$1 [P]

        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel info

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

        SSLEngine On

        #   SSL Cipher Suite:
        #   List the ciphers that the client is permitted to negotiate.
        #   See the mod_ssl documentation for a complete list.
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

        #   Server Certificate:
        #   Point SSLCertificateFile at a PEM encoded certificate.  If
        #   the certificate is encrypted, then you will be prompted for a
        #   pass phrase.  Note that a kill -HUP will prompt again. A test
        #   certificate can be generated with `make certificate' under
        #   built time.
        #SSLCertificateFile conf/ssl/server.crt
        SSLCertificateFile /etc/apache2/ssl/server.pem

        SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

        # Para solucionar errores:
        # Error reading from remote server
        SetEnv force-proxy-request-1.0 1
        SetEnv proxy-nokeepalive 1

</VirtualHost>

Configuración de los servidores internos

Los servidores internos no necesitan tener configuración alguna especial para que funcionen con el proxy reverso. Sin embargo, los logs mostrarán la IP del proxy, en vez de la IP que realmente se está conectando.

Para solucionar eso, se debe agregar a la configuración de los mismos, por ejemplo en el httpd.conf, una línea como la siguiente:

LogFormat "%V (Intranet host: %h) %{X-Forwarded-For}i %l %u %t \"%r\" %s %b" common

La configuración exacta de esa línea va a depender de las necesidades del administrador, así como de la configuración del servidor. Para más información, se debe leer la documentación sobre la directiva LogFormat en el sitio de Apache.

servidores/apache/apache_reverseproxy.txt · Última modificación: 2009/03/11 09:03 por fmolinuevo