jueves, 17 de julio de 2008

Configurando WCCPv2 en un cisco 3725 con squid-2.7.STABLE3 corriendo sobre FreeBSD-6.3

Este how-to describe los pasos necesarios para la configuración de WCCP versión 2.0 con un router CISCO 3725 en combinación con un Squid-2.7.STABLE3 ejecutándose sobre un FreeBSD-6.3.

El WCCP (Web Cache Control Protocol) versión 2 de Cisco es usado para el envío de peticiones Web desde los clientes a uno o mas servidores proxy. La función del WCCP es que nos permite redireccionar el trafico de la web hacia nuestros servidores proxies, en los que prestaremos de servicios de cache, filtros de contenidos, políticas de consumo de ancho de banda, u otros servicios, lo cual nos ayudaría a economizar nuestros enlaces.

Con WCCP, podemos crear un "cluster de cache" para lograr un mejor balance de carga. Por ejemplo, en el caso de tener dos servidores proxies, si uno de los dos falla, por alguna razón, el WCCP redireccionara todo el trafico hacia el segundo, evitando así interrupciones en el servicio. En el caso extremo que los dos servidores de cache, fallen, el WCCP determinara los proxies como "muertos" y enrrutara directamente todas las peticiones a través de sus interfaces.
NOTA: Solo la versión CISCO IOS Release 12.1 o anteriores permiten usar las versiones 1.0 (WCCPv1) o la 2.0 (WCCPv2) de WCCP.


Como funciona WCCP y navegación transparente con Squid?

- Un cliente hace una petición hacia la web, esta va directo al router.
- El router intercepta la peticion.
- El router redirecciona la petición a una nueva ubicación dentro de un marco de enrrutamiento de encapsulamiento genérico (generic routing encapsulation GRE) para prevenir cualquier modificación en el paquete original.
- El túnel (GRE) se establece entre el servidor proxy y el router cisco.
- Todas las peticiones redireccionadas desde el router son encapsuladas bajo el túnel hacia la cache en el FreeBSD.
- El FreeBSD desencapsula el trafico en el GRE y redirecciona los paquetes de WCCP hacia el Squid.
- El redireccionamiento se logra transparentemente usando el Reenvío de Paquetes (IP Forwarding) y el cortafuegos IPFW.
- El squid separa la petición y entonces la reenvía, así sea a un servidor cache padre o directamente a al destino.
- La respuesta a la petición es enviada a través del router al cliente que la origino.

Ahora para armar todas las piezas para el funcionamiento del WCCP, en conjunto con el Squid, se seguirán los siguientes pasos:

- inicialmente necesitamos incluir las fuentes de nuestro kernel en el sistema.

# sysintall
Entrar en la Opción
Configure
Distributions
src
sys
Chose Media
CD/DVD

deje que termine el proceso de inclusión de las fuentes de lo relacionado a "sys", cuando este proceso termine entonces haremos lo siguiente

1.- lo primero sera configurar y recompilar el kernel, para adicionarle soporte para el ip_forward, ipfw.

# cd /usr/src/sys/i386/conf/

hacer una copia del archivo original para modificarlo y ponerlo a nuestro gusto
# cp GENERIC SQUID_WCCP

# nano SQUID_WCCP

2.- con el editor preferido editar el archivo que creamos y adicionarle las siguientes lineas

options IPFIREWALL #firewall
options IPFIREWALL_VERBOSE #enable logging to syslogd(8)
options IPFIREWALL_FORWARD #enable transparent proxy support
options IPFIREWALL_VERBOSE_LIMIT=500 #limit verbosity
options IPSTEALTH #support for stealth forwarding
options DUMMYNET
options NETGRAPH
options DEVICE_POLLING
options HZ=1000

options SHMSEG=128
options SHMMNI=256
options SHMMAX=50331648 # max shared memory segment size (bytes)
options SHMALL=16384 # max amount of shared memory (pages)
options MSGMNB=16384 # max # of bytes in a queue
options MSGMNI=48 # number of message queue identifiers
options MSGSEG=768 # number of message segments
options MSGSSZ=64 # size of a message segment
options MSGTQL=4096 # max messages in system

3.- Configurar y compilar el nuevo kernel
(a.) config SQUID_WCCP
(b.) cd ../compile/SQUID_WCCP/
(c.) make cleandepend
(d.) make depend
(e.) make
(f.) make install
(g.) reboot
Si no hubo errores en nada, entonces todo salio bien, reinicie el servidor con su nuevo kernel.
4.- crear en el FreeBSD el túnel hacia el router.
ifconfig gre0 create
ifconfig gre0 IP.DE.SQUID.BOX 10.20.30.40 netmask 255.255.255.255 link2 tunnel IP.DE.SQUID.BOX IP.DE.CISCO.ROUTER up

4.) compilar squid y configurarlo para que trabaje con WCCP.

(a.) descargar los fuentes del squid desde el sitio oficial
# cd /usr/local/src/
# wget http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE3.tar.gz
(b.) descompactar el paquete
# tar -zxf squid-2.7.STABLE3.tar.gz
(c.) configurar y compilar
# ./configure --prefix='/usr/local' --sbindir='/usr/local/sbin' --bindir='/usr/local/sbin' --datadir='/usr/local/etc/squid' --sysconfdir='/usr/local/etc/squid' --libexecdir='/usr/local/libexec/squid' --localstatedir='/usr/local/squid' --enable-removal-policies='lru heap' --enable-basic-auth-helpers='NCSA PAM SMB' --enable-auth='basic ntlm digest' --enable-digest-auth-helpers='password' --enable-external-acl-helpers='ip_user session unix_group wbinfo_group' --enable-ntlm-auth-helpers='SMB' --enable-storeio='ufs diskd null' --disable-ident-lookups --enable-kqueue --enable-default-err-language='Spanish' --enable-snmp --enable-largefile --enable-ipfilter --enable-wccpv2 --enable-icmp --enable-arp-acl --enable-delay-pools --disable-wccp
# make all
# make install
(d.) editar el archivo de configuración del squid y poner estas lineas
# nano /usr/local/etc/squid/squid.conf

