miércoles, 17 de septiembre de 2008

CONFIGURACIÓN DE SQUID EN DEBIAN

Demonio Proxy/Squid


Antes de iniciar la configuración de nuestro servidor proxy, tengamos en cuenta las siguientes definiciones:

¿ Que es un Proxy ?

“En el contexto de las ciencias de la computación, el término proxy (en inglés «apoderado» o «delegado») hace referencia a un programa que realiza una acción en representación de otro.

Un servidor proxy es un servicio de red que permite a los clientes realizar conexiones a una red de forma indirecta. El cliente se conecta al servidor proxy, éste pide una conexión, archivo o cualquier otro recurso disponible a un servidor diferente, y es el proxy el que proporciona el recurso, posiblemente conectándose al servidor específico, o sirviéndolo desde un caché. En algunos casos, el proxy puede alterar la petición del cliente o la respuesta del servidor por diversos motivos. “

¿ Que es Caché ?

“En informática, un caché es un conjunto de datos duplicados de otros originales, con la propiedad de que los datos originales son costosos de acceder, normalmente en tiempo, respecto a la copia en el caché. Cuando se accede por primera vez a un dato, se hace una copia en el caché; los accesos siguientes se realizan a dicha copia, haciendo que el tiempo de acceso aparente al dato sea menor.

Normalmente la capacidad de almacenamiento de datos en un caché es mucho menor que la del dispositivo donde se encuentran los datos originales. Las razones por las que los cachés funcionan es que hay muchos patrones típicos de acceso a los datos (entre estos están la localidad espacial y la localidad temporal), haciendo que solo exista una copia en caché de los datos con más probabilidad de volver a accederse.”

Según estas definiciones un servidor proxy/caché es aquel que nos permite actuar como intermediario de los clientes ya sea para acceder a Internet o cualquier otro servicio que pueda proporcionar el proxy y a la vez nos permite cachear los datos que pasan a traves del mismo. Permitiendo una aceleración de la conexión.

¿Qué es SQUID?

Squid es ...
Un proxy/cache con características completas
Diseñado para correr en sistemas Linux.
Libre, con código fuente abierto.
El resultado de muchas contribuciones de voluntarios (pagados y no pagados).

Squid es el servidor proxy mas popular en ambientes Uníx, tiene muchas características que lo hacen un competidor respetable en comparación con muchos productos comerciales.
Entre las características mas reconocidas de squid están:

*Permitir el caché para HTTP, FTP y otras URL’s
*Proxy para SSL
*Caché transparente
*Soporte para SNMP.

Con squid podremos redireccionar el trafico de toda nuestra red interna por una sola conexión a Internet, acelerando la visualización interna de los contenidos una vez descargados en el servidor. Además tiene la posibilidad de tener listas de control de acceso y de contenido, que permiten un uso mas eficiente del ancho de banda disponible en nuestra red.

¿ Que se necesita ?

-Tener instalado un servidor web compatible con squid (Apache!).
-Configurar el archivo requerido por squid y modificar las variables básicas de funcionamiento.
-Reiniciar el servicio squid.
-Configurar el proxy en las estaciones clientes.

Ahora ya sabemos que debemos hacer.
En este curso se enseñará como configurar el squid de forma sencilla, tomando las opciones mas importantes y haciendo la prueba de redirección de información a través del proxy.

El archivo de configuración permite innumerables formas de configurarlo, tiene cientos de posibles parámetros de configuración, pero nosotros solo tomaremos los básicos (o mas importantes) y haremos una configuración rápida.
Como siempre, queda a interés del estudiante profundizar en el conocimiento de squid y de cualquier otro servicio que configuremos en el curso.
El archivo de configuración de squid, por defecto se llama squid.conf y esta ubicado en alguna de las siguientes direcciones:

/etc/squid.conf
/usr/share/squid/squid.conf
/etc/squid/squid.conf

En SUSE 9.2, este archivo se encuentra en la ruta: /etc/squid/squid.conf.
Vamos a analizar las variables más comunes para configurar nuestro squid:

http_port

Este parámetro define en que puerto escuchará el servidor proxy. Por defecto squid trae configurado el puerto 3128. Podemos agregar dos líneas con puertos diferentes para que escuche al mismo tiempo en dos puertos del sistema. Ejemplo:

http_port 3128
http_port 8080

cache_mem

Este parámetro especifica un tamaño limite de uso de la memoria para que squid manipule los archivos que están pasando por la interfaz o los archivos que se están requiriendo del caché. Por defecto esta en 8 MB, si usted tiene más de 128 MB de RAM, puede especificar algo como:

