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:

  1. Activar el control de ancho de banda para usuarios
  2. Activar la información de snmp del servidor proxy
  3. La posibilidad de configurar el cache en modo transparente (se necesita ademas ipfilter instalado y configurado)
  4. Desactivamos el código que realiza idents (RFC 931) para reducir la posibilidad de ataques de negación de servicio (DoS)
  5. Activamos el método de compresión para los índices de contenido de los objetos de cache y con eso incrementamos un poco el tiempo de respuesta

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 cache

cache_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