Proxy

De XTech Capacitacion

Existen una cierta cantidad de términos que debemos conocer antes de configurar un servidor proxy, ya sea directo o transparente.

Entender dichos términos, nos permitirá comprender en mayor profundidad los comentarios, ejemplos y documentación que suelen acompañar a los paquetes de software de esta categoría y de todo el software libre en general.

En este caso, el término "proxy" es tomado de forma incorrecta. Ya que muchos hablan de "proxies" cuando en verdad hablan de un "router" o de NAT.

Veamos las ventajas de usar el proxy Squid:

  1. Soporta HTTP y FTP.
  2. Tiene un avanzado mecanismo de autentificacion y control de acceso (o sea, a quien y cuando permitimos utilizar el proxy).
  3. Permite actuar como cache de Internet, copiando contenido en forma local para que se lo pueda acceder rápidamente.
  4. Es Software Libre.

Tabla de contenidos

Términos importantes

Proxy

Mucha gente confunde el término Proxy con el de Gateway (o “puerta de enlace predeterminada”, según la traducción de cierta empresa).

En una red privada 192.168.0.0 Clase C (Máscara 255.255.255.0 o '/24'), se necesita un gateway si es que deseamos llegar a otras redes, como Internet. Dicho Gateway poseerá la cantidad de interfaces necesarias y rutas establecidas y políticas de acceso que permitirán o no el acceso a ciertos destinos desde esta red interna.

Por supuesto, en este caso hablamos de acceso “transparente” (por así decirlo) a la red destino en cuestión. Esto significa que el Gateway no tiene en cuenta el protocolo de aplicación (HTTP, FTP, etc) o mejor dicho que “no los entiende ni tiene en cuenta excepto por puerto de origen o destino”.

Por ejemplo, se puede asumir que en el puerto 80 de cierta IP de destino habrá un servicio que entienda HTTP... pero el gateway no puede asegurarlo.

Un proxy actúa como gateway pero a un nivel más alto, en la llamada “capa de aplicación”. Significa que entiende HTTP, FTP, u algún otro protocolo de alto nivel y que acepta por parte de un cliente (de la red interna, por ejemplo) solicitudes vinculadas a dicho protocolo.

El proxy realizará, a su vez, la solicitud al servidor de destino, tomará el resultado y lo devolverá. Al tener conocimiento del protocolo se pueden aplicar reglas mucho más interesantes, como restricciones basadas en contenido, partes del nombre de un sitio, usuario, grupo al que un usuario pertenece, IP de origen, etc.

Squid es un proxy de HTTP y FTP y a su vez provee la funcionalidad de cache (guarda copias de las páginas y archivos visitados). De esta forma, cada vez que un usuario vuelve a acceder a cierto sitio, sólo el contenido que haya cambiado será transferido, logrando una reducción de la utilización del ancho de banda disponible.

En resumen, el cliente no accede realmente a internet, sino que le solicita al proxy lo que quiere, el proxy a su vez lo busca en Internet, lo transfiere y luego se lo da al cliente. Es menos directo que NAT, donde se trabaja a nivel IP y no a nivel aplicacion.

Transparente

El hecho de que sea transparente permite al administrador lograr que toda solicitud HTTP (puerto de destino 80/tcp) realizada por un cliente de la red interna sea automáticamente redirigida al Proxy, evitando la salida directa. Los motivos para realizar ésto pueden depender del administrador, pero seguramente tengan que ver con políticas de administración de recursos, seguridad, performance, etc. Esto se realiza, como ya dijimos, mediante reglas FORWARD de Iptables.

Configuración Genérica de Squid

Lo principal es saber que el sitio oficial es www.squid-cache.org y no www.squid.org.

Una vez compilado e instalado el Squid, debemos configurarlo. A decir verdad esto es bastante simple: el archivo de configuracion /etc/squid/squid.conf esta lleno de parámetros, pero solo unos pocos debemos modificar en cualquier caso.

Puerto

Se trata de la directiva http_port, que por defecto está en el puerto 3128. Aunque esto se puede cambiar al que más nos guste (en algunos casos se elige el 8080). Queda así:

http_port 8080

Tamaño del archivo cacheable

Este es el tamaño máximo de un archivo de Squid va a cachear. Esta directiva (maximum_object_size) es por defecto de 4 Mb, lo que resulta totalmente chico para una red corporativa. Lo vamos a reemplazar por 150 Mb (153600 bytes) ya que es un valor más apropiado. Los archivos de más de ese tamaño no serán cacheados.

maximum_object_size 153600 KB

Uso de memoria

El primer parámetro a tocar es cache_mem. Especifica la cantidad de memoria RAM, que Squid utilizará.