cache_mem 16 MB

cache_swap_low
cache_swap_high

Estos parámetros le especifican al squid valores para los cuales va a iniciar el proceso de reemplazo de datos en memoria cuando la memoria swap utilizada del sistema alcanza el valor (porcentaje) del parámetro cache_swap_high. Squid siempre trata de mantener el la utilización muy cerca al parámetro cache_swap_low. Un ejemplo puede ser:

cache_swap_low 90
cache_swap_high 95

Esto significa que squid tratará de tener la utilización de la swap entre un 90% y 95% de la memoria swap del sistema.

cache_dir [ufs] [Directorio] [MegaBytes] [L1] [L2] [OPCIONES]

Este parámetro es uno de los mas importantes de squid. Le especifica donde almacenar todos los datos que tendrá en caché. Se pueden definir varios directorios en diferentes partes del sistema para mayor flexibilidad, aunque normalmente solo se trabaja con una sola línea de este estilo.

[ufs]

Es el sistema por defecto que usa squid para almacenar los archivos.
Mientras no se tenga un sistema alterno de manejo de archivos, se debe configurar la variable ufs.

[Directorio]

Se especifica el directorio o la ruta donde se almacenará el cache. Algo importante es que debe asegurarse que si tiene el espacio requerido por squid en el lugar que le esta indicando en esta variable.

[MegaBytes]

Especifica la cantidad de espacio en disco del que squid dispondrá para almacenar el cache. Puede elegir este dato a criterio propio, dependiendo de la cantidad de espacio en disco que tenga. Por defecto son 100 MegaBytes.

[L1]

Indica el primer nivel de directorios que se crearán en la ruta especificada por Directorio. Por defecto son 16. Usted puede elegir cuantos subdirectorios crear, pero el parámetro por defecto es recomendado.

[L2]

Indica el segundo nivel de subdirectorios para almacenar información, por defecto es de 256. Esto significa 256 directorios dentro de cada uno de los 16 directorios creados en el nivel 1 (L1). Usted es libre de elegir cuantos directorios crear, pero la configuración por defecto es recomendada.

Veamos un ejemplo:

cache_dir ufs /var/cache/squid 500 16 256

Aquí le indico a squid que tendrá 500 Megas de espacio en el directorio /var/cache/squid para almacenar el cache y que usará el resto de la configuración por defecto de L1 y L2.


ftp_user

El valor de este parámetro se enviará cuando squid intente conectarse a un FTP anónimo. Lo puede configurar con el valor que mas le guste. Ejemplo:

ftp_user proxy@su-dominio.net

maximun_object_size

Este parámetro especifica el valor del tamaño máximo para el que squid hará caché de algún archivo. Si el archivo supera este tamaño, squid no lo salvará en el disco. Ejemplo:

maximun_object_size 4096 KB

Este ejemplo muestra como prohibirle a squid no hacer caché de archivos mas grandes a 4MB.

Teniendo conocimiento de estos parámetros solo resta hacer una advertencia en la configuración del archivo y es que cuando se quiten los comentarios del archivo se debe asegurar que los parámetros se empiecen a escribir desde el inicio de la pantalla, esto es, desde la columna cero del archivo y no después.
Squid es exigente en este aspecto y siempre causará dolores de cabeza el no saber porque una configuración aparentemente buena no funciona.

Por ejemplo, si en el archivo aparece el parámetro:

>#http_port 3128

El “>” representa el inicio del archivo (columna cero).

y lo queremos decomentar para activarlo, hacemos lo siguiente:

> http_port 3128

NO!

Como puedes ver, quedo un espacio entre la columna cero y el inicio del parámetro. Esto es lo que squid no acepta y te causará dolores de cabeza.
Volvámoslo hacer:

>http_port 3128

MUY BIEN!

El parámetro quedo escrito desde la columna cero y ahora squid no tendrá problemas en trabajar adecuadamente.

Con esta advertencia, podemos ir al archivo de configuración y hacer nuestras respectivas pruebas. Recuerde que para que los cambios surtan efecto debe reiniciar el servidor squid (que no el computador).
Recuerde también que para poner en funcionamiento su proxy, debe configurar las estaciones clientes que pasarán a través del mismo. Esta configuración se realiza dependiendo de cual navegador este usando. Normalmente la ruta es “Opciones-Configuración”.

En este ejemplo usamos la misma maquina como cliente y servidor proxy. Si usted dispone de varios equipos puede hacer la prueba configurando un servidor web y un proxy en maquinas diferentes.

