Squid Como para Slackware 10.x Squid es un software para servidor web proxy con cache, esto quiere decir que lo podremos utilizar para compartir la conexion a Internet en especifico de los protocolos HTTP y FTP aunque tambien soporta HTTPS, y al mismo tiempo se puede usar para cache de los accesos a ese tipo de URLs lo cual agiliza el acceso a paginas de uso cotidiano ya que se usara una copia que se almaceno en el servidor y no saldria la peticion nuevamente a el servidor remoto. Squid tiene grandes capacidades en cuanto a la creacion de Listas de Control de Acceso (ACL) las cuales son utiles para restringir el acceso a sitios web o para permitir navegar la WWW solo a ciertos usuarios o grupos con diferentes criterios. En este documento se explicara como instalar y configurar un servidor squid con sus configuraciones basicas para permitir el acceso a una red local (LAN) navegar la WWW. En Slackware no hay paquete oficial de squid, por lo que me di a la tarea de hacer uno, este paquete hace todo el trabajo sucio de la instalacion, entonces con este paquete nos brincaremos directo a la configuracion de squid. Hay que instalar squid con el paquete que esta en: http://www.tuxjm.net/downloads/packages/Slackware-10.1/squid/ baja el archivo y como root has esto: # installpkg squid-2.5.STABLE9-i486-1jm.tgz NOTA: Si quieres saber como fue construido este paquete y las opciones por defecto que tiene se recomienda leer el documento: http://www.tuxjm.net/downloads/source/Slackware-10.1/squid/explicacion- squid.slackbuild.txt Ahora iremos a el directorio donde esta el archivo de configuracion de squid. /etc/squid/ El archivo de configuracion del servidor squid es "squid.conf" en este paquete el archivo squid.conf ya esta con algunas cosas preconfiguradas aparte de las ya incluidas originalmente. El archivo squid.conf que viene incluido en una instalacion desde fuentes no permite acceso a ningun host ni al localhost pero queda casi funcional, y en este paquete de squid para Slackawre le permite salir al localhost por lo que ya se ahorra un paso, el archivo squid.conf esta por demas documentado (en Inglés) para poder utilizar squid para comartir el acceso a una red local basta con editar unas cuantas lineas para tener un servidor proxy funcional con opciones basicas. Al editar el archivo de configuracion squid.conf regularmente se agregan, modifican o simplemente se descomentan las opciones, squid tomara las opciones por default si no existe la opcion explicita en el archivo squid.conf, muchas opciones vienen comentadas y ponen el parametro por default, en el caso que se quiera cambiar dicho parametro se tendra que descomentar dicha linea y modificar el valor del parametro. Nota sobre descomentar lineas. En muchos documentos que he leido acerca de la configuracion de squid hacen notar que al descomentar una linea no se debe de dejar un espacio entre el borde y la opcion, por ejemplo asi: http_port 10.0.0.1:3128 Por lo que deben de quedar sin ningun espacio asi: http_port 10.0.0.1:3128 Yo he probado con espacios y sin espacios en varias configuraciones y he tenido el mismo resultado, con las dos el servicio squid arranca sin reportar problemas, quizas esto sucedia en versiones anteriores de squid, dicho esto nos apegaremos a esa practica de no dejar espacios antes de las opciones. CONFIGURACIONES BASICAS: Configurando el puerto HTTP de Squid. La primera opcion en el archivo squid.conf es la que configura el puerto HTTP en el que Squid escuchara peticiones entrantes. La opcion http_port es la que define el puerto en el que Squid recibira peticiones tambien aqui se puede especificar la ip por la que escuchara, regularmente es la direccion IP asiganada a la interfaz de la red local, Squid usa por defecto el puerto 3128, que lo usaremos por defalt, tambien es posible asignar otro puerto siempre y cuando no haga conflicto con el puerto de algun otro servicio corriendo en el mismo equipo. El archivo squid.conf por defecto tiene: #Default: # http_port 3128 Como vemos esta comentada la opcion, y por default Squid escuchar en el puerto TCP 3128 en todas las interfaces de el sistema, si este equipo que funcionara de proxy para nuestra red local tiene una interfaz directamente conectada al Internet no sera deseable que tambien escuche peticiones por esa interfaz por lo que configuraremos Squid para que solo escuche peticiones en la direccioni IP asignada a la internfaz que esta conectada a la LAN. Tomaremos como ejemplo que la LAN esta en el segmento: 192.168.0.1/24 y la direccion IP (asignada a la interfaz de red que se conecta a la red local, por ejemplo eth1, eth0 es la interfaz conectada a Internet) de el servidor proxy es: 192.168.0.254 entonces configuraremos el parametro asi: http_port 192.168.0.1:3128 Donde almacenar los datos cacheados. Los datos deben de ser almacenados en un medio fisico, el siguiente paso es decirle a Squid en el archivo squid.conf donde almacenarlos, para esto se usa la opcion cache_dir el cual le dice a squid cual va a ser el area de almacenamiento, por default en el archivo que viene con el paquete que hice tien esto: cache_dir ufs /var/spool/squid 100 16 256 su formato es: cache_dir tipo-formato directorio tamaño L1 L2 Aqui estamos utilizando el tipo de formato de almacenamiento predeterminado que usa squid que es "ufs" (hay otros ver los comentarios de squid.conf) y despues sigue el directorio que se usara, enseguida sigue el tamañao que se usara para el cache en MB, en este caso son 100MB, y el L1 indica el "primer nivel" de subdirectorios que creara en el directorio especificado, el predeterminado es 16, L2, es el "segundo nivel" de subdirectorios que seran creados en L1 por default es 256. Por el momento se usaran los valores predeterminados. La direccion email de el Administrador del Cache. Si Squid muere un email es enviado a la direccion espeficiada en la opcion cache_mgr, en este paquete es ël usuario "root". Esta direccion email tambien es agregada al final de las paginas de error que se muestran en los navegadores a los usuarios, por ejemplo si un host no es alcanzado. Por default esta asi: # cache_mgr root Lo puedes poner por ejemplo: cache_mgr jmedina@tuxjm.net Informacion de el Effective User and Group Como buena practica de seguridad es recomendable correr los servicos con usuarios no privilegiados como root, Squid es inicado regularmente por scripts (rc scripts) al inicio del sistema, entonces al inicio Squid es iniciado como root, pero con las opciones cache_effective_user y cache_effective_group haremos que una vez que Squid ha iniciado cambiar los privilegios del programa al el usuario y grupo especificado en estas opciones, en el paquete que hice te crea un usuario y grupo especifico para esta tarea, crea el usuario y grupo "squid" el paquete fue compilado para que use esas opciones con el usuario y grupo "squid" por lo cual no hay necesidad de descomentar y configurar las opciones, pero para mayor control y legibilidad las descomentaremos para hacerlo explicito, quedando asi: cache_effective_user squid cache_effective_group squid Informacino de usuario para conexiones FTP anonimas. Squid puede actuar como servidor proxy para varios protocolos. El mas comun es HTTP, aunque tambien trabaja como servidor FTP proxy. La autenticacion de conexiones FTP requieren un usuario y una contraseña, cuando se accede a un servidor publico regualarmente se usa el usaurio "anonymous" y como contraseña generalmente se usa una direccion de email, muchos administradores de servidores FTP te obligan a meter una direccion de email valida, para asi tener un control y poder contactarte si haces uso indiscriminado del servidor :). Squid te permite especificar una direccion email para conexiones ftp anonimas usando la opcion "ftp_user", por default esta asi: # ftp_user Squid@ Y lo podriamos dejar algo asi: ftp_user ftp@tuxjm.net Listas de Control de Acceso (ACL) Para poder utilizar Squid como servidor proxy y nos provea de acceso a la www o ftp por asi decirlo, es necesario crear listas de control de acceso y a estas listas aplicarles reglas de acceso o negacion a el servidor proxy Squid. El formato de las listas de control de acceso es el siguiente: acl nombre_de_acl tipo valor_de_lista Donde nombre_de_acl es un nombre distintivo de la lista el cual se referenciara posteriormente, el tipo puede ser de diferentes, los mas usuales en configuraciones basicas son: acl nombre_de_acl src direccion-ip/netmask ... (direccion IP del cliente) acl nombre_de_acl src IP1-IP2/netmask ... (rango de direcciones) acl nombre_de_acl dst direccion-ip/netmask ... (direccion IP del host destino) Como se menciono antes en este documento usaremos como ejemplo a la red 192.168.0.0/24 o 192.168.0.0/255.255.255.0, entonces haremos una ACL para toda esta red, usando el tipo "src" quedando asi: acl localnet src 192.168.0.0/24 Podremos agregarla despues de la linea que dice: acl localhost src 127.0.0.1/255.255.255.255 quedando asi: acl localhost src 127.0.0.1/255.255.255.255 acl localnet src 192.168.0.0/24 Y despues sigue aplicar una Regla a esta ACL ya sea denegando (deny) o permitiendo el acceso (allow). podremos aplicar la regla asi: http_access allow localnet Agregando esta linea despues de la que dice: http_access allow localhost y antes de la regla que dice: http_access deny all Las reglas son procesadas en el orden en que aparecen, por default esta http_access deny all que bloquea el acceso a todos, en este caso se permite el acceso a el ACL llamada localhost entonces deberia de quedar asi: http_access allow localhost http_access allow localnet http_access deny all Con esto sera suficiente para permitir el acceso a el servidor proxy a las direcciones definidas en la ACL localnet, en el archivo squid.conf vienen mas ejemplos de como usar las ACL para diferentes propositos y como aplicarlas. Con estas configuraciones explicadas es suficiente para poder iniciar el servicio y proveer el servicio a la red local, pero me gustaria comentar algunas configuraciones que me gustaria sean descomentadas para que se tenga conocimiento de ellas y esten usadas de forma explicita aunque se usen de igual manera estando comentadas ya que son configuraciones predeterminadas. Estas son: # Archivo de registro de actividades de los clientes. cache_access_log /var/log/squid/access.log # Archivo de registro de informacion general de el comportamiento de squid. cache_log /var/log/squid/cache.log # Archivo de registro de el administrador de almacenamiento de el cache. cache_store_log /var/log/squid/store.log # Ruta a el archivo de tabla MIME de squid. mime_table /etc/squid/mime.conf # Archivo donde se escribe el identificador de proceso de squid. pid_filename /var/run/squid.pid Con esta configuracion ya se tiene un servidor proxy/cache listo para servir a una red LAN, y proporcionarles acceso a la WWW, el siguiente paso es levantar el servicio, que con este paquete es asi: # /etc/rc.d/rc.squid start Veras un mensaje que dice que iniciara el directorio del cache: init cache_dir /var/spool/squid... y Despues el mensaje que inicia el servicio: Starting squid: Te recomiendo ver los logs de el servidor: # tail -f /var/log/squid/cache.log Ahi veras informacion referente al arranque de squid, si todo funciono correctamente deveras ver al final algo asi: 2005/04/12 10:26:26| Ready to serve requests. Esto significa que el servidor proxy/cache esta listo para recibir peticiones de los clientes en la LAN. Para que los las maquinas clientes puedan usar el servidor proxy/cache deben de tener correctamente configurados sus navegadores con la informacion de la direccion IP y el puerto en el que el servidor proxy recibe peticiones, esto es, los valores de la opcion http_port, entonces el cliente debe de tener como proxy a la ip 192.168.0.1 y el puerto 3128. La configuracion de los clientes esta fuera de el ambito de este documento, regularmente es una opcion llamada "Connection Settings" o configuraciones de la conexion en las preferencias de el navegador. esta informacion la pondremos donde nos pida la direccion y puerto para el HTTP Proxy. Con esta configuracion, el navegador hace una peticion a el proxy, y el proxy redirecciona la peticion a el servidor destino original. Esto esta bien, pero puede haber situaciones donde podrias querer: * Quieres forzar a los clientes en la red a usar un proxy, auque ellos lo quieran o no. * Quieres que los clientes usen un proxy, pero no quieres que ellos sepan que lo estan usando. * Quieres que los clientes usen el proxy, pero no quieres ir a cambiar las configuraciones de los navegadores en cada una de las maquinas que tengas, esto es un dolor de cabeza cuando tienes cientos de maquinas. Es aqui donde los proxy's transparentes entran. Una peticion web es interceptada por el proxy, transparentemente. Esto es, hasta donde el programa cliente sabe, esta hablando con el servidor de la peticion original, cuando en realidad esta hablando con el servidor proxy. (Note que esta transparencia solo aplica a los clientes, el servidor si sabe que hay un proxy envuelto, y vera la direccion IP de el proxy, y no la de el cliente. Aunque, squid puede pasar un header de X-Forwareded-For, de manera que els ervidor puede determinar la direccion IP original de el Cliente). Teoria de proxy transparente. Un firewall o otro programa redirector atrapa las conexionex TCP dirigidas a puertos especificos en hosts remotos (usualmente el puerto 80), y lo redirige a un servidor proxy local. El proxy usa los headers HTTP para determinar a donde se supone que va la conexion, y hace proxy a esa peticion. El uso de un proxy transparente con Squid aqui solo se aplilcara para conecciones HTTP, no funciona igual para FTP, HTTPS, ni mucho menos cuando se use autenticacion via Squid. Para hacer un proxy transparente hay varios requerimientos tanto de el kernel y utilerias para logarar esto, en Slackware ya viene todo preparado para hacerlo. En este caso el proxy transparente lo haremos en el mismo servidor proxy/cache esto sera hecho con el subsitema de filtrado de el kernel "netfilter" y la herramienta para construir reglas de filtrado para netfilter: "iptables". Sera necesario configurar una regla con "iptables" para atrapar todo el trafico destinado al puerto tcp/80 que vayan a host remotos-externos, y redireccionar este trafico a el puerto en el cual el servidor proxy esta escuchando (osea el 3128). Primero deberemos de configurar a Squid como "HTTP Accelerator" # Parametros para usar proxy transparente: httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on Algunos de estos parametros no esta explicitamente configurados o algunos otros estan desactivados (off) asi que hay que configurarlos explicitamente. Y ahora tendremos que ejecutar la regla para redireccionar las peticiones al puerto 80 de hosts externos al puerto 3128 loca, ya que squid corre en ese purto. # iptables -t nat -A PREROUTING -i $INTERFAZ -p tcp --dport 80 -j REDIRECT --to-port 3128 donde $INTERFAZ es la interfaz de red conectada a tu LAN, osea la mimsa que tiene la ip de el proxy. que en este ejemplo fue la eth1=192.168.0.1. Con estas configuraciones podras tener un servidor proxy y la posibilidad de hacerlo proxy transparente (el proxy transparente es opcional y depende de tus necesidades). estas configuraciones se han probado en diferentes servidores sin ningun problema. Recuerda que si teienes algun problema los logs te pueden dar la informacion que puedas necesitar para corregir los errores, los archivos de registro (logs) para squid estan en: /var/lob/squid/ yo recomiendo ver estos archivos en tiempo real mientras se inicia o se detiene el servicio y ver que sucede. # tail -f /var/log/squid/cache.log Para ver inforamcion de lo que se esta haciendo proxy: # tail -f /var/log/squid/access.log FIN! Autor: Jorge Armando Medina. email: jmedina[At]tuxjm[doT]net Sitio Web: http://www.tuxjm.net Visita la pagina del Grupo de Usuarios Linux Tijuana en: http://www.linuxtj.org