Configurar un Reverse Proxy en Apache evitando errores con los enlaces HTML

El Web Proxy comúnmente conocido es aquel que los usuarios configuran en su navegador (si es transparente, no, pero eso es otro tema) para que cualquier petición HTTP a Internet sea enrutada a través del proxy.

Este tipo de Proxy se suele utilizar para controlar el acceso a Internet a los usuarios y también a modo de caché, para acelerar la navegación.

Un proxy inverso posibilita que un servidor Web sirva contenido de otro servidor Web de manera transparente, pero las peticiones llegan desde fuera.

Para entendernos, el proxy típico lo entendemos como de salida mientras que en el proxy inverso el concepto es el de entrada.

Podemos usar un proxy inverso para balancear las peticiones web que llegan a nuestro dominio entre varios servidores, también como caché, para añadir un capa intermedia entre los usuarios externos y mi servidor web con el fin de implementar seguridad o simplemente para proporcionar acceso a servidores web que no están directamente accesibles desde Internet.

Proporcionar conectividad con un proxy inverso

Proporcionar conectividad con un proxy inverso

En el esquema, el usuario remoto por sí mismo no tendría acceso ni a http://www.interno.com ni a http://www.protegido.com pero configurando un proxy inverso en http://www.example.com podemos proporcionarle acceso a ambos entornos.

Veamos cómo hacerlo usando Apache.

Necesitamos que el módulo mod_proxy esté cargado en el Apache, lo que podemos comprobar ejecutando “httpd -M” y deberemos ver una línea como esta:

 proxy_module (shared)

Por ejemplo, lo que haremos es que las peticiones dirigidas a http://www.example.com/dentro sean redirigidas hacia http://www.interno.com

Para ello, dentro de la configuracion del VirtualHost correspondiente a www.example.com añadiremos:

ProxyPass    /dentro/    http://www.interno.com/

Por tanto, cuando el usuario remoto haga la petición http://www.example.com/dentro/loquesea, el proxy, internamente y de manera tranparente al usuario la traducirá en http://www.interno.com/loquesea y será el proxy el que realice la petición al servidor interno.

Podemos evitar el acceso a determinados directorios del servidor interno usando “!

Por ejemplo, con la siguiente configuración:

ProxyPass    /dentro/restringido    !
ProxyPass    /dentro    http://www.interno.com

evitaremos el acceso externo a http://www.interno.com/restringido

Por supuesto, podemos usar la directiva Location para agregar mayor seguridad. Por ejemplo:

ProxyPass    /dentro/restringido    !
ProxyPass    /dentro/    http://www.interno.com/
<Location /dentro>
   Order Allow,Deny
   Allow from XXX.XXX.XXX.XXX
   ## También es posible configurar aquí autenticación, etc.
</Location>

Si en la página www.interno.com existe alguna redirección, como por ejemplo www.interno.com/uno se redirige a www.interno.com/dos, necesitaremos usar además la directiva ProxyPassReverse que se encargará de modificar las cabeceras Location, Content-Location y URI antes de devolver la respuesta la usuario.

En el ejemplo que ponía, se dará cuenta de la redirección y la modificará convenientemente en http://www.example.com/dentro/dos

Siguiendo con la configuración que vamos creando, tendríamos:

ProxyPass    /dentro/restringido    !
ProxyPass    /dentro/    http://www.interno.com/
ProxyPassReverse    /dentro/    http://www.interno.com/
<Location /dentro>
   Order Allow,Deny
   Allow from XXX.XXX.XXX.XXX
   ## También es posible configurar aquí autenticación, etc.
</Location>

Ahora bien, la directiva ProxyPassReverse sólo modifica las cabeceras anteriormente citadas. Si en la página www.interno.com existen enlaces absolutos, éstos no son modificados. Por ejemplo un enlace como este:

<a href="http://www.interno.com/fichero.html">

hará que el cliente externo, cuando pinche en él se salte el proxy y reciba un error de “Página no encontrada“.

También los enlaces de este tipo producirán errores:

<a href="/fichero.html">

funcionando únicamente los enlaces relativos de este tipo:

<a href="fichero.html">

Para solucionar este problema tenemos el módulo de Apache, mod_proxy_html disponible en Debian con el nombre libapache2-mod-proxy-html.

La directiva a configurar es ProxyHTMLURLMap, añadiendo a la configuración de nuestro VirtualHost:

ProxyHTMLURLMap http://www.interno.com /dentro

Con esto resolvemos el problema de los enlaces absolutos anteriormente citado pero para arreglar los enlaces relativos con la “/” inicial, haremos uso de Location.

Por tanto, y ya para terminar, la configuración del VirtualHost que veníamos construyendo quedaría:

ProxyPass    /dentro/restringido    !
ProxyPass    /dentro/    http://www.interno.com/

ProxyPassReverse    /dentro/    http://www.interno.com/

ProxyHTMLURLMap http://www.interno.com /dentro

<Location /dentro>
    ProxyPassReverse /

    ProxyHTMLEnable On
    ProxyHTMLURLMap  /      /dentro/

    Order Allow,Deny
    Allow from XXX.XXX.XXX.XXX
    ## También es posible configurar aquí autenticación, etc.
</Location>

Para más información, Reverseproxies.

En honor al gran Super Coco:

:wq

tags: ,
Escrito en Web por Ignacio Vazquez

Follow comments via the RSS Feed | Dejar un comentario | Trackback URL

1 Comment to "Configurar un Reverse Proxy en Apache evitando errores con los enlaces HTML"

  1. Raul wrote:

    muy bueno , excelente explicacion

Leave Your Comment

 
desdelaconsola.es