3. Instalar y configurar el software necesario

Aquí explicaremos cómo instalar el software necesario de forma que podamos limitar el ancho de banda y observar su uso.

3.1. Instalar Squid con la prestación delay pools

Como mencioné antes, Squid tiene una prestación que se conoce como delay pools y que nos permite controlar el ancho de banda de bajada. Desgraciadamente, en la mayoría de las distribuciones Squid viene sin esa característica.

Así que si tiene Squid ya instalado siento desanimarle pero tendrá que desinstalarlo e instalarlo de nuevo con las delay pools activadas de la manera que explico más adelante.

  1. Para obtener un mejor rendimiento de nuestro proxy Squid lo mejor es crear una partición aparte para su caché y llamarla /cache/. Su tamaño debería ser de alrededor de 300 megabytes dependiendo de sus necesidades.

    Si no sabe cómo crear una partición puede crear el directorio /cache/ en su partición raíz pero el rendimiento de Squid podrá disminuir notablemente.

  2. Añadimos un usuario 'squid' seguro:

    # useradd -d /cache/ -r -s /dev/null squid >/dev/null 2>&1

    Nadie puede entrar en el sistema como squid, ni siquiera root.

  3. Descargamos las fuentes de Squid de http://www.squid-cache.org

    Cuando estaba escribiendo este COMO la última versión era Squid 2.4 estable 1:

    http://www.squid-cache.org/Versions/v2/2.4/squid-2.4.STABLE1-src.tar.gz

  4. Desempaquetamos todo en /var/tmp:

  5. # tar xzpf squid-2.4.STABLE1-src.tar.gz

  6. Compilamos e instalamos Squid (todo va en una sola línea):

    # ./configure --prefix=/opt/squid --exec-prefix=/opt/squid --enable-delay-pools --enable-cache-digests --enable-poll --disable-ident-lookups --enable-truncate --enable-removal-policies

    # make all

    # make install

