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:
- Soporta HTTP y FTP.
- Tiene un avanzado mecanismo de autentificacion y control de acceso (o sea, a quien y cuando permitimos utilizar el proxy).
- Permite actuar como cache de Internet, copiando contenido en forma local para que se lo pueda acceder rápidamente.
- 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
aufses una directiva que aumenta el rendimiento de squid. Ya que lo vuelve multithread. La opción por defecto esufs./var/spool/squides 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 sí 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
-ies 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. regexse refiere a una expresión regular que define a que tipo de objeto apuntamos con este patrón.mines el tiempo (en minutos) que un objeto, sin tiempo explísito de expiración, debe considerarse fresco.porcentajees (valga la redundancia) el porcentaje de vida promedio de un objeto, en el que éste debe considerarse fresco.maxes el tiempo máximo (en minutos) que un objeto, sin tiempo explícito de expiración, debe considerarse fresco.- Las
opcionespermiten 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).

