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?

Responder a Guindilla Cancelar respuesta

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.