wccp2_router IP.DE.CISCO.ROUTER
wccp2_forwarding_method 1
wccp2_return_method 1
wccp2_service standard 0

(4.) Crear las reglas del firewall para redireccionar las peticiones web que llegan vía GRE hacia el puerto de trabajo del squid (3128).
Vamos crear un archivo llamado rc.firewall para salvar las reglas del IPFW. Se puede usar el script siguiente, ajustando sus direcciones IP.

#!/bin/sh
##### Inicio de rc.firewall ######
NET_IF="rl0"
IPFW="/sbin/ipfw -q"
#IP del Proxy
IF_ADDR="192.168.1.2"
ROUTER_IP="192.168.1.1"
PROXY_NET="192.168.1.0/24"
PROXY_PARENT="192.168.0.1"
ALL_NET="192.168.2.0/24"
CLIENT_NET="192.168.3.0/24"
ADMIN_NET="192.168.1.10"
SSH_PORT="4554"
LOCALHOST="127.0.0.1"
$IPFW -f flush
$IPFW add allow all from any to any via lo0
#$IPFW add allow all from any to any
$IPFW add allow gre from any to any frag
#$IPFW add deny ip from any to any frag
$IPFW add fwd 127.0.0.1,3128 tcp from any to any 80 via gre0 in
$IPFW add fwd 127.0.0.1,3128 ip from any to any via gre0 in
$IPFW add fwd 127.0.0.1,3128 tcp from any to any 80 in
$IPFW add fwd 127.0.0.1,3128 tcp from any to any http in via gre0
$IPFW add allow tcp from any 80 to $PROXY_NET in
$IPFW add allow all from $ROUTER_IP to $IF_ADDR
$IPFW add allow all from $IF_ADDR to $ROUTER_IP
$IPFW add allow gre from $ROUTER_IP to $IF_ADDR
$IPFW add allow all from $IF_ADDR to any
#Allow local DNS caching
$IPFW add allow udp from $ALL_NET to any 53
$IPFW add allow udp from any 53 to $IF_ADDR
$IPFW add allow tcp from any 53 to $IF_ADDR
$IPFW add allow all from any to any out via $NET_IF

#Permitir Consultas DNS
$IPFW add allow udp from $ALL_NET 53 to $IF_ADDR
#For Proxy access
$IPFW add allow tcp from $ALL_NET to any 3128 in via $NET_IF

##### Permitir Conexiones Establecidas
$IPFW add allow tcp from any to any in via $NET_IF established
# Para consultas ICP
$IPFW add allow UDP from $PROXY_PARENT to $PROXY_NET 3130
$IPFW add allow UDP from $PROXY_NET to $PROXY_PARENT 3130
####### Para SSH
$IPFW add allow tcp from $ADMIN_NET to $IF_ADDR $SSH_PORT
#Para SNMPWALK desde el administrador
$IPFW add allow udp from $ADMIN_NET to me 3001
$IPFW add allow udp from $ADMIN_NET to me 161
$IPFW add allow udp from $ADMIN_NET to me 161
$IPFW add allow udp from $LOCALHOST to me 3001
$IPFW add allow udp from $LOCALHOST to me 161
###########
$IPFW add allow ICMP from $ALL_NET to any
#################################################
# Permitir TODO desde el administrador
$IPFW add allow all from $ADMIN_NET to me
$IPFW add allow all from me to $ADMIN_NET
$IPFW add 65533 deny log all from any to any
############# End of rc.firewall ###############

5.- Habilitar WCCP en el router Cisco
Global Configuration
Router (config)# ip wccp version 2
Router (config)# ip wccp web-cache redirect-list 160
Access-List 160
permit ip 192.168.0.0 0.0.0.255 any
Router (config)# interface fastethernet 0/0
Router(config-if)# ip wccp web-cache redirect in
Router# write
Final de la configuracion de WCCP para router Cisco

6.- Habilitar el ip_forwarding en systcl.conf

agregar estas lineas en /etc/sysctl.conf

net.inet.ip.forwarding=1
net.inet.ip.fastforwarding=1

7.- Reiniciar el squid y recargar las reglas del IPFW. Si no hay ningun error, entonces ya tiene trabajando su servidor proxy resondiendo peticiones a traves del GRE y usando el WCCP de su router Cisco

Happy Proxying with Squid + FreeBSD + Cisco WCCP !!!

3 comentarios:

Yosvany dijo...

Hola Aldo he visto tu blog en internet y dije pues le escribo algo. Soy Yosvany el que te impartió clases de psicología en el pedagógico de tu misma carrera, Vigotsky ahora si te acuerdas no? jejejejje nada que estoy por España viviendo hace casi tres años, espero me cuentes cosas de allí mi correo yosvanylopez@hotmail.es
saludos

Yosvany dijo...

Hola Aldo que tal estas? Soy Yosvany el que estudió Electrica en el pedagógico igual que tu que te imparti clases de psicología, soy Vigotsky jejejeje nada que he visto tu blog en internet y dije pues le escribo algo te dejo mi email yosvanylopez@hotmail.es cuentame cosas de alli y dasle mi email a toda la gente que conozcas de la carrera pa que me escriban
saludos

Jose dijo...

Excelente aporte Aldo, me sirvió de mucho para armar mi laboratorio con Squid, pero yo uso CentOS Linux.

Gracias por el aporte!!
JC