3.2. Configurar Squid para poder usar la prestación de las delay pools

  1. Configuramos nuestro archivo squid.conf (localizado en /opt/squid/etc/squid.conf):

    #squid.conf
    #Todas las opciones de este archivo se encuentran muy bien documentadas en el
    #propio squid.conf así 
    #como en http://www.visolve.com/squidman/Configuration%20Guide.html
    
    #
    #Los puertos por los que escuchará nuestro Squid.
    http_port 8080
    icp_port 3130
    #los cgi-bin no se cachearán.
    acl QUERY urlpath_regex cgi-bin \?
    no_cache deny QUERY
    #La memoria que usará Squid. Bueno, Squid usará mucha más que ésa.
    cache_mem 16 MB
    #250 significa que Squid usará 250 megabytes de espacio en disco.
    cache_dir ufs /cache 250 16 256
    
    #Lugares en los que irán los archivos de bitácora de Squid.
    cache_log /var/log/squid/cache.log
    cache_access_log /var/log/squid/access.log
    cache_store_log /var/log/squid/store.log
    cache_swap_log /var/log/squid/swap.log
    #Cuántas veces rotar los archivos de bitácora antes de borrarlos.
    #Acuda a la FAQ para más información.
    logfile_rotate 10
    
    redirect_rewrites_host_header off
    cache_replacement_policy GDSF
    acl localnet src 192.168.1.0/255.255.255.0
    acl localhost src 127.0.0.1/255.255.255.255
    acl Safe_ports port 80 443 210 119 70 20 21 1025-65535
    acl CONNECT method CONNECT
    acl all src 0.0.0.0/0.0.0.0
    http_access allow localnet
    http_access allow localhost
    http_access deny !Safe_ports
    http_access deny CONNECT
    http_access deny all
    maximum_object_size 3000 KB
    store_avg_object_size 50 KB
    
    #Configure esto si quiere que su proxy funcione de manera transparente.
    #Eso significa que por lo general no tendrá que configurar todos los 
    #navegadores de sus clientes, aunque tiene algunos inconvenientes.
    #Si deja esto sin comentar no pasará nada peligroso.
    httpd_accel_host virtual
    httpd_accel_port 80
    httpd_accel_with_proxy on
    httpd_accel_uses_host_header on
     
    #Todos los usuarios de nuestra LAN serán vistos por los servidores web
    #externos como si usasen Mozilla en Linux. :)
    anonymize_headers deny User-Agent
    fake_user_agent Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.6+) Gecko/20011122
     
    #Para acelerar aún más nuestra conexión ponemos dos líneas similares a las
    #de más abajo. Apuntarán a un servidor proxy [parent] que usará nuestro propio
    #Squid. No olvide cambiar el servidor por uno más rápido para usted.
    #Puede utilizar ping, traceroute y demás herramientas para comprobar la
    #velocidad. Asegúrese de que los puerto http e icp son los correctos.
    
    #Descomente las líneas que comienzan por "cache_peer" de ser necesario.
    #Éste es el proxy que va a usar para todas las conexiones...
    #cache_peer w3cache.icm.edu.pl parent 8080 3130 no-digest default
    
    #...excepto para las direcciones e IPs que comiencen por "!".
    #No es buena idea usar un mayor
    #cache_peer_domain w3cache.icm.edu.pl !.pl !7thguard.net !192.168.1.1
    
    #Esto resulta útil cuando queremos usar el Cache Manager.
    #Copie cachemgr.cgi al cgi-bin de su servidor web.
    #Podrá acceder a él una vez lo haya hecho introduciendo en un navegador
    #la dirección http://su-servidor-web/cgi-bin/cachemgr.cgi
    cache_mgr your@email
    cachemgr_passwd secret_password all
     
    #Éste es el nombre de usuario con el que trabajará nuestro Squid.
    cache_effective_user squid
    cache_effective_group squid
     
    log_icp_queries off
    buffered_logs on
     
     
    #####DELAY POOLS
    #Ésta es la parte más importante para configurar el tráfico entrante con
    #Squid. Para una descripción detallada acuda al archivo squid.conf o a la
    #documentación de http://www.squid-cache.org
     
    #No queremos limitar las descargas en nuestra red local.
    acl magic_words1 url_regex -i 192.168
     
    #Queremos limitar la descarga de este tipo de archivos
    #Ponga todo esto en una única línea
    acl magic_words2 url_regex -i ftp .exe .mp3 .vqf .tar.gz .gz .rpm .zip .rar .avi .mpeg .mpe .mpg .qt
    .ram .rm .iso .raw .wav .mov
    #No bloqueamos .html, .gif, .jpg y archivos similares porque por lo general
    #no consumen demasiado ancho de banda.
    
    
    #Queremos limitar el ancho de banda durante el día permitiendo
    #el ancho de banda completo durante la noche.
    #¡Cuidado! con el acl de abajo sus descargas se interrumpirán 
    #a las 23:59. Lea la FAQ si quiere envitarlo.
    acl day time 09:00-23:59
     
    #Tenemos dos delay_pools diferentes
    #Acuda a la documentación de Squid para familiarizarse 
    #con delay_pools y delay_class.
    delay_pools 2
     
    #Primer delay pool
    #No queremos retrasar nuestro tráfico local
    #Hay tres cases de pools; aquí sólo hablaremos de la segunda.
    #Primera clase de retraso (1) de segundo tipo (2).
    delay_class 1 2
     
    #-1/-1 significa que no hay límites.
    delay_parameters 1 -1/-1 -1/-1
     
    #magic_words1: 192.168 que ya hemos puesto antes
    delay_access 1 allow magic_words1
     
    
    #Segundo delay pool.
    #Queremos retrasar la descarga de los archivos mencionados en magic_words2.
    #Segunda clase de retraso (2) de segundo tipo (2).
    delay_class 2 2
     
    #Los números siguientes son valores en bytes;
    #Debemos recordar que Squid no tiene en cuenta los bits de inicio/parada
    #5000/150000 son valores para la red al completo
    #5000/120000 son valores para la IP independiente
    #una vez los archivos descargados exceden los 150000 bytes,
    #(o el doble o el triple)
    #las descargas proseguirán a 5000 bytes/s
     
    delay_parameters 2 5000/150000 5000/120000
    #Ya hemos configurado antes el día de 09:00 a 23:59.
    delay_access 2 allow day
    delay_access 2 deny !day
    delay_access 2 allow magic_words2
    
    
    #EOF

    Cuando lo hayamos configurado todo debemos asegurarnos de que todo lo que se encuentre en los directorios /opt/squid y /cache pertenece al usuario 'squid'.

    # mkdir /var/log/squid/

    # chown squid:squid /var/log/squid/

    # chmod 770 /var/log/squid/

    # chown -R squid:squid /opt/squid/

    # chown -R squid:squid /cache/

    Ahora ya está todo listo para ejecutar Squid. Cuando lo hagamos por primera vez tendremos que crear sus directorios de caché:

    # /opt/squid/bin/squid -z

    Ejecutamos Squid y comprobamos si todo funciona correctamente. Una buena herramienta para hacer eso es IPTraf; puede encontrarla en http://freshmeat.net. Asegúrese de haber configurado el proxy adecuado en sus navegadores (192.168.1.1, puerto 8080 en nuestro ejemplo):

    # /opt/squid/bin/squid

    Si todo funciona añadimos la línea /opt/squid/bin/squid al final de nuestros scripts de inicio. Normalmente puede ser /etc/rc.d/rc.local.

    Otras opciones útiles de Squid son:

    # /opt/squid/bin/squid -k reconfigure (reconfigures Squid si hicimos cualquier cambio en el archivo squid.conf)

    # /opt/squid/bin/squid -help :) no hace falta explicar qué hace

    También puede copiar cachemgr.cgi al directorio cgi-bin de su servidor web para utilizar un útil gestor de caché.