Según recomendacion de los autores, si tenemos "X" RAM que querramos dedicar al Squid, pongamos aqui un TERCIO de dicho valor (X/3).

cache_mem 6 MB

Tamaño del directorio de cache

Luego podemos seguir por cache_dir, donde especificaremos el donde y el cuanto de la Cache.

Por ejemplo:

cache_dir aufs /var/spool/squid 3072 16 256
  • aufs es una directiva que aumenta el rendimiento de squid. Ya que lo vuelve multithread. La opción por defecto es ufs.
  • /var/spool/squid es el directorio raiz donde estarán los archivos cacheados.
  • El valor 3072 indica la cantidad de Mb que dispondremos de disco para caché, como máximo. Al 16 y al 256 es probable que no necesitemos nunca cambiarlos, e indican al Squid como utilizar los 3072 Mb.


Patrones de refresco

Los patrones de refresco es la parte fundamental para hacer eficiente a Squid. Esto sucede porque su función es determinar que archivos se consideran frescos (y no deben volver a solicitarse a la url), separándolos de los que no cumplen dicha condición (y deben volver a solicitarse).

El mecanismo es complejo, porque la función de esta etiqueta es compleja. Por eso es que incluímos una buena cantidad de sugerencias que podrán servir de ejemplo.

La sinopsis de la etiqueta es la siguiente:

 refresh_pattern [-i] regex min porcentaje max [opciones]
  • Como vemos -i es opcional (porque está entre corchetes). Lo que hace es activar la opción "case-insensitive", o sea, que no distinga mayúsculas de minúsculas. Si no ponemos esta opción, por defecto, es case-sensitive, como todo en Linux.
  • regex se refiere a una expresión regular que define a que tipo de objeto apuntamos con este patrón.
  • min es el tiempo (en minutos) que un objeto, sin tiempo explísito de expiración, debe considerarse fresco.
  • porcentaje es (valga la redundancia) el porcentaje de vida promedio de un objeto, en el que éste debe considerarse fresco.
  • max es el tiempo máximo (en minutos) que un objeto, sin tiempo explícito de expiración, debe considerarse fresco.
  • Las opciones permiten que cambiemos el comportamiento natural de estos tres parámetros de maneras expecíficas. Son muy poco utilizadas, por lo que no explicaremos acá su funcionamiento. En el manual de configuración de Squid (el link está en la sección Bibliografía).

Lógica de implementación

Squid irá planteandose la siguiente lógica en este orden.

Un objeto es FRESCO sí:

Su fecha de expiración es menor que la actual. Sino es VIEJO. Y se solicita a la url.

Un objeto es VIEJO sí:

Su edad es mayor que max. Y se solicita a la url.

Un objeto es FRESCO sí:

El factor de última modificación (lm-factor) es menor a porcentaje, sino es VIEJO. Y se solicita a la url.

Un objeto es FRESCO sí:

Su edad es menor que min. Sino es VIEJO. Y se solicita a la url.

Ejemplos

Estas son sugerencias basadas en la experiencia. Por lo que pueden ser usadas pero para cada caso puede requerir ajustes. Uselo con precaución.

# Debian
refresh_pattern -i \.deb$   129600 100% 129600

En este grupo tenemos los archivos terminados en .deb.

Si el objeto no expiró, se pasa a la siguiente etapa.
Si el objeto tiene más de 129600 minutos (3 meses)en caché, es VIEJO, por lo que se descarga nuevamente. Sino...
Si el factor de última modificación es mayor que 100% (eso es imposible para este caso), se descarga nuevamente. Sino...
Si el objeto tiene menos de 3 meses en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.

Aclaración: Estos objetos se mantendrán frescos el 100% de su tiempo de vida promedio (el tiempo promedio que pasa entre una solicitud y otra).

# Red Hat / Mandriva
refresh_pattern -i \.rpm$   129600 100% 129600

Lo mismo que el anterior patrón pero para los paquetes RPM que usan las máquinas con sistemas derivados de Red Hat.

# Archivos comprimidos
refresh_pattern -i \.gz$   129600 100% 129600
refresh_pattern -i \.bz2$   129600 100% 129600

Estos objetos (que son todos los archivos comprimidos), tienen 3 meses de tiempos de frescura máximo y mínimo. Y se mantienen frescos por toda su vida promedio.

