1. Explicación Técnica
Apache posee un módulo,
libproxy.so, que posee la misma funcionabilidad que un proxy. Un Proxy es una máquina instalada en una red cuya funcion es conectarse a otra red, obtener informacion y entregarla a los clientes conectados al Proxy. Un proxy no es un Gateway ni un Router, aunque generalmente se le confunde. Un Router o un Gateway desvían paquetes TCP/IP de acuerdo a una serie de reglas, llamadas generalmente reglas de enrutamiento. Estas reglas funcionan en el nivel más básico de TCP/IP. Un proxy es un como un "router de alto nivel". No desvía paquetes y funciona como un intermediario de contenidos entre un cliente y una red.
[cliente1]
+[cliente2]
+
[ PROXY ]
[INTERNET][cliente3]
+
Cliente-(+)->PROXY PROXY --GET(*)
>WWW SERVER PROXY <
(*)
WWW SERVER Cliente<--(*)PROXY
Un servidor Web de una intranet, la gran mayoría de las veces esta conectado a Internet. Por ejemplo, la empresa X posee una i intranet y un servidor Web que sirve al dominio www.x.cl. Si un cliente externo desea acceder a la intranet de la empresa X (digamos, legalmente =) ) para revisar estadísticas internas, contactarse con algún agente, etc, debe haber un Router que haga que máquinas de la intranet "salga" de la intranet y sea visible desde el resto de Internet. Uno de los paquetes usados regularmente para esto es IPTABLES usando NAT. Esto no es dificil, pero siempre existe el problema que debe existir un Router por obligacion.
Volviendo a libproxy.so, este modulo permite que Apache haga una conexión entre dos máquinas, internet e intranet, de manera totalmente transparente para el cliente, haciendo más fácil el trabajo y así eliminando la necesidad de un Router.
+
[ INTRANET SERVER1 ]
[INTERNET]
[ WWW ]
+
[ INTRANET SERVER2 ]
+
[ INTRANET SERVER3 ]
[INTERNET] GET
>WWW
WWW (URL_RW)(*)
WWW
(GET)(P)(*)
>[ INTRANET SERVERX ]
WWW <
(*) [INTERNET]<
(*)
WWW
Como se ve en la figura, el servidor WWW hace una conexión vía HTTP a un computador de la intranet. Esto hace que las paginas FÍSICAMENTE no residan en el servidor, sino en un computador de la Intranet. (que es justamente la tarea de un proxy). Este tipo de conexión es totalmente transparente para el cliente.
Aquí es donde entra otro modulo de Apache. Se llama
mod_rewrite. Su tarea principal es reescribir las peticiones de acuerdo a cierto parámetro de búsqueda.
1.1 Reescribiendo URL (URL Rewrite)
Hay dos maneras de reescribir un URL:
- Client Rewriting: esta es la forma menos transparente de todas. Si un cliente HTTP se conecta, por ejemplo, a www.foo-bar.com, el servidor puede responder de varias maneras para reescribir el URL:
- usando Javascript y document.location
usando CGIs
HTML y contenidos META (Refresh)
reescribiendo las cabeceras usando PHP y la función header()
Suponiendo el mismo ejemplo:
[1] Cliente se conecta a http://www.foo-bar.com---[2] El servidor responde con un index.php
[3] El contenido de index.php es
[4] El cliente es redirigido a http://freehosting.foo.bar/users/free/dir1/index.html
- Server Rewriting: Es la forma más transparente. En vez de reescribir el URL en el cliente, el URL es transformado DENTRO del servidor. El servidor reinterpreta la conexión, hace la conexión donde FÍSICAMENTE residen las páginas y entrega el resultado al cliente.
Suponiendo el mismo ejemplo de www.foo-bar.com:
[1] El cliente se conecta a http://www.foo-bar.com---[2] El servidor detecta que debe haber una reescritura de URL
[3] Como el cliente no pide ninguna pagina, asume que es la pagina indice configurada en Apache o en su VirtualHost En este caso, index.html
[4] El servidor reinterpreta el URL : http://www.foo-bar.com/* = http://freehosting.foo.bar/users/free/dir1/*---[5] El servidor se conecta a http://freehosting.foo.bar/users/free/dir1/index.html---[6] Reacomoda las cabeceras y los contenidos del HTML para que pareciera que la conexión no sale del servidor
[7] Entrega la pagina index.html
El cliente no sabe que las paginas estan en freehosting.foo.bar/users/free/dir1 y todas las conexiónes del cliente son hacia http://www.foo-bar.com.
1.2 Está bien, pero de qué sirve?
(...la pregunta de mi jefe)
Esto brinda la siguientes soluciones:
- Olvidarse de aprender IPTABLES y NAT para que una máquina de la intranet se vea desde afuera
Poder mantener servidores dentro de una intranet o una DMZ
Poder realizar una granja de servidores donde todas las conexiónes se ven de manera transparente desde una intranet, DMZ o internet
La última solución propone el asunto de tener un Webcluster. Es decir, muchas máquinas sirviendo una sola página. Y la tarea de reescribir los URL se le encarga al servidor central.
[Nodo1]
+
[Nodo2]
+
[Nodo3]
+
<Cluster0 (Central)>
[INTERNET]
...
[Nodo_n]
+
<
URLRW
http://cluster.dominio------>
<
INTRANET
| |
INTERNET
>