El Web Proxy comúnmente conocido es aquel que los usuarios configuran en su navegador (si es transparente, no, pero eso es otro tema) para que cualquier petición HTTP a Internet sea enrutada a través del proxy.
Este tipo de Proxy se suele utilizar para controlar el acceso a Internet a los usuarios y también a modo de caché, para acelerar la navegación.
Un proxy inverso posibilita que un servidor Web sirva contenido de otro servidor Web de manera transparente, pero las peticiones llegan desde fuera.
Para entendernos, el proxy típico lo entendemos como de salida mientras que en el proxy inverso el concepto es el de entrada.
Podemos usar un proxy inverso para balancear las peticiones web que llegan a nuestro dominio entre varios servidores, también como caché, para añadir un capa intermedia entre los usuarios externos y mi servidor web con el fin de implementar seguridad o simplemente para proporcionar acceso a servidores web que no están directamente accesibles desde Internet.
En el esquema, el usuario remoto por sí mismo no tendría acceso ni a http://www.interno.com ni a http://www.protegido.com pero configurando un proxy inverso en http://www.example.com podemos proporcionarle acceso a ambos entornos.
Veamos cómo hacerlo usando Apache.
Necesitamos que el módulo mod_proxy esté cargado en el Apache, lo que podemos comprobar ejecutando «httpd -M» y deberemos ver una línea como esta:
proxy_module (shared)
Por ejemplo, lo que haremos es que las peticiones dirigidas a http://www.example.com/dentro sean redirigidas hacia http://www.interno.com
Para ello, dentro de la configuracion del VirtualHost correspondiente a www.example.com añadiremos:
ProxyPass /dentro/ http://www.interno.com/
Por tanto, cuando el usuario remoto haga la petición http://www.example.com/dentro/loquesea, el proxy, internamente y de manera tranparente al usuario la traducirá en http://www.interno.com/loquesea y será el proxy el que realice la petición al servidor interno.
Podemos evitar el acceso a determinados directorios del servidor interno usando «!«
Por ejemplo, con la siguiente configuración:
ProxyPass /dentro/restringido ! ProxyPass /dentro http://www.interno.com
evitaremos el acceso externo a http://www.interno.com/restringido
Por supuesto, podemos usar la directiva Location para agregar mayor seguridad. Por ejemplo:
ProxyPass /dentro/restringido ! ProxyPass /dentro/ http://www.interno.com/ <Location /dentro> Order Allow,Deny Allow from XXX.XXX.XXX.XXX ## También es posible configurar aquí autenticación, etc. </Location>
Si en la página www.interno.com existe alguna redirección, como por ejemplo www.interno.com/uno se redirige a www.interno.com/dos, necesitaremos usar además la directiva ProxyPassReverse que se encargará de modificar las cabeceras Location, Content-Location y URI antes de devolver la respuesta la usuario.
En el ejemplo que ponía, se dará cuenta de la redirección y la modificará convenientemente en http://www.example.com/dentro/dos
Siguiendo con la configuración que vamos creando, tendríamos:
ProxyPass /dentro/restringido ! ProxyPass /dentro/ http://www.interno.com/ ProxyPassReverse /dentro/ http://www.interno.com/ <Location /dentro> Order Allow,Deny Allow from XXX.XXX.XXX.XXX ## También es posible configurar aquí autenticación, etc. </Location>
Ahora bien, la directiva ProxyPassReverse sólo modifica las cabeceras anteriormente citadas. Si en la página www.interno.com existen enlaces absolutos, éstos no son modificados. Por ejemplo un enlace como este:
<a href="http://www.interno.com/fichero.html">
hará que el cliente externo, cuando pinche en él se salte el proxy y reciba un error de «Página no encontrada«.
También los enlaces de este tipo producirán errores:
<a href="/fichero.html">
funcionando únicamente los enlaces relativos de este tipo:
<a href="fichero.html">
Para solucionar este problema tenemos el módulo de Apache, mod_proxy_html disponible en Debian con el nombre libapache2-mod-proxy-html.
La directiva a configurar es ProxyHTMLURLMap, añadiendo a la configuración de nuestro VirtualHost:
ProxyHTMLURLMap http://www.interno.com /dentro
Con esto resolvemos el problema de los enlaces absolutos anteriormente citado pero para arreglar los enlaces relativos con la «/» inicial, haremos uso de Location.
Por tanto, y ya para terminar, la configuración del VirtualHost que veníamos construyendo quedaría:
ProxyPass /dentro/restringido ! ProxyPass /dentro/ http://www.interno.com/ ProxyPassReverse /dentro/ http://www.interno.com/ ProxyHTMLURLMap http://www.interno.com /dentro <Location /dentro> ProxyPassReverse / ProxyHTMLEnable On ProxyHTMLURLMap / /dentro/ Order Allow,Deny Allow from XXX.XXX.XXX.XXX ## También es posible configurar aquí autenticación, etc. </Location>
Para más información, Reverseproxies.
En honor al gran Super Coco:
:wq
Raul wrote:
muy bueno , excelente explicacion
Link | septiembre 13th, 2012 at 17:30