Reverse Proxy / Proxy inverso
Un reverse proxy es un servidor proxy instalado en el domicilio de uno o más servidores web. Todo el tráfico entrante de Internet y con el destino de uno de esos servidores web pasa a través del servidor proxy. Hay varias razones para instalar un «reverse proxy»:
- Seguridad: el servidor proxy es una capa adicional de defensa y por lo tanto protege los servidores web.
- Cifrado / Aceleración SSL: cuando se crea un sitio web seguro, habitualmente el cifrado SSL no lo hace el mismo servidor web, sino que es realizado por el «reverse proxy», el cual está equipado con un hardware de aceleración SSL (Security Sockets Layer).
- Distribución de Carga: el «reverse proxy» puede distribuir la carga entre varios servidores web. En ese caso, el «reverse proxy» puede necesitar reescribir las URL de cada página web (traducción de la URL externa a la URL interna correspondiente, según en qué servidor se encuentre la información solicitada).
- Caché de contenido estático: Un «reverse proxy» puede descargar los servidores web almacenando contenido estático como imágenes u otro contenido gráfico.
Configurando Apache como Reverse Proxy
Para poder utilizar el propio servidor web Apache como Proxy inverso, debemos tener compilados una serie de módulos. Los módulos básicos necesarios son los siguientes: mod_proxy, mod_proxy_http, mod_proxy_ftp, mod_proxy_connect, mod_proxy_html, mod_xml2enc y mod_headers.
Lo primero que deberíamos hacer es revisar cuales de estos módulos ya están compilados en nuestro servidor web apache, para ello al pasamos al binario httpd el parámetro -l
:
# httpd -l mod_headers.c mod_proxy.c proxy_connect.c proxy_ftp.c proxy_http.c
En este caso vemos que varios de ellos ya están compilados, hay que decir que mod_proxy integra el resto que véis ( proxy_connect, proxy_ftp y proxy_http). En caso de no tener mod_proxy compilado, deberíais hacerlo a través de la línea de compilación, y en caso de haber instalado apache por gestor de paquetes (yum, apt, etc) deberíais instalar el módulo correspondiente.
Partiendo entonces de la base que tenemos mod_proxy compilado, ahora deberíamos preparar los módulos mod_proxy_html y mod_xml2enc, que permiten reescribes las URLs en formato HTML (tipo mod_rewrite) hacia la ruta del proxy y dar soporte internacional (i18n) respectivamente.
Ámbos módulos se pueden descargar desde http://apache.webthing.com/mod_proxy_html/, una vez descargados podemos añadirlos a apache de forma sencilla mediante apxs de forma dinámica (DSO). Nos ubicamos en la carpeta en la que se encuentren los ficheros mod_proxy_html.c y mod_xml2enc.c y ejecutamos el siguiente comando (puede variar según ruta de apxs):
# /usr/local/apache/bin/apxs -I . -cia mod_proxy_html.c mod_xml2enc.c
Es posible que encontréis un problema relacionado con libxml, es debido a que para compilar el módulo se necesitan dichas librerías. Podéis hacer un include a dichas librerías con el parámetro -L o directamente hacer un enlace simbólico de forma temporal:
# /usr/local/apache/bin/apxs -L /usr/include/libxml2/libxml/ -I . -cia mod_proxy_html.c mod_xml2enc.c
O el enlace simbólico:
# ln -s /usr/include/libxml2/libxml/ .
Tras realizar este paso de forma satisfactoria, en nuestro fichero de configuración de Apache httpd.conf deberían aparecer como cargados ámbos módulos:
LoadModule proxy_html_module modules/mod_proxy_html.so LoadModule xml2enc_module modules/mod_xml2enc.so
Ahora añadimos también la carga del módulo xml:
LoadFile /usr/lib/libxml2.so LoadModule proxy_html_module modules/mod_proxy_html.so LoadModule xml2enc_module modules/mod_xml2enc.so
Este paso finalizaría la parte de compilación/instalación. Para la configuración es recomendable revisar todas las directivas posibles en la documentación oficial de apache. Nosotros vamos a configurar un ejemplo sencillo. Vamos a hacer que al acceder a https://rm-rf.es/google se acceda a google.es mediante proxy inverso.
Vamos a desactivar lo primero el Forward Proxy porque no lo utilizamos, podemos añadir la siguiente directiva seguido de los LoadModule anteriores:
ProxyRequests Off
El virtualhost con el proxy inverso configurado quedaría de esta forma:
<VirtualHost *:80> ServerName rm-rf.es DocumentRoot /xxx/xxx/xxx ServerAdmin xxx@xxxx UseCanonicalName Off CustomLog /xxxxx ScriptAlias /xxxxx <Location /google> SetOutputFilter proxy-html ProxyPass http://google.es/ ProxyHTMLURLMap http://google.es /google ProxyPassReverse http://google.es RequestHeader unset Accept-Encoding </Location> </VirtualHost>
Como veis, hemos añadido una nueva ubicación «Location» dentro del Virtualhost para especificar que ese es el punto desde el que se servirán las peticiones desde el proxy. Posteriormente mapeamos mediante ProxyPass la URL local contra la URL remota. La directiva ProxyPassReverse permite a apache ajustar la URL en las cabeceras HTTP Location, Content-Location y URI, mientras que ProxyHTMLURLMap es la directiva utilizada para hacer el rewrite de los enlaces HTML.
Finalmente hacemos un graceful o un syntax check (-t) a apache para recargar las configuraciones y verificar si el funcionamiento es correcto. Esta es una configuración básica de como utilizar mod_proxy para servir contenido, vuelvo a recomendar la revisión de la documentación para sacar el máximo partido a este servicio. Quizás en otro artículo explique como configurar este proxy reverso para servir contenido mediante SSL y otras curiosidades más.