¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Squid Proxy Server
Squid es un popular programa de software libre que implementa un servidor proxy y un dominio para caché de páginas web, publicado bajo licencia GPL. Tiene una amplia variedad de utilidades, desde acelerar un servidor web, guardando en caché peticiones repetidas a DNS y otras búsquedas para un grupo de gente que comparte recursos de la red, hasta caché de web, además de añadir seguridad filtrando el tráfico. Está especialmente diseñado para ejecutarse bajo entornos tipo Unix. Squid ha sido desarrollado durante muchos años y se le considera muy completo y robusto. Aunque orientado a principalmente a HTTP y FTP es compatible con otros protocolos como Internet Gopher. Implementa varias modalidades de cifrado como TLS, SSL, y HTTPS.
Características
Squid posee las siguientes características:
Proxy y Caché de HTTP, FTP, y otras URL
- Squid proporciona un servicio de Proxy que soporta peticiones HTTP, HTTPS y FTP a equipos que necesitan acceder a Internet y a su vez provee la funcionalidad de caché especializado en el cual almacena de forma local las páginas consultadas recientemente por los usuarios. De esta forma, incrementa la rapidez de acceso a los servidores de información Web y FTP que se encuentra fuera de la red interna.
Proxy para SSL
- Squid también es compatible con SSL (Secure Socket Layer) con lo que también acelera las transacciones cifradas, y es capaz de ser configurado con amplios controles de acceso sobre las peticiones de usuarios.
Jerarquías de caché
- Squid puede formar parte de una jerarquía de caches. Diversos proxys trabajan conjuntamente sirviendo las peticiones de las páginas. Un navegador solicita siempre las páginas a un sólo proxy, si este no tiene la página en la caché hace peticiones a sus hermanos, que si tampoco las tienen las hacen a su/s padre/s… Estas peticiones se pueden hacer mediante dos protocolos: HTTP e ICMP. ICP, HTCP, CARP, caché digests.
- Squid sigue los protocolos ICP, HTCP, CARP y caché digests que tienen como objetivo permitir a un proxy “preguntarle” a otros proxys caché si poseen almacenado un recurso determinado.
Caché transparente
- Squid puede ser configurado para ser usado como proxy transparente de manera que las conexiones son enrutadas dentro del proxy sin configuración por parte del cliente, y habitualmente sin que el propio cliente conozca de su existencia. De modo predefinido Squid utiliza el puerto 3128 para atender peticiones, sin embargo se puede especificar que lo haga en cualquier otro puerto disponible o bien que lo haga en varios puertos disponibles a la vez.
WCCP
- A partir de la versión 2.3 Squid implementa WCCP (Web Cache Control Protocol). Permite interceptar y redirigir el trafico que recibe un router hacia uno o más proxys caché, haciendo control de la conectividad de los mismos. Además permite que uno de los proxys caché designado pueda determinar como distribuir el tráfico redirigido a lo largo de todo el array de proxys caché.
Control de acceso
- Ofrece la posibilidad de establecer reglas de control de acceso. Esto permite establecer políticas de acceso en forma centralizada, simplificando la administración de una red.
Aceleración de servidores HTTP
- Cuando un usuario hace petición hacia un objeto en Internet, este es almacenado en el caché, si otro usuario hace petición hacia el mismo objeto, y este no ha sufrido modificación alguna desde que lo accedió el usuario anterior, Squid mostrará el que ya se encuentra en el caché en lugar de volver a descargarlo desde Internet.
- Esta función permite navegar rápidamente cuando los objetos ya están en el caché y además optimiza enormemente la utilización del ancho de banda.
SNMP
- Squid permite activar el protocolo SNMP, este proporciona un método simple de administración de red, que permite supervisar, analizar y comunicar información de estado entre una gran variedad de máquinas, pudiendo detectar problemas y proporcionar mensajes de estados.
Caché de resolución DNS
- Squid está compuesto también por el programa dnsserver, que se encarga de la búsqueda de nombres de dominio. Cuando Squid se ejecuta, produce un número configurable de procesos dnsserver, y cada uno de ellos realiza su propia búsqueda en DNS. De este modo, se reduce la cantidad de tiempo que la caché debe esperar a estas búsquedas DNS.
Protocolo HTTP
El procotolo HTTP se basa principalmente en pedir objetos por medio de mensajes, los cuales se cachean individualmente. Entonces si un objeto esta incluido en dos o mas paginas, este puede ser reutilizado desde el cache.
Mensaje de pedido
El mensaje de pedido esta compuesto por diferentes partes, comandos y encabezados.
Por ejemplo
GET http://cayu.com.ar HTTP/1.0 Accept : Text/html If-Modified-Since : Saturday, 11-January-2011 11:32:11 GMT User-Agent : Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16
Comandos
Comando | Descripción | ||
---|---|---|---|
GET | Solicita el recurso ubicado en la URL especificada | ||
HEAD | Solicita el encabezado del recurso ubicado en la URL especificada | ||
POST | Envía datos al programa ubicado en la URL especificada | ||
PUT | Envía datos a la URL especificada | ||
DELETE | Borra el recurso ubicado en la URL especificada |
Encabezados
Nombre del encabezado | Descripción | ||
---|---|---|---|
Accept | Tipo de contenido aceptado por el navegador | ||
Accept-Charset | Juego de caracteres que el navegador espera | ||
Accept-Encoding | Codificación de datos que el navegador acepta | ||
Accept-Language | Idioma que el navegador espera | ||
Authorization | Identificación del navegador en el servidor | ||
Content-Encoding | Tipo de codificación para el cuerpo de la solicitud | ||
Content-Language | Tipo de idioma en el cuerpo de la solicitud | ||
Content-Length | Extensión del cuerpo de la solicitud | ||
Content-Type | Tipo de contenido del cuerpo de la solicitud | ||
Date | Fecha en que comienza la transferencia de datos | ||
Forwarded | Utilizado por equipos intermediarios entre el navegador y el servidor | ||
Link | Vínculo entre dos direcciones URL | ||
Referer | Dirección URL desde la cual se realizó la solicitud | ||
User-Agent | Cadena con información sobre el cliente, como versiones de navegador y sistema operativo |
Mensaje de respuesta
Es el mensaje recibido por parte del servidor
Un ejemplo :
HTTP/1.0 200 OK Date: Sat, 14 Jan 2011 11:32:12 GMT Server : Apache/1.3 Content-Type : text/HTML Content-Length : 1245
Códigos de respuesta
Código | Mensaje | Descripción | ||
---|---|---|---|---|
200 | OK | La solicitud se llevó a cabo de manera correcta | ||
201 | CREATED | Sigue a un comando POST e indica el éxito, la parte restante del cuerpo indica la dirección URL donde se ubicará el documento creado recientemente | ||
202 | ACCEPTED | La solicitud ha sido aceptada, pero el procedimiento que sigue no se ha llevado a cabo | ||
203 | PARTIAL | INFORMATION Cuando se recibe este código en respuesta a un comando de GET indica que la respuesta no está completa | ||
204 | NO RESPONSE | El servidor ha recibido la solicitud, pero no hay información de respuesta | ||
205 | RESET CONTENT | El servidor le indica al navegador que borre el contenido en los campos de un formulario | ||
206 | PARTIAL CONTENT | Es una respuesta a una solicitud que consiste en el encabezado range. El servidor debe indicar el encabezado content-Range | ||
301 | MOVED | Los datos solicitados han sido transferidos a una nueva dirección | ||
302 | FOUND | Los datos solicitados se encuentran en una nueva dirección URL, pero, no obstante, pueden haber sido trasladados | ||
303 | METHOD | Significa que el cliente debe intentarlo con una nueva dirección; es preferible que intente con otro método en vez de GET | ||
304 | NOT MODIFIED | Si el cliente llevó a cabo un comando GET condicional (con la solicitud relativa a si el documento ha sido modificado desde la última vez) y el documento no ha sido modificado, este código se envía como respuesta | ||
400 | BAD REQUEST | La sintaxis de la solicitud se encuentra formulada de manera errónea o es imposible de responder | ||
401 | UNAUTHORIZED | Los parámetros del mensaje aportan las especificaciones de formularios de autorización que se admiten. El cliente debe reformular la solicitud con los datos de autorización correctos | ||
402 | PAYMENT REQUIRED | El cliente debe reformular la solicitud con los datos de pago correctos | ||
403 | FORBIDDEN | El acceso al recurso simplemente se deniega | ||
404 | NOT FOUND | El servidor no halló nada en la dirección especificada. Se ha abandonado sin dejar una dirección para redireccionar | ||
500 | INTERNAL ERROR | El servidor encontró una condición inesperada que le impide seguir con la solicitud | ||
501 | NOT IMPLEMENTED | El servidor no admite el servicio solicitado | ||
502 | BAD GATEWAY | El servidor que actúa como una puerta de enlace o proxy ha recibido una respuesta no válida del servidor al que intenta acceder | ||
503 | SERVICE UNAVAILABLE | El servidor no puede responder en ese momento debido a que se encuentra congestionado (todas las líneas de comunicación se encuentran congestionadas, inténtelo de nuevo más adelante) | ||
504 | GATEWAY TIMEOUT | La respuesta del servidor ha llevado demasiado tiempo en relación al tiempo de espera que la puerta de enlace podía admitir |
Proxy Web
El proxy caché es una manera de guardar los objetos solicitados de Internet (por ejemplo, datos como páginas web) disponibles vía protocolos HTTP, FTP y Gopher en un sistema más cercano al lugar donde se piden. Los navegadores web pueden usar la caché local Squid como un servidor proxy HTTP, reduciendo el tiempo de acceso así como el consumo de ancho de banda.
Esto es muchas veces útil para los proveedores de servicios de Internet para incrementar la velocidad de sus consumidores y para las redes de área local que comparten la conexión a Internet.
Squid tiene algunas características que pueden facilitar establecer conexiones anónimas. Características tales como eliminar o modificar campos determinados de la cabecera de peticiones HTTP de los clientes. Esta política de eliminación y alteración de cabeceras se establece en la configuración de Squid. El usuario que solicita páginas a través de una red que utiliza Squid de forma transparente, normalmente no es consciente de este proceso o del registro de información relacionada con el proceso.
Ejemplo 1: Un cliente accediendo a un sitio HTTP
Peticion HTTP del browser al proxy:
GET http://www.google.com.ar/ HTTP/1.0. User-Agent: Wget/1.10.2. Accept: */*. Host: www.google.com.ar.
Repuesta HTTP que viene del proxy:
HTTP/1.0 200 OK Date: Mon, 11 Apr 2011 18:29:40 GMT Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=ISO-8859-1 Set-Cookie: PREF=ID=254d91dfb90cf60a:FF=0:TM=1302546580:LM=1302546580:S=duVgVs06FzQnoCCm; expires=Wed, 10-Apr-2013 18:29:40 GMT; path=/; domain=.google.com.ar Set-Cookie: NID=45=vuPgKmuchyxsG7F3TLbslY9ct2oGYjvUQ4F5e3mYwzKHABfMfStVkmnALugH1VSNkWbGISJ4Hr-xw_w9qXlmYn8qvcCg6GzuhZv89VDqU4aDpptEQLM1pNpcMS4o9VPm; expires=Tue, 11-Oct-2011 18:29:40 GMT; path=/; domain=.google.com.ar; HttpOnly Server: gws X-XSS-Protection: 1; mode=block X-Cache: MISS from proxy.cayu.com.ar X-Cache-Lookup: MISS from proxy.cayu.com.ar:8080 Via: 1.0 proxyfree:8080 (squid/2.6.STABLE21) Proxy-Connection: close
Ejemplo 2: Un cliente accediendo a un sitio FTP
Mensaje del browser al proxy:
GET ftp://ftp.gnu.org/ HTTP/1.0. User-Agent: Wget/1.10.2. Accept: */*. Host: ftp.gnu.org.
Respuesta del proxy:
HTTP/1.0 200 OK Server: squid/2.6.STABLE21 Date: Mon, 11 Apr 2011 18:40:08 GMT Content-Type: text/html X-Cache: MISS from proxy.cayu.com.ar X-Cache-Lookup: MISS from proxy.cayu.com.ar:8080 Via: 1.0 proxyfree:8080 (squid/2.6.STABLE21) Proxy-Connection: close
Ejemplo 3: Un cliente accediendo a un sitio HTTPS
Mensaje del cliente:
CONNECT gmail.google.com:443 HTTP/1.0 User-Agent: Wget/1.10.2.
Respuesta del proxy:
HTTP/1.1 200 Connection Established.
Este método arma un túnel a través del proxy. Como el tráfico esta cifrado, Squid no puede hacer nada con esos datos.
Requisitos del sistema
Squid puede ejecutarse en los siguientes Sistemas Operativos:
- AIX
- BSDI
- Digital Unix
- FreeBSD
- HP-UX
- IRIX
- GNU/Linux
- Mac OS X
- NetBSD
- NeXTStep
- OpenBSD
- SCO Unix
- SunOS/Solaris
- Windows NT
Para Windows se utilizan los paquetes Cygwin/GnuWin32. Obs.: Existen, actualmente, paquetes que corren squid en W32 sin necesidad de Cygwin.
Implementación
Compilación
Para la puesta en marcha de un servidor Squid, su instalación puede realizar desde paquetes provisto por la distribución:
apt-get install squid squid-common
O desde el código fuente. Siempre se recomienda la primera por cuestiones de mantenibilidad y upgrades, pero en algunos casos es necesario usar la versión desde las fuentes.
A continuación se muestran los pasos de instalación desde el source.
# ./configure --enable-storeio=diskd --prefix=/usr/local --enable-snmp --enable-delay-pools --sysconfdir=/etc/squid --enable-external-acl-helpers=ldap_group --enable-auth=basic --enable-arp-acl --enable-cache-digests --enable-linux-netfilter # make # make install
El “configure” tiene una serie de opciones para habilitar características especiales del proxy. Algunos ejemplos:
- –enable-snmp, para que Squid muestre OID's sobre su funcionamiento.
- –enable-auth, para habilitar esquemas de autenticación, por ejemplo:
- –enable-auth=“basic”, para activar autenticación básica.
- –enable-ssl, SSL para proxies reversos.
- –enable-basic-auth-helpers=, para activar alguno/s de los módulos que vienen con squid, LDAP por ejemplo.
- –enable-linux-netfilter Soporte de la capa de Netfilter de Linux para Squid.
- –help, muestra todas las opciones disponibles de compilación.
Configuración
Por la opción de compilación –sysconfdir, el archivo de configuración principal lo tendremos en =/etc/squid/squid.con. Este archivo tiene activado una serie de parámetros default para ayudarnos a ponerlo en funcionamiento
El primer paso es vericar el path de los logs y del cache, y también el usuario con el que corre el Squid, observando el valor de los siguientes parámetros (los default se encuentran comentados, pero están activos):
- cache_access_log
- Archivo de log principal
- Default : /var/log/squid/access.log
- cache_dir
- Directorio donde se almacenara el cache
- Default : cache_dir diskd /var/spool/squid 6000 64 256
- cache_effective_user
- Usuario propietario del contenido del directorio de cache
- cache_effective_group
- Grupo propietario del contenido del directorio de cache
Y por ultimo, inicializamos el cache y levantamos el servicio:
# /usr/local/squid/sbin/squid -z # /usr/local/squid/sbin/squid
Corriendo también su script de inicio ejecutará automáticamente todos estos pasos :
# /etc/init.d/squid
Controles de acceso
El control de acceso se divide básicamente en dos parametros
- acl
- Expresión coincidente con algo
- http_access
- Acción a llevar a cabo con dicha expresión coincidente
Ejemplo :
acl red_denegada src 78.0.0.0/8 http_access deny red_denegada http_access allow all
En este caso estamos indicando que se deniegue cualquier pedido de la red 78.0.0.0/8 y que se permita cualquier pedido de otra red. Es un caso hipotético igualmente podria aplicarse a una red 192.168.2.0/255.255.255.0.
Lista de opciones mas usuales de la directiva acl
- arp - Control por MAC Address
- acl ACLARP arp 11:12:13:14:15:16
- src - Control por ip del Cliente
- dst - Dirección de destino
- dstdomain - Dominio de destino
- time - Franja horaria de acceso
- acl ACLTIME time M T W H F 9:00-17:00
- url_regex - Expresión regular de destino
- port - Puerto de destino
- proto - Procotolo
- acl aclname proto HTTP FTP
- method - Método del mensaje de pedido
- acl aclname method GET POST CONNECT
Algunos ejemplos :
Definición
acl facebook dstdomain facebook.com → es una acl igual a el domino destino facebook.com
acl mired src 192.168.0.0/24 → es igual a la red 192.168.0.0/24
acl mp3 url_path_regex \.mp3$ → es igual a todas las URLs que terminen en .mp3.
Aplicación
http_access allow facebook → permito navegar cuando coincida la ACL llamada facebook
http_access deny clarin → deniego la navegacion cuando haya coincidencia con la ACL facebook
http_access allow mired → permito navegar si hay una coincidencia con la ACL mired