Llegados a este punto, se han abarcado algunos de los módulos más interesantes que pueden utilizarse en un servidor web Apache, en esta ocasión se hablará sobre otro módulo que me parece muy útil e interesante, se trata de Mod_Proxy. Este módulo, tal como su nombre lo indica permite crear conexiones de tipo “proxy” esto quiere decir que una conexión entre dos entidades no se realiza de forma directa, sino que en su lugar hay un elemento intermedio por el que pasan todos los paquetes de datos. En algunas publicaciones anteriores en este blog, se ha hablado del uso de túneles SSH para la redirección del trafico entre distintas máquinas, existiendo túneles locales y remotos, pues la filosofía de Mod_Proxy es bastante similar, si bien no es tan robusto y potente como las mencionadas características de SSH, se trata de un módulo bastante útil en determinadas situaciones.
NOTA: He escrito una serie de publicaciones sobre SSH hace algunos meses, la publicación concreta sobre túneles se puede ver aquí: https://thehackerway.com/2011/08/19/
En primer lugar, es importante comprender que existen muchas formas de implementar un proxy y que dependen directamente del protocolo, en el caso de este módulo de Apache, los protocolos soportados son AJP, FTP, CONNECT y HTTP (desde la versión 0.9 incluyendo la versión 1.1). Dado que existen varios protocolos soportados por este módulo, existen diferentes implementaciones, es decir, el mismo módulo incluye soporte para cada uno de estos protocolos de forma independiente y se debe cargar cada “sub-módulo” de la misma forma. Todo esto quiere decir, que para utilizar Mod_Proxy, es necesario cargar el módulo principal (mod_proxy) y posteriormente cada submodulo que se desee utilizar. Sin embargo la diversión no termina aquí, algunos de los módulos más utilizados en un servidor apache (como por ejemplo mod_ssl, que se ha visto en una publicación anterior), al igual que otros módulos son soportados y extendidos en este módulo, tales como mod_rewrite y mod_cache.
Antes de continuar describiendo el uso de mod_proxy con algunos ejemplos, es importante resaltar que existen dos tipos de proxies claramente diferenciados, que aunque cumplen con los mismos objetivos, pero su forma de hacerlo es un poco diferente:
- Forward Proxy: Este modo de proxy es uno con el que seguramente muchos usuarios que trabajan en organizaciones se encuentran familiarizados, ya que es comúnmente implementado para proveer acceso al exterior por medio de un firewall o algún mecanismo de seguridad restrictivo. El funcionamiento de este tipo de proxy consiste en que el cliente realiza una petición a un servidor web que llamaremos “destino”, para ello utiliza el proxy, el cual se encarga de recibir la dirección del servidor “destino” desde el cliente y redirecciona la petición hacia el servidor “destino”, finalmente recibe la respuesta de dicho servidor y la reenviá al cliente. Como puede apreciarse, se trata simplemente de un intermediario en la comunicación. En este tipo de proxy, el cliente necesita estar correctamente configurado para utilizar el proxy forward.
- Reverse Proxy: Siguiendo el mismo modelo anterior, este tipo de proxy es un mero intermediario entre cliente y servidor, sin embargo, en este caso, el cliente realiza peticiones al proxy y el proxy trata dichas peticiones de forma interna, el cliente simplemente recibe las respuestas como si estas provinieran del servidor real, esto quiere decir, que el proxy se encarga de hacer las redirecciones a otros servicios de forma interna y transparente para el cliente (o mejor, invisible). El cliente solamente realizará peticiones al proxy y recibirá respuestas, pero realmente no sabe cual es el origen real de dicha respuesta. Este tipo de proxy también es conocido como gateway y es bastante común su uso en el caso de implementar balanceadores de carga, servidores de cache o simplemente como “wrapper” para otros servicios. Para aquellos que han leído las publicaciones que he escrito sobre anonimato hace algunos meses, seguramente este modelo les recodará al funcionamiento de los circuitos en TOR o en I2P.
Espero que la explicación anterior sea clara, en cualquier caso, la clave para comprender las diferencias entre ambos tipos de proxy consiste en saber que en el tipo forward el cliente conoce el proceso de redirección que ejecutará el proxy, es decir, el cliente sabe perfectamente cual es el destino de tu petición, mientras que con el tipo reverse el cliente realiza una petición al proxy, pero desconoce lo que el proxy hace con su petición, para el cliente es como realizar una petición estándar a un servidor cualquiera, es por este motivo que este tipo de proxy es también conocido como gateway o transparente y el cliente no requiere ningún tipo de configuración para usarlo, mientras que en el caso del proxy forward, es necesario que el cliente establezca una configuración para poder usarlo.
Definidos estos conceptos, es el momento de indicar el proceso de instalación del módulo y listar el uso de las directivas más interesantes en este módulo.
INSTALACIÓN DE MOD_PROXY
Al igual que otros módulos de apache que se han explicado en esta serie de publicaciones, para instalar MOD_PROXY es necesario emplear la herramienta APXS incluida en los binarios de Apache y generar los correspondientes ficheros *.so ubicados en el directorio raíz del servidor ejecutar:
>bin/apxs -a -i -c modules/proxy/mod_proxy.c modules/proxy/proxy_util.c |
En este caso estoy utilizando la versión 2.2.22 de Apache httpd y en dicha versión los ficheros fuente del módulo se encuentran ubicados en el directorio modules/proxy. Si este proceso ha funcionado correctamente, es el momento de compilar e instalar otras extensiones del módulo para los protocolos anteriormente mencionados.
>bin/apxs -a -i -c modules/proxy/mod_proxy.c modules/proxy/proxy_util.c modules/proxy/mod_proxy_ajp.c modules/proxy/ajp_utils.c modules/proxy/ajp_header.c modules/proxy/ajp_msg.c modules/proxy/ajp_link.c modules/proxy/mod_proxy_http.c modules/proxy/mod_proxy_balancer.c modules/proxy/mod_proxy_connect.c modules/proxy/mod_proxy_ftp.c modules/proxy/mod_proxy_scgi.c |
Con este comando se instalarán las extensiones disponibles de Mod_Proxy en el servidor web, los módulos generados tras la ejecución de los dos comandos anteriores (ficheros *.so) son ubicados de forma automática en el directorio modules/
Ahora, para probar que la instalación ha sido correcta, es el momento de cargar los módulos en el servidor web utilizando el fichero de configuración principal.
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so |
Si el servidor web arranca correctamente, indica que el módulo se ha cargado.
DIRECTIVAS EN MOD_PROXY
Una vez instalado el módulo, ya se puede comenzar a aplicar las directivas que hacen toda la “magia”, sin embargo, hay que comprender en primer termino cuales son las directivas que permiten establecer los dos tipos de proxy que se han descrito anteriormente (forward y reverse).
Un tipo de proxy forward puede definirse del siguiente modo:
ProxyRequests On
ProxyVia On <Proxy *> Order deny,allow Deny from all Allow from 192.168.17.0/24 </Proxy> |
De esta forma definimos un proxy del tipo forward, donde todas las peticiones serán tratadas por el proxy y solamente se admitirán a los clientes que pertenezcan al segmento de red 192.168.17.*
Un ejemplo de definición de un proxy reverso es:
ProxyPass /hack/ http://localhost:82/Hackademic_Challenges/
ProxyPassReverse /hack/ http://remote-server/Hackademic_Challenges/ |
Con este ejemplo se crea un proxy reverso que admitirá peticiones de cualquier cliente y cuando se solicite el recurso “/hack/” el proxy realizará una redirección al recurso http://localhost/Hackademic_Challenges/. Seguramente hasta este punto el lector comenzará a relacionar los proxies reversos con el módulo “mod_rewrite” y en efecto, no se equivoca en su relación, ya que funcionalmente, existen pocas diferencias.
Las directivas utilizadas en los ejemplos anteriores, se describen a continuación:
ProxyRequests
Tal y como se ha indicado en lineas anteriores, esta directiva permite establecer si el proxy actuará como un proxy de tipo “forward” o no. En el caso de que su valor sea On, Apache automáticamente habilitará el modulo mod_proxy en modo “forward”.
ProxyVia
El Header HTTP “via” tal como se define en el estándar del protocolo HTTP, es utilizado en las peticiones HTTP para informar al servidor lo proxies mediante los cuales ha pasado la petición enviada por el cliente. En este caso, esta directiva permite controlar este campo de las peticiones realizadas por los clientes. Los valores de esta directiva son:
Off: No se aplica ningún tipo de procesamiento si una petición o respuesta HTTP contiene el Header “Via”.
On:Indica que cada petición y respuesta tendrá el header “Via” con la información del proxy por el que esta pasando la petición
<Proxy>
Tal como se ha indicado en lineas anteriores, esta directiva permite establecer los contenidos y las reglas que van a ser tratados por el proxy. Es una directiva muy similar a la directiva <Directory> de Apache en donde se admiten otras directivas de acceso a los contenidos tales como Order, Deny y Allow
ProxyPass
Esta directiva es de vital importancia cuando se intenta crear un “reverse” proxy, ya que permite mapear recursos a servidores externos de forma local, es decir, un recurso que se encuentra ubicado en un servidor remoto, puede ser accedido por un cliente de forma local, de este modo el proxy actúa como un “mirror”. A lo mejor esta definición resulta compleja, pero en realidad el concepto es muy simple, un cliente realiza una petición a un recurso y esta directiva se encarga de redirigir la petición a otro recurso que se encuentra en otro servidor (o incluso en el mismo servidor local) de forma que el cliente no sabe realmente a donde va destinada su petición, ya que el proxy reverso se encarga de procesar tanto la petición como la respuesta al recurso externo.
ProxyPassReverse
Se trata de otra directiva que es esencial para el uso de proxies reversos, ya que se encarga de establecer la URL en los headers HTTP: Location, Content-Location y URI en las respuestas HTTP por redirección (tipicamente código HTTP 302). Esto es muy importante ya que la modificación de estas cabeceras que realiza esta directiva, evita que por medio de las redirecciones HTTP que realice el objetivo (backend) se pueda evadir el proxy. El funcionamiento de esta directiva es prácticamente igual al funcionamiento de la directiva ProxyPass ya que se encarga de realizar la redirección de un recurso local (que se comporta realmente como espejo) a otro recurso externo, ademas, su uso es perfectamente compatible con la directiva ProxyPass.
En el ejemplo anterior se tenia lo siguiente:
ProxyPass /hack/ http://remote-server/Hackademic_Challenges/
ProxyPassReverse /hack/ http://remote-server/Hackademic_Challenges/ |
No solamente va ha hacer el mapeo de http://local-server/hack apuntando al backend http://remote-server/Hackademic_Challenges/ sino que ademas, cualquier redirección producida en el backend será reflejada en el “espejo”, por ejemplo, si el servidor remoto realiza una redirección cuando se invoca la URL anterior a la URL http://remote-server/Hackademic_Challenges/others/resources de forma automática, el funcionamiento de esta directiva, será establecer la URL local http://local-server/hack/others/resources antes de entregar la respuesta HTTP al cliente.
Próximamente, explicaré un poco más sobre otros aspectos interesantes de este módulo.
Muchas gracias 😀
Me gustaMe gusta
Excelente muy buena explicacion, gracias
Me gustaMe gusta