Nota:
YasT no tiene el plugin de configuración para el servidor proxy, solo para el cliente. Si quiere experimentar la configuración gráfica con este servicio, debe instalar un software adicional que este disponible para esto. Por ejemplo el webmin. Un conjunto de módulos personalizables que permiten configurar casi cualquier servicio conocido bajo Linux. La explicación de cómo usar webmin no se explicará en este curso, pero es bastante intuitivo y con un poco de lectura lo puede lograr.

Una de las principales características de squid como lo habíamos dicho es la posibilidad de crear listas de control de acceso.

¿Qué es una ACL (Lista de control de acceso) ?


Las listas de control de acceso nos permiten especificar que usuarios pueden acceder a nuestro proxy basándose en la configuración de la dirección IP que posean, el tiempo, el contenido y muchas cosas más.

En este curso aprenderemos a configurar una lista de acceso simple permita que la red interna con la que estamos trabajando pueda salir a través del proxy, esto es, que nuestro proxy no le deniegue el acceso a nuestros usuarios.

En el archivo de configuración de squid hay una sección con las listas de acceso de sistema. La forma de definir una lista es algo muy simple y consiste en dos pasos:

1) Defino el nombre de la lista, según las características que nos interesen.
2) Evaluó la regla denegándole o permitiéndole el acceso al proxy.

La primera parte se hace especificando una lista con la siguiente sintaxis:

acl [nombre de la lista] src [lo que compone a la lista]

[nombre de la lista]

Una palabra clave con la que podamos recordar la lista. Es mucho mejor manejar una palabra clave que un conjunto de direcciones IP.
Una palabra clave puede ser algo como: “denegados” o “mi_red_interna”.

[lo que compone la lista]

Es la dirección IP o el conjunto de direcciones o de redes que especifican los clientes sobre los cuales quiero tomar la acción. Puede ser algo como: 192.168.0.0/255.255.255.0
Veamos un ejemplo de nombre de lista:

acl mi_red src 192.168.0.0/255.255.255.0

El nombre clave mi_red me esta especificando al rango de direcciones 192.168.0.0/24.

Lo que compone la lista tambien se puede especificar desde un archivo de texto. Por ejemplo:

acl permitidos src "/etc/squid/permitidos"

El nombre clave permitidos me especifica un grupo de direcciones que están en un archivo llamado: /etc/squid/permitidos.

En ese archivo puede haber algo como:

$cat /etc/squid/permitidos
192.168.0.0/255.255.255.0
127.0.0.0/255.0.0.0
192.168.3.9
...

Como se ve en el ejemplo, el archivo en cuestión puede tener direcciones de diferentes rangos y todas ellas estarían referenciadas solo por una palabra clave.

La segunda parte de la configuración de la lista de control consiste en decidir que hacer con esa palabra clave. Hasta ahora solo hemos definido el nombre, pero aún no le hemos asignado una acción.

Para definirle la acción buscamos líneas mas abajo en el mismo archivo de configuración donde aparecen líneas del estilo: http_access.

La sintaxis de esta sección es mas simple todavía, se muestra a continuación:

http_access [allow o deny] [nombre de la lista]

[allow o deny]

Aqui seleccionamos si la acción es denegar o aceptar el trafico para la lista de acceso que se va a configurar.

[nombre de la lista]

Es el nombre de la lista de acceso recién creada. Por ejemplo : mi_red.

Un ejemplo de esto es:

http_access allow mi_red

Este control me dice lo siguiente:
A todos aquellos que vengan de mi_red. Donde mi_red esta especificado de un ejemplo anterior como: 192.168.0.0/255.255.255.0, permítales el acceso.
Simple NO?

Lo que realmente hay que tener en cuenta en la configuración de las listas de control, es la posición donde se ubican las palabras claves acl y http_access.
Squid evalúa en orden secuencial. Esto significa que empieza con la acl que vea mas al inicio del archivo y luego sigue con las demás en orden. De igual forma cuando un cliente se conecta, evalúa todas las reglas http_access hasta que encuentra una coincidencia empezando por la que esta mas cerca al inicio del archivo.
Porque es importante?

Fíjese en el siguiente ejemplo:

Que pasa si tengo unas acl como las siguientes, en este orden:

1)acl todas src 0.0.0.0/0.0.0.0
2)acl src 127.0.0.0/255.0.0.0
3)acl ejemplo src 200.200.100.1

Hasta ahora nada!, porque solo las estoy definiendo. El problema viene en la evaluación de las listas.

1)http_access allow todas
2)http_access deny ejemplo

Que pasa si mi objetivo es denegar el acceso a la ip 200.200.100.1 ?

