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
Estuve mirando un poco diferentes reverse proxy para mi red, y finalmente me incliné por nginx. Es bastante más ligero que Apache y me resultó más sencilloy flexible.
http://www.guindilla.eu/blog/2006/12/31/deployement-nginx-reverse-proxy-my-network/
Pero bueno, a cada uno sus preferencias 🙂
Un saludo.
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?