FreeBSD México
Servicios de proxy Squid en FreeBSD
Introducción
Es la hora pico de la tarde y parece que todo el mundo está tratando de accesar alguna pagina en el mismo instante en que nosotros como buenos admins necesitamos más ancho de banda para hacer pruebas de velocidad y respuesta de la red en tiempo real , o sea para un buen juego de quake , o tal vez tenemos un enlace de baja velocidad que bien podría ser optimizado si eliminamos el trafico http innecesario. Aquí es donde entra en escena el servicio de proxy para conexiones web , que en palabras simples es un programa o conjunto de programas que escuchan peticiones de conexión en un puerto determinado del servidor, una vez que reciben una solicitud toman control de la conexión y realizan la petición final al servidor de destino, cuando reciben los datos de respuesta antes de pasarlos a la maquina interna hacen una copia de los objetos involucrados en la transacción y después mandan la respuesta finalmente a su destino.
Toda ésta operación tiene como objetivo construir un cache de disco de los objetos solicitados, así cuando alguna petición concuerde con los objetos del cache, el servidor proxy no necesita ir hasta el servidor original para mandar la respuesta al cliente interno.
Requerimientos
Antes de meter las manos a la candela vamos a revisar algunos detalles para la instalación.
Cuantos Megabytes de trasferencia esperamos tener hacia el cache? Cuantos usuarios estarán conectados concurrentemente? Cuanto tiempo estarán disponibles los objetos en el cache?
Vamos a crear un escenario en donde contamos con una red de 50 usuarios con una conexión dedicada a 512 k/s, de estos 50 usuarios 10 no tienen acceso a internet, 20 son navegantes moderados y bajan un promedio de 5 Mbytes, 15 son navegantes promedio con 10 Mbytes y 5 son del tipo navegante obsesivo con 30 Mbytes al día, esto arroja 400 Mbytes de trasferencia al día.
Con 400 Mb guardándose en el disco, si tuviéramos 2 Gb de espacio de caché los objetos estarían 5 días en el cache antes de ser sobrescritos por los nuevos objetos que se vayan bajando, cuanto más grande sea el cache más tiempo podrán permanecer los objetos en el servidor aumentando con esto la posibilidad de incrementar los hits al cache. Pero un disco enorme no es por regla general mejor, un mayor rendimiento del cache se logra cuando se comparte entre varios discos, con esto mejoramos la tasa de trasferencia y las respuestas por segundo que podemos manejar simultáneamente. Por ejemplo con 3 discos con un tiempo de acceso (seek time)de X segundos con una tasa de 1000 peticiones por segundo tendría la posibilidad de soportar Z peticiones por segundo:
1000 peticiones/ (12 ms seek time)/(3 discos)=1000/4=250 peticiones/segundo
Y ahora pasemos la memoria, de esto solo hay una regla: siempre se puede usar más memoria RAM ¡, pero ya hablando un poco más en serio, Squid es un programa que hace uso activamente de la memoria del sistema, y las llamadas al swap se traducen en un alentamiento de las respuestas a las peticiones, esto se produce porque para manejar los objetos del cache se crean unos índices de acceso, cada objeto utiliza aproximadamente 75 bytes de memoria, si cada objeto utiliza aproximadamente 13 kb en el disco y tenemos asignado digamos 8 GB al caché, necesitaríamos 48 Mb de memoria RAM solo para los índices del cache, aparte de la que se necesita para los procesos del Sistema.
Con todo lo anterior ya podemos calcular los requerimientos de nuestro servicio de proxy a la medida de nuestra red, pero también hay que pensar un poco en el futuro, así que mientras más espacio de crecimiento le dejemos será mejor.
Configuración
Partiremos de una instalación básica del sistema, sin X-Windows, etc. Con una maquina configurada con 2 tarjetas de red. Lo primero que debemos hacer bajar los archivos del Squid e instalarlos, para eso solo nos tenemos que pasar al directorio de los ports y desde ahí realizar el proceso:
fbsd-mx-proxy# cd /usr/ports/www/squid24
fbsd-mx-proxy# make fetch
Ahora podemos editar el archivo de Makefile para incluir algunas opciones que nos pueden ser útiles:
CONFIGURE_ARGS= --bindir=${PREFIX}/sbin --sysconfdir=${PREFIX}/etc/squid \
--localstatedir=${PREFIX}/squid \
--enable-storeio="ufs diskd null" \
--enable-removal-policies="lru heap" \
#agregamos
--enable-delay-pools \
--enable-snmp \
--enable-ipf-transparent \
--disable-ident-lookups \
--enable-cache-digests \
con esto logramos:
Ahora solo compilamos normalmente:
fbsd-mx-proxy# make
fbsd-mx-proxy# make install
Y listo, ya tenemos el programa instalado, necesitamos crear un usuario squid con grupo de trabajo squid para ejecutar el proceso y cambiar los permisos del directorio de cache y de los logs a este usuario.
fbsd-mx-proxy# adduser
fbsd-mx-proxy# touch /usr/local/squid/logs/access.log
fbsd-mx-proxy# touch /usr/local/squid/logs/cache.log
fbsd-mx-proxy# touch /usr/local/squid/logs/store.log
fbsd-mx-proxy# chown –R squid:squid /usr/local/squid
Pasemos a editar el archivo principal de configuración del squid para especificar la ubicación de nuestro cache y el tamaño y los accesos de los usuarios:
fbsd-mx-proxy# ee /usr/local/etc/squid/squid.conf
http_port 3128 # default
cache_mem 64 MB # dependiendo del tamaño del cache
maximum_object_size 8192 KB # autoexplicatorio
cache_dir ufs /usr/local/squid/cache 8000 16 256 # cache de 8GB
cache_access_log /usr/local/squid/logs/access.log
cache_log /usr/local/squid/logs/cache.log
cache_store_log /usr/local/squid/logs/store.log
emulate_httpd_log on # para emular el formato de los logs de apache
#default
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access allow all # activar la salida para todos los usuarios
cache_mgr
acosta@freebsd.org.mx # administrador del cachecache_effective_user squid # usuario:grupo para el proceso
cache_effective_group squid
La ubicación del cache puede ser en cualquier parte del filesystem siempre y cuando se tengan permisos de escritura para el usuario que ejecuta el proceso de Squid, y se pueden tener tantos caches como sea necesario:
cache_dir ufs /usr/local/squid/cache 8000 16 256
cache_dir ufs /squid/cache 8000 16 256
cache_dir ufs /disco3/proxy 17000 32 256
Lo que necesitamos por último es inicializar el directorio de cache para que esté listo a almacenar los objetos, esto puede tardar un poco dependiendo del tamaño del cache.
fbsd-mx-proxy# squid –z
2002/01/23 12:00:46| Creating Swap Directories
Ya está listo! Solo tenemos que levantarlo
fbsd-mx-proxy# squid
Podemos revisar el archivo de cache.log para asegurarnos que el proceso levantó correctamente, de ser así nos debe mostrar algo como esto:
fbsd-mx-proxy# more /usr/local/squid/logs/cache.log
2002/01/25 09:27:43| Starting Squid Cache version 2.4.STABLE3 for i386--freebsd4.3...
2002/01/25 09:27:43| Process ID 23362
2002/01/25 09:27:43| With 2088 file descriptors available
2002/01/25 09:27:43| Performing DNS Tests...
2002/01/25 09:27:43| Successful DNS name lookup tests...
2002/01/25 09:27:43| DNS Socket created on FD 4
2002/01/25 09:27:43| Adding nameserver 192.168.1.179 from /etc/resolv.conf
2002/01/25 09:27:43| Adding nameserver 192.168.1.145 from /etc/resolv.conf
2002/01/25 09:27:43| Unlinkd pipe opened on FD 9
2002/01/25 09:27:43| Swap maxSize 1024000 KB, estimated 78769 objects
2002/01/25 09:27:43| Target number of buckets: 3938
2002/01/25 09:27:43| Using 8192 Store buckets
2002/01/25 09:27:43| Max Mem size: 16384 KB
2002/01/25 09:27:43| Max Swap size: 1024000 KB
2002/01/25 09:27:43| Rebuilding storage in /usr/local/squid/cache (CLEAN)
2002/01/25 09:27:43| Using Least Load store dir selection
2002/01/25 09:27:43| Set Current Directory to /usr/local/squid/cache
2002/01/25 09:27:43| Loaded Icons.
2002/01/25 09:27:43| Accepting HTTP connections at 0.0.0.0, port 3128, FD 11.
2002/01/25 09:27:43| Accepting ICP messages at 0.0.0.0, port 3130, FD 12.
2002/01/25 09:27:43| Accepting SNMP messages on port 3401, FD 13.
2002/01/25 09:27:43| WCCP Disabled.
2002/01/25 09:27:43| Ready to serve requests.
Los clientes que quieran utilizar el servicio de proxy deben apuntarse a la dirección del servidor en el puerto 3128 para navegar.
Conexión en modo transparente
Y que si tenemos 200 maquinas y no queremos ponernos a configurar una por una? Bueno, para eso también hay mas de una forma de pelar un cochino, pero se necesita que la máquina donde estemos ejecutando el squid tenga levantado algún método de NAT, en cuyo caso solo necesitamos modificar un poco la configuración que ya tenemos para agregar algunas opciones necesarias en squid.conf:
httpd_accel_port 80 # para crear conexiones trasparentes
httpd_accel_host virtual
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
En el archivo de configuración del servicio de NAT debemos agregar las reglas para que las peticiones dirigidas a tráfico web que lleguen las mande automáticamente al puerto donde está escuchando el squid, en lo personal prefiero usar ipfilter para NAT, así que en este caso el archivo a modificar es /etc/ipnat.rules:
rdr sis0 0.0.0.0/0 port 80 -> 127.0.0.1 port 3128 tcp
rdr sis0 0.0.0.0/0 port 443 -> 127.0.0.1 port 3128 tcp
Por supuesto hay que reiniciar los servicios de squid y de NAT para que la nueva configuración surta efecto:
fbsd-mx-proxy# squid –k shutdown
fbsd-mx-proxy# squid
fbsd-mx-proxy# ipnat –CFf /etc/ipnat.rules
Ahora ya no necesitamos configurar ningún cliente, todo el tráfico web que ocurra a través de nuestro servidor será instantáneamente redirigido a squid.
Squid es un excelente servidor proxy que puede ser utilizado en forma simple o de manera encadenada con otros servidores proxy para una mayor eficacia.
Recuerden que está es solo una forma de levantar el servicio, dudas, comentarios y sugerencias son bienvenidas.
Alejandro Acosta
acosta@freebsd.org.mx
FreeBSD México 2002