Si squid evalúa las reglas en orden, primero evaluará la numero 1), que le indica que a la lista llamada todas que esta definida como todas las direcciones de Internet la deje pasar (allow). Esto hará que squid no revise la lista 2), puesto que ya se tuvo una coincidencia y por lo tanto el acceso de la ip 200.200.100.1 no será restringido. Sencillo no?

Para solucionar el problema, invertimos el orden de las ordenes de acceso.

1)http_access deny ejemplo
2)http_access allow todas

Al tener estas líneas el squid evalúa primero la 1), que le indica que a la lista llamada ejemplo, la cual esta relacionada con la ip 200.200.100.1 le deniegue el acceso, lo cual es justamente lo que queremos y como el squid ya encontró una coincidencia se sale de la evaluación de reglas y todo funcionará como lo esperábamos.

Que pasa si intenta ingresar una dirección diferente a 200.200.100.1 ?

Squid evaluará nuevamente la 1), y encontrará que no hay coincidencia puesto que la IP origen no corresponde a la de la lista ejemplo. Por lo tanto continuará con la evaluación de la siguiente regla 2), y encontrará que esa IP corresponde a todas!, por lo cual tendrá una coincidencia y le permitirá el acceso.

Puede ver a continuación una animación donde se configura una lista de acceso y se hace la prueba cambiando la IP del proxy en el navegador cliente a la IP valida para el rango de la ACL (la red Interna).

[Insertar enlace a Flash squid-acl]


Esto es todo, solo queda practicar la forma en como squid evalúa las reglas que le configuramos.

Como lo habíamos mencionado antes, después de configurar el servidor proxy y que estemos seguros que ya esta funcionando, debemos ir a cada estación a configurar manualmente la dirección de nuestro nuevo proxy, para que los equipos puedan acceder al mismo.

Que sucede si son muchas estaciones?

Nos quitará mucho tiempo ...

O podemos pensar en otra solución: Proxy Transparente.

¿Qué es proxy transparente?

Con el proxy transparente no tenemos la necesidad de configurar cada estación cliente para que use el proxy. Si el equipo servidor se encuentra conectado directamente a Internet (Banda ancha, ADSL, ETC) o esta conectado a una red que tiene salida Internet directamente y por otro lado esta conectado a nuestra red interna, todas las peticiones tendrán que pasar por él. Si aprovechamos esto, podremos redireccionar todas las peticiones que vayan al puerto 80 y a nuestro puerto proxy, logrando que todos pasen por el proxy sin movernos de la estación servidor.
Para esto tendremos que adicionar (o descomentarlas) un par de líneas más al archivo de configuración. Estas líneas son:

httpd_accel_host [IP SERVIDOR WEB]
httpd_accel_port 80
httpd_accel_single_host off
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

Estos parámetros son especiales y permiten que squid acepte trabajar en modo transparente. Sin embargo hará falta la ayuda de otra aplicación que nos haga la redirección del puerto. Esta aplicación es nuestro amigo el cortafuegos que configuraremos más adelante.

De todos modos pondremos aquí las líneas necesarias para que se produzca el reenvió de puerto y el proxy transparente funcione. Mas adelante explicaremos lo que significan.

#/sbin/iptables -t nat -A PREROUTING -i [INT] -p tcp --dport 80 -j REDIRECT --to-port [PP]

Donde [INT] es la interfaz donde esta conectada la red interna y [PP] es el puerto donde esta funcionando el proxy.

De esta forma queda configurado nuestro proxy transparente sin tanto esfuerzo ;).

Como se dije al principio, existen muchas posibilidades de configurar squid, en este manual solo mencionamos las mas básicas, si desea mas información puede visitar los siguientes sitios:

Pagina oficial de squid:
http://www.squid-cache.org/

Página en español sobre squid:
http://www2.idesoft.com/squid/

Tutoriales de configuración de squid:
http://linuca.org/body.phtml?nIdNoticia=246&nIdPage=1
http://www.linuxparatodos.net/geeklog/staticpages/index.php?page=19-0-como-squid-general

1 comentario:

Ubuntu & Mac Os X dijo...

me gustaria saber como le puedo configurar la rutas en el squid 2.6

buenas a todos

yo tengo puesto el squid.

pero tengo un dimela.

quiero dar acceso a esta ip 10.2.0.0/23

quiero poner estas rutas.
10.0.0.0/14 --->10.2.0.2xx
10.10.3x.0-->10.2.0.2xx
10.10.3x.0-->10.2.0.24x
10.9.x.0-->10.2.0.24x