Apache Reverse Proxy

Esta semana me tope con la tarea de levantar un Reverse Proxy, buscando info, vi que no había muchas explicaciones claras al respecto, así que a modo de registro, voy a aprovechar a levantar un pequeño post dedicado a esto.

Como bien sabemos todos Apache es un Servidor WEB de código abierto, el cual nos permite varias tareas, las cuales a largo plazo iré detallando.

¿Qué es un Reverse Proxy?

Sin dar más vueltas es un Apache el cual se sitúa entre el cliente y el Server Original. De esta forma cuando el cliente manda una consulta, esta llega al Server que actúa como Proxy y este envía de forma interna la consulta al Server Original, devolviéndole la información solicitada al cliente. A esta funcionalidad también se la conoce como “gateway”. Esta funcionalidad permite redireccionar diferentes servidores a través de una sola URL.
Este Reverse Proxy, es activado utilizando la directiva ProxyPass.

Dejemos de dar vueltas y vayamos directo al grano, que es la configuración propiamente dicha.

Vale aclarar que el ejemplo que voy a trabajar es sobre Debian, por lo tanto los paquetes a instalar pueden llegar a variar con las diferentes distros.

Instalación:

#apt-get install apache2 libapache2-mod-proxy-html
#a2enmod proxy_http (esto activa los modulos proxy y proxy_http en un solo comando)
#a2enmod ssl (esto lo vamos a necesitar si hacemos la configuración de Apache en HTTPS)

Configuración:

Supongamos que tenemos un dominio llamado www.estoesunaprueba.com (si como pueden ver sigo tan creativo como siempre). Cuando colocamos este dominio en nuestro navegador, si nuestros tan amados servidores de DNS nos ayudan, deberemos llegar a nuestra IP WAN. Con una regla de NAT redireccionaremos entonces el tráfico que llegue al puerto 80 y 443 hacia nuestro Apache que trabajará como Proxy bajo la IP 192.168.1.200.

En nuestro Apache, tenemos que configurar entonces 2 VirtualHost, uno para HTTPS y otro para HTTP. Para hacer esto vamos a efectuar estos pasos (no se preocupen si no saben mucho de VirtualHost, ya lo veremos en otra oportunidad):

  • Crear un archivo en blanco con un nombre que identifique al dominio (en mi caso va a ser prueba y ssl-prueba)
  • Dentro de prueba, que va a ser quien represente nuestro Proxy HTTP, colocaremos la siguiente información:

<VirtualHost *:80>

ServerName estoesunaprueba.com

ProxyPreserveHost on (Esta linea en ON hace que cuando la consulta llega al Proxy, este mantenga el nombre de la consulta y no el definido en ProxyPass. En mi caso mantiene el nombre estoesunaprueba.com en lugar de mostrar la IP 192.168.1.110 junto a su puerto)
ProxyPass / http://192.168.1.110:8885/news (la primera / indica que como el home de acceso va a tomar lo que definamos después que en mi caso significa que al acceder con el navegador, entre directamente al directorio news que tengo configurado en el Servidor WEB original)
ProxyPassReverse / http://192.168.1.110:8885/news (esta opción permite ajustar la URL en los headers de la consulta HTTP. Es importante ponerla junto a ProxyPass)
</VirtualHost>

  • Dentro de ssl-prueba, que va a ser quien conecte via HTTPS, colocaremos la siguiente información:

<VirtualHost *:443>

ProxyPreserveHost On
ProxyPass / http://192.168.1.110:8885/news
ProxyPassReverse http://192.168.1.110:8885/news

ServerName estoesunaprueba.com

SSLProxyEngine On (Activa al proxy para que funcione con ssl, opr eso cargamos el modulo anteriormente)
SSLEngine on (Modulo de ssl propiamente dicho activo)
SSLCertificateFile    /etc/apache2/ssl/cert.crt (Certificado para ssl)
SSLCertificateKeyFile /etc/apache2/ssl/cert.key (Key para ssl)

</VirtualHost>

Creación de Certificados:

#genrsa -out cert.key 2048
#openssl req -new -key cert.key -out cert.csr
#openssl x509 -req -days 3650 -in cert.csr -signkey cert.key -out cert.crt

Estos archivos, hay que copiarlos en el directorio que estamos especificando en las lineas SSLCertificateFile y SSLCertificateKeyFile.

Finalizando:

Para terminar, reiniciamos el Apache:

#service apache2 restart

Al poner en nuestro navegador la dirección www.estoesunaprueba.com, ingresaremos a nuestro server 192.168.1.110 de forma totalmente transparente.

Observaciones:

En la linea ProxyPass le cargue un puerto, esto se lo puse a modo de ejemplo para aclarar que si por algún motivo de seguridad, poseen un servidor WEB corriendo sobre cualquier puerto, al definirlo en el ProxyPass, Apache va a buscar la información a la IP:Puerto/Directorio especificado y nosotros en nuestro navegador, no veremos nada mas que el dominio, sin saber que puerto es el que esta a la escuchad el otro lado, para nuestro navegador, siempre sera el 80 o 443 quien responda, independientemente de los puertos internos que posea cada Web Server.

Espero les sea de utilidad =)