Proxy inverso en Apache

El problema es sencillo de enunciar, pero no tan facil de resolver. Tengo un servidor A con IP pública,
al que puedo editar sus archivos de configuración. Desde el servidor A se puede acceder a otro interno, privado,
al que llamaré B. No es posible acceder a B directamente (desde fuera). ¿Cómo configuro A para que haga las veces de reverse-proxy? Es decir, quiero que lo que un cliente (navegador Firefox, por ejemplo) pida a A con una determinada dirección de carpeta, por ejemplo, http://A/carpeta , sea redirigido (por el propio servidor A) a la ruta http://B/carpeta y el resultado de esa llamada sea devuelto al cliente Firefox.


Cliente <--> Servidor IP pública (A) <-> Servidor IP Privada (B)

Esto tal cual no parece difícil y se puede hacer activando el módulo proxy_http de Apache. Pero en micaso, al probarlo, me encontré con otro problema añadido: las páginas que B devuelve a A y éste finalmente al cliente Firefox, incluyen código HTML con enlaces a B. Como ya he dicho, desde el cliente Firefox no podemos acceder directamente a B, así que esto era de verdad un problema… hasta que encontré el módulo proxy_html_module, que reescribe en Apache el contenido de las páginas antes de entregarlas 🙂

El módulo proxy_html_module hay que instalarlo (los demás están disponibles en Apache 2 de serie, al menos en Ubuntu):


$ sudo apt-get install libapache2-mod-proxy-html

Así que, en resumen, el problema enunciado se resuelve así:

1) Activar los módulos necesarios en Apache


$ sudo a2enmod proxy_http_module
(tiene una dependencia con proxy_module que se resuelve ‘automágicamente’)
$
$ sudo a2enmod proxy_html_module

2) Activar el acceso al Proxy para localhost o la IP del servidor A (si no, toda petición será rechazada)


$ sudo vi /etc/apache2/mods-available/proxy.conf

AddDefaultCharset off
Order deny,allow
Deny from all
Allow from localhost # o en su lugar, la IP pública

3) Definir las redirecciones que nos interesen:

$ sudo vi /etc/apache2/sites-enabled/000-default
ProxyPass /carpeta/ http://B/carpeta/
ProxyHTMLURLMap http://B/carpeta /carpeta
#

ProxyPassReverse /
SetOutputFilter proxy-html
ProxyHTMLExtended On

Más info en el manual de Apache 2 al respecto de ProxyPassReverse y en la guía de mod_proxy_html

3 comentarios sobre “Proxy inverso en Apache”

  1. Una cuestión sobre este tema… ¿Se puede entonces enmascarar 2 servidores?

    Les comento mi situación. Tengo varios dominios que administrar y vamos a evolucionar desde un servidor IIS a varios servidores con IIS y Apache. Unos dominios irán a parar a unos y otros al otro. Pero tengo solo 1 ip pública. Mi cuestión es que necesito que el apache que haga proxy reverse pueda discernir las llamadas a los dominios: http://www.fulanito.com y me los envíe al servidor de IIS y los que sea: http://www.zutanito.com; me los reenvie al otro servidor.Teniendo solo la redirección al puerto 80 el servidor que realice el proxy reverse.

    ¿El caso es posible?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.