3.3. Resolver problemas pendientes

Bien, ya hemos instalado Squid y lo hemos configurado para que use los los delay pools ésos. Apuesto a que nadie quiere restricciones, especialmente los astutos usuarios de nuestra LAN. Seguramente intentarán esquivar nuestras limitaciones para poder descargar sus mp3s favoritos un poco más rápido (y causándonos unos cuantos dolores de cabeza).

Asumo que utiliza enmascarado de IP en su LAN para que sus usuarios puede acceder al IRC, ICQ, correo, etc. Esto está bien, pero debemos asegurarnos de que los usuarios de nuestra LAN utilizarán la caché de nuestro Squid para acceder a la páginas web y el ftp.

Podemos resolver la mayoría de estos problemas por medio de ipchains (Núcleos Linux 2.2.x) o iptables (Núcleos Linux 2.4.x).

3.3.1. Núcleos Linux 2.2.x (ipchains)

Debemos asegurarnos de que nadie hará trampas intentando usar un proxy diferente al nuestro. Los proxies públicos suelen correr en los puertos 3128 y 8080:

/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 3128 -p TCP -j REJECT

/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 8080 -p TCP -j REJECT

También debemos asegurarnos de que intenta engañarnos conectándose a Internet directamente (Enmascarado de IP) para descargar las páginas web:

/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 80 -p TCP -j REDIRECT 8080

Si todo funciona añadimos estas líneas al final de nuestros guiones de inicio. Normalmente suele ser /etc/rc.d/rc.local.

Podemos pensar en bloquear el tráfico por ftp (puertos 20 y 21) para forzar a los usuarios de nuestras LAN a que usen Squid, pero no es una buena idea al menos por dos razones:

Así que bloquearemos las descargas excesivas por ftp utilizando otros métodos. Nos pondremos con ello en el capítulo 4.

3.3.2. Núcleos Linux 2.4.x (iptables)

Debemos asegurarnos de que nadie intentará hacernos trampa utilizando un servidor proxy distinto al nuestro. Los proxies suelen correr en los puertos 3128 y 8080:

/sbin/iptables -A FORWARD -s 192.168.1.1/24 -d ! 192.168.1.1 --dport 3128 -p TCP -j DROP

/sbin/iptables -A FORWARD -s 192.168.1.1/24 -d ! 192.168.1.1 --dport 8080 -p TCP -j DROP

También debemos asegurarnos de que intenta engañarnos conectándose a Internet directamente (Enmascarado de IP) para descargar las páginas web:

/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Si todo funciona añadimos estas líneas al final de nuestros guiones de inicio. Normalmente suele tratarse de /etc/rc.d/rc.local.

Podemos pensar en bloquear el tráfico ftp (puertos 20 y 21) para forzar a los usuarios de nuestra LAN a que usen Squid, pero no es una buena idea al menos por dos razones:

Así que bloquearemos las descargas excesivas por ftp utilizando otros métodos. Nos pondremos con ello en el capítulo 4.