Configurar Apache como Reverse Proxy (Proxy Inverso)

reverse proxy

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.

Definición Wikipedia

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.

Un comentario en “Configurar Apache como Reverse Proxy (Proxy Inverso)

  1. Hola,

    Estoy intentado configurar un proxy inverso en un debian squeeze pero la verdad es que estoy teniendo bastantes problemas y estoy bastante perdido.

    HE realizado la instalación con el apache, el módulo proxy html y después he cargado los de libxml2, éste último punto no tnego del todo claro si está bien instalado, aunque aparentement no dió error

    Lo que estoy intentado hacer poder abrir el acceso de una intranet para ser accesible des de fuera, y la idea es acceder a ésta con el proxy inverso y que éste haga las peticiones a las otras aplicaciones. El caso es que una vez dentro de la intranet con el proxy inverso tengo los siguientes problemas:
    – al intentar acceder a las aplicaciones con path relativo al mismo servidor que tengo la intranet me funciona bine (previamente he mapeado con proxyreverse cada una de las aplicaciones), pero la intentar acceer a otros recursos de otros servidores con paths absolutos http://servidor.local/aplicacionexterna me encuentro que no hace la traducció y logicmaente no puede resolver éste nombre
    – Además tengo problemas de charset con carácteres incorrectos
    – Al trabajar con todo el tráfico ssl aunque parece funcionar he detectado ciertos errores de paquetes tcp incorrectos en el firewall

    Si por ejemplo mapeo una aplicación sólo sin acceso a otros servidores me funciona todo perfecto, menos lo del ssl.

    Te agadecería si me pudieras orientar un poco de los pasos a seguir

    Gracias

Comments are closed.