15.5. Caché transparente de web usando netfilter, iproute2, ipchains y squid

Esta sección nos la envió el lector Ram Narula de Internet para la Educación (Tailandia).

La técnica habitual para conseguir esto en Linux probablemente es usar ipchains DESPUES de asegurarse que el tráfico de "salida" del puerto 80(web) se dirige al servidor que ejecuta el squid.

Hay 3 métodos comunes para asegurarse de que el tráfico "saliente" del puerto 80 se envía al servidor que ejecuta el squid, y aquí vamos a introducir una cuarta.

Que el router pasarela lo haga por tí.

Si puede decirle a su pasarela que haga que los paquetes que salen hacia el puerto 80 sean enviados hacia la dirección IP del servidor squid.

PERO

Esto añadiría una carga adicional al router y algunos router comerciales podrían no soportarlo siquiera.

Usar un switch de capa 4.

Los switchs de capa 4 pueden gestionar esto sin problemas.

PERO

El coste de este equipamiento suele ser muy alto. Un switch de capa 4 típico normalmente costará más que el router típico + un buen servidor linux.

Usar un servidor caché como pasarela de la red.

Puede forzar que TODO el tráfico pase por el servidor caché.

PERO

Esto es muy arriesgado porque Squid utiliza gran cantidad de CPU y podría acabar ralentizando el rendimiento de la red entera o que el propio servidor se caiga, y nadie de la red podrá acceder a Internet si esto ocurre.

Linux+router NetFilter.

Con NetFilter se puede implementar otra técnica que usa NetFilter para "marcar" los paquetes con puerto de destino 80 e iproute2 para encaminar los paquetes marcados al servidor Squid.

|----------------|
| Implementación |
|----------------|

 Direcciones usadas
 10.0.0.1 naret (Servidor NetFilter)
 10.0.0.2 silom (Servidor Squid)
 10.0.0.3 donmuang (Router conectado a Internet)
 10.0.0.4 kaosarn (otro servidor de la red)
 10.0.0.5 RAS
 10.0.0.0/24 red principal
 10.0.0.0/19 red total

|---------------|
|Diagrama de red|
|---------------|

Internet
|
donmuang
|
------------hub/switch----------
|        |             |       |
naret   silom        kaosarn  RAS etc.
	
Primero, hagamos pasar todo el tráfico a través de naret asegurándonos de que es la pasarela por defecto excepto para silom. La pasarela por defecto de silom será donmuang (10.0.0.3) o crearíamos un bucle de tráfico.

(todos los servidores de mi red tienen como pasarela por defecto a 10.0.0.1, que era la anterior dirección IP del router donmuang, así que lo que he hecho es cambiar la dirección IP de donmuang a 10.0.0.3 y darle a naret la dirección ip 10.0.0.1)

Silom
-----
-configurar squid e ipchains
	

Configuramos el servidor Squid de silom, y nos aseguramos de que soporte proxy/caché transparente; el puerto por defecto suele ser 3218, de manera que se tiene que redirigir localmente todo el tráfico hacia el puerto 80 al puerto 3128. Esto se puede hacer con ipchains con lo siguiente:

silom# ipchains -N allow1
silom# ipchains -A allow1 -p TCP -s 10.0.0.0/19 -d 0/0 80 -j REDIRECT 3128
silom# ipchains -I input -j allow1
	

O, en el idioma de netfilter:

silom# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
	

(nota: podría tener otras entradas también)

Si desea más información sobre configuración del servidor Squid, por favor, remítase a la página de las FAQ de Squid en http://squid.nlanr.net).

Nos aseguramos de que este servidor tiene activo el reenvío de ip (forwarding) y de que su pasarela por defecto es el router donmuang (NO naret).

Naret
-----
-configurar iptables e iproute2
-desactivar los mensajes icmp REDIRECT (si es necesario)
	

  1. "Marca" con el valor 2 los paquetes con destino al puerto 80

    naret# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 \
     -j MARK --set-mark 2
    	      

  2. Configuramos iproute2 para que envíe los paquetes con la marca 2 a silom

    naret# echo 202 www.out >> /etc/iproute2/rt_tables
    naret# ip rule add fwmark 2 table www.out
    naret# ip route add default via 10.0.0.2 dev eth0 table www.out
    naret# ip route flush cache
    	      

    Si donmuang y naret están en la misma subred entonces naret no debería enviar mensajes icmp REDIRECT. En este caso, deberíamos desactivar los icmp REDIRECT así:

    naret# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
    naret# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
    naret# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
    	      

Hemos terminado el montaje, comprobemos la configuración

En naret:

naret# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       tcp  --  anywhere             anywhere           tcp dpt:www MARK set 0x2 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

naret# ip rule ls
0:      from all lookup local 
32765:  from all fwmark        2 lookup www.out 
32766:  from all lookup main 
32767:  from all lookup default 

naret# ip route list table www.out
default via 203.114.224.8 dev eth0 

naret# ip route   
10.0.0.1 dev eth0  scope link 
10.0.0.0/24 dev eth0  proto kernel  scope link  src 10.0.0.1
127.0.0.0/8 dev lo  scope link 
default via 10.0.0.3 dev eth0 

(hay que asegurarse de que silom aparece en una de las líneas anteriores,
en este caso es la línea con 10.0.0.0/24)

|-------|
|-HECHO-|
|-------|
	

15.5.1. Diagrama de flujo del tráfico tras la implementación


|----------------------------------------------------|
|Diagrama de flujo del tráfico tras la implementación|
|----------------------------------------------------|

INTERNET
/\
||
\/
-----------------router donmuang---------------------
/\                                      /\         ||
||                                      ||         ||
||                                      \/         ||
naret                                  silom       ||
*tráfico hacia el puerto 80==========>(caché)      ||
/\                                      ||         ||
||                                      \/         \/
\\===================================kaosarn, RAS, etc.

Tengan en cuenta que la red es asimétrica ya que hay un salto extra en la ruta general de salida.

Este es el camino seguido por los paquetes que atraviesan la red desde
kaosarn hacia y desde Internet.

Tráfico web/http:
consulta http de kaosarn->naret->silom->donmuang->internet
respuestas http desde Internet->donmuang->silom->kaosarn

consultas no web/http (ej: telnet):
datos salientes de kaosarn->naret->donmuang->internet
datos entrantes de Internet->donmuang->kaosarn