# Imagenes
refresh_pattern -i \.gif$ 14400 80% 43200
refresh_pattern -i \.tiff?$ 14400 80% 43200
refresh_pattern -i \.bmp$ 14400 80% 43200
refresh_pattern -i \.jpe?g$ 14400 80% 43200
refresh_pattern -i \.xbm$ 14400 80% 43200
refresh_pattern -i \.png$ 14400 80% 43200
refresh_pattern -i \.wrl$ 14400 80% 43200
refresh_pattern -i \.ico$ 14400 80% 43200
refresh_pattern -i \.pnm$ 14400 80% 43200
refresh_pattern -i \.pbm$ 14400 80% 43200
refresh_pattern -i \.pgm$ 14400 80% 43200
refresh_pattern -i \.ppm$ 14400 80% 43200
refresh_pattern -i \.rgb$ 14400 80% 43200
refresh_pattern -i \.ppm$ 14400 80% 43200
refresh_pattern -i \.rgb$ 14400 80% 43200
refresh_pattern -i \.xpm$ 14400 80% 43200
refresh_pattern -i \.xwd$ 14400 80% 43200
refresh_pattern -i \.pict?$ 14400 80% 43200
Si el objeto no expiró, se pasa a la siguiente etapa.
Si el objeto tiene más de 43200 minutos (1 mes)en caché, es VIEJO, por lo que se descarga nuevamente. Sino...
Si el factor de última modificación es mayor que 80%, se descarga nuevamente. Sino...
Si el objeto tiene menos de 10 días en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.
# Peliculas
refresh_pattern -i \.mov$ 14400 80% 43200
refresh_pattern -i \.mpe?g?$ 14400 80% 43200
refresh_pattern -i \.avi$ 14400 80% 43200
refresh_pattern -i \.qtm?$ 14400 80% 43200
refresh_pattern -i \.viv$ 14400 80% 43200
refresh_pattern -i \.swf$ 14400 80% 43200 
Si el objeto no expiró, se pasa a la siguiente etapa.
Si el objeto tiene más de 43200 minutos (1 mes)en caché, es VIEJO, por lo que se descarga nuevamente. Sino...
Si el factor de última modificación es mayor que 80%, se descarga nuevamente. Sino...
Si el objeto tiene menos de 10 días en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.
# Sonido
refresh_pattern -i \.wav$ 14400 80% 43200
refresh_pattern -i \.aiff?$ 14400 80% 43200
refresh_pattern -i \.au$ 14400 80% 43200
refresh_pattern -i \.ram?$ 14400 80% 43200
refresh_pattern -i \.snd$ 14400 80% 43200
refresh_pattern -i \.mid$ 14400 80% 43200
refresh_pattern -i \.mp2$ 14400 80% 43200
refresh_pattern -i \.mp3$ 14400 80% 43200
Si el objeto no expiró, se pasa a la siguiente etapa.
Si el objeto tiene más de 43200 minutos (1 mes)en caché, es VIEJO, por lo que se descarga nuevamente. Sino...
Si el factor de última modificación es mayor que 80%, se descarga nuevamente. Sino...
Si el objeto tiene menos de 10 días en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.
# archivos varios
refresh_pattern -i \.sit$ 14400 80% 43200
refresh_pattern -i \.zip$ 14400 80% 43200
refresh_pattern -i \.hqx$ 14400 80% 43200
refresh_pattern -i \.exe$ 14400 80% 43200
refresh_pattern -i \.arj$ 14400 80% 43200
refresh_pattern -i \.lzh$ 14400 80% 43200
refresh_pattern -i \.lha$ 14400 80% 43200
refresh_pattern -i \.cab$ 14400 80% 43200
refresh_pattern -i \.rar$ 14400 80% 43200
refresh_pattern -i \.tar$ 14400 80% 43200
refresh_pattern -i \.gz$ 14400 80% 43200
refresh_pattern -i \.z$ 14400 80% 43200
refresh_pattern -i \.a[0-9][0-9]$ 14400 80% 43200
refresh_pattern -i \.r[0-9][0-9]$ 14400 80% 43200 

Acá tenemos alguna diferencia en la expresión regular que nos dice que apliquemos la etiqueta a los objetos terminados en .a con dos dígitos numéricos a continuación. Por el resto, es:

Si el objeto no expiró, se pasa a la siguiente etapa.
Si el objeto tiene más de 43200 minutos (1 mes)en caché, es VIEJO, por lo que se descarga nuevamente. Sino...
Si el factor de última modificación es mayor que 80%, se descarga nuevamente. Sino...
Si el objeto tiene menos de 10 días en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.
# Archivos de documentacion
refresh_pattern -i \.txt$ 14400 80% 43200
refresh_pattern -i \.pdf$ 14400 80% 43200
refresh_pattern -i \.doc$ 14400 80% 43200
refresh_pattern -i \.rtf$ 14400 80% 43200
refresh_pattern -i \.tex$ 14400 80% 43200
refresh_pattern -i \.latex$ 14400 80% 43200 
Si el objeto no expiró, se pasa a la siguiente etapa.
Si el objeto tiene más de 43200 minutos (1 mes)en caché, es VIEJO, por lo que se descarga nuevamente. Sino...
Si el factor de última modificación es mayor que 80%, se descarga nuevamente. Sino...
Si el objeto tiene menos de 10 días en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.
# Java-type objects
refresh_pattern -i \.class$ 14400 80% 43200
refresh_pattern -i \.js$ 14400 80% 43200
refresh_pattern -i \.class$ 14400 80% 43200 
Si el objeto no expiró, se pasa a la siguiente etapa.
Si el objeto tiene más de 43200 minutos (1 mes)en caché, es VIEJO, por lo que se descarga nuevamente. Sino...
Si el factor de última modificación es mayor que 80%, se descarga nuevamente. Sino...
Si el objeto tiene menos de 10 días en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.
# Web-type objects
refresh_pattern -i \.css$ 10 20% 4320
refresh_pattern -i \.html?$ 10 20% 4320
refresh_pattern \/$ 10 20% 4320
Si el objeto no expiró, se pasa a la siguiente etapa.
Si el objeto tiene más de 4320 minutos (3 días)en caché, es VIEJO, por lo que se descarga nuevamente. Sino...
Si el factor de última modificación es mayor que 20%, se descarga nuevamente. Sino...
Si el objeto tiene menos de 10 minutos en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.
# Default
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern . 		0 	20% 	4320

Acá la expresión regular nos dice que si el objeto comienza con ftp: o gopher: o . que actue con esos valores.

Listas de control de acceso

Esta sección prepara a Squid para otra de sus funciones (que difiere totalmente de la anterior). Tiene que ver con la posibilidad de fijar reglas en forma de listas (acl) que mostrarán los criterios a aplicarse en la red corporativa (como complemento del firewall).

Por defecto queremos permitirle la utilizacion del Proxy a nuestra red interna solamente.

El siguiente bloque es un ejemplo para una red 192.168.10.0 con máscara 255.255.255.0. Se permitira acceso toda esta red y al localhost (127.0.0.1), esto se logra definiendo 4 acl's:

La del administrador (de uso interno del Squid), la de localhost, una global que hable de TODA direccion IP posible y la de permitidos (nuestra red privada).

En este ejemplo, asumimos una red privada clase C 192.168.10.0 a la cual denominamos "permitidos". La regla acl "todos" generalmente se denomina "all" en Squid, y viene definida por defecto.

acl localhost src 127.0.0.1/255.255.255.255
acl todos src 0.0.0.0/0.0.0.0
acl permitidos src 192.168.10.0/255.255.255.0
http_access allow permitidos localhost
http_access deny todos
icp_access allow permitidos localhost
icp_access deny todos

Los indicadores 'deny' y 'allow' significan "denegar" y "permitir", respectivamente, a las solicitudes que concuerden con las ACL definidas mas arriba en cada protocolo.

El orden es de 'allow, deny'. Primero indico a quienes permito, luego deniego a todos los demas. Quizás quieran hacer esto por cada {PROTOCOLO}_access que les parezca.

Quiza querramos modificar el 'cache_mgr', para indicar la direccion de e-mail nuestra. Así, si algún usuario tiene problemas, sabe a quien contactar.

'visible_hostname' indica el nombre del Host que se publicara en paginas de error y otras generadas por Squid.

Luego, debemos indicar con que usuario y grupo debe funcionar el Squid, luego de haber sido iniciado con root desde los scripts de inicio (o a mano por el root mismo). Esto lo hacemos con 'cache_effective_user' y 'cache_effective_group'.

Valores recomendados

Algo del estilo 'nobody' y 'nogroup'. Una vez editado el squid.conf, debemos inicializar la cache, y luego ejecutar el Squid. Esto lo hacemos de la siguiente forma:

Inicializar la cache:

/usr/local/squid/bin/squid -z

Ejecutar el Squid:

/usr/local/squid/bin/squid

Ahora, debemos revisar /usr/local/squid/logs/cache.log. Debemos fijarnos si esta todo bien. Van a encontrar un par de errores al principio de todo, algo común la primera vez que se ejecuta el Squid.

Una vez andando, debemos probarlo: vayamos a un cliente, configuremos el uso del proxy para el protocolo HTTP en el puerto 3128 (el por defecto de Squid, el cual se puede cambiar desde la directiva 'http_port') y listo.

Si anda... perfecto. Si no... verifiquen que el Squid este ejecutándose ('ps ax', 'nmap',lsof -iTCP:3128', etc).

Presentación gráfica

Bibliografía

http://squid.visolve.com/squid/squid30/contents.html
http://www.buanzo.com.ar
Herramientas personales