julio 22, 2013

Squid Cache

Last Update: Feb 19/2015
Uno de los términos más confusos y a la vez de mayor utilidad en un servidor proxy Squid es la 'cache de disco'. Cuando hablamos de 'cache de disco', muchos la relacionan erróneamente con la 'cache de buffer', de la cual también hablaremos en este post.
Tener una cache de disco en un servidor proxy linux con Squid representa un ahorro considerable en ancho de banda y navegabilidad. Esto se debe a que almacena los sitios webs que visitan los usuarios de nuestra LAN, para que la próxima vez que visiten el mismo sitio, la cache del proxy sea quien le facilite la página, y solo se actualiza cuando haya cambios (al menos en teoría).
Esta cache puede tener otras; en dependencia del nivel se puede configurar como padre o hermano. En otras palabras, se pueden establecer múltiples discos duros dedicados a "cachear" páginas webs, interconectados entre sí, para acelerar la navegación.
Configurando la Cache de Disco
Para establecer el espacio del disco duro para la cache, se necesita modificar el parámetro correspondiente a la cache de directorios en el Squid. Edite su archivo de configuración según la versión de Squid que vaya a usar:
sudo nano /etc/squid3/squid.conf
Busque la línea de la cache y descoméntela para evitar el mensaje de que la caché de Squid no puede inicializar.
cache_dir ufs /var/spool/squid3 100 16 256
Y cambie el valor 100, que viene por defecto, por el tamaño que quiera asignarle expresado en MB. Ejemplo de asignación de 100GB aproximadamente en un disco de 200GB (50%) y cambie ufs por aufs para mejorar el rendimiento.
cache_dir aufs /var/spool/squid 100000 16 256
Todo está en dependencia del tamaño del disco duro, partición o porción de disco que quiera asignarle a la cache. Sea prudente y recuerde que Linux deja un 5% de espacio reservado en el disco duro para el SO y otros procesos, y si bien se puede modificar este valor mediante tune2fs, no lo recomendamos.
Sugerimos usar entre un 50% a un máximo de 80% del espacio libre disponible en su disco duro. Si tiene un DD dedicado para la cache mucho mejor. Los otros valores no se recomienda modificarlos, ya que demasiados directorios pueden provocar problemas de funcionamiento. (16 son los subdirectorios, y en cada uno de ellos se crearán 256 directorios). El parámetro ufs tampoco se debe alterar. En caso de disponer de más discos para repartir entre ellos el caché, se pueden especificar varias líneas de cache_dir
Vaciando y reconstruyendo la cache
En ocasiones la Cache de Disco necesita una purga general. Esto se debe a que se llena demasiado y en algunos SO basados en Linux, (al parecer un bug) la cache se desborda o no respeta los parámetros que le hemos dado en el archivo de configuración squid.conf, causando saturación y ralentización en la conectividad y en nuestro servidor. Este proceso también debe hacerse cuando actualizamos la versión de Squid.
Una excelente herramienta para hacer este trabajo la tiene Webmin.
Webmin tiene un módulo exclusivo para realizar la purga y reconstrucción de la cache de disco (o directorios), la cual recomendamos, sin embargo si quiere realizar el proceso manualmente (por terminal), haga lo siguiente dentro del directorio /var/spool/squid3/var/spool/squid
Para Squid2x
sudo service squid stop
Nos aseguramos que esté apagado
sudo service squid status
Borramos la carpeta de la cache
rm -rf cache/
Creamos la carpeta nueva
mkdir cache
Cambiamos los permisos
chown proxy:proxy  cache/
Creamos directorios
squid -zX
Iniciamos Squid
sudo service squid start
Para Squid3x
sudo service squid3 stop
Eliminamos el directorio que contiene la caché
sudo rm -Rf /var/spool/squid3/*
Creamos nuevamente los directorios a través de Squid3x
sudo squid3 -z
Iniciamos el servicio
sudo service squid3 start
Cache de Buffer
La "otra" cache, más conocida como Cache de Buffer, define la cantidad máxima de memoria RAM que utilizará Squid para sus procesos. La cantidad se establece de acuerdo a la RAM física total asignada al servidor y teniendo en cuenta los demás procesos. Su valor por defecto es 8 MB (en algunas versiones de Squid este valor es diferente)
Lo ideal es por cada 256MB asignar 32MB. O sea si el servidor tiene 4GB de RAM, se le debe asignar 512MB aproximadamente, aunque esto es relativo y depende mayormente de la RAM libre de su servidor.
cache_mem 512 MB
Para consultar el consumo de la RAM, ejecute el comando
free -m
Squid como Repositorio Caché
Otra cache de Squid es la llamada 'repositorio caché'. Principalmente sirve para almacenar en nuestro servidor las actualizaciones de los repositorios Ubuntu/Debian con el objeto de replicar en los terminales Linux de nuestra red local, evitando que cada equipo descargue las actualizaciones vía apt-get update desde Internet, y lo haga apuntando al Proxy Disk Caché, ahorrando ancho de banda.
El procedimiento es sencillo. Asumiendo que tiene instalado Squid, edite el archivo de configuración
sudo /etc/squid3/squid.conf
Por defecto, Squid trae la siguiente configuración
# maximum_object_size 4096 KB
# cache_replacement_policy lru
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
Ahora vamos a asignarle 100 mb de cache para objetos y modificar la frecuencia de refresco, ya que los paquetes que se descargan de los repositorios oficiales de Ubuntu, generalmente ninguno supera ese tamaño.
NOTA: Recuerde que a mayor tamaño, mayor serán los archivos que almacenará el Squid y más rápido se llenará la caché. Y de acuerdo al portal de Squid, existen 4 algoritmos de trabajo: lru, heap GDSF, heap LFUDA y heap LRU, pero el que ha demostrado mejor desempeño en escenarios de alta carga de trabajo es heap LFUDA. Por eso cambiamos lru por heap LFUDA.
refresh_pattern expresión_regular mín porcentaje máx es para establecer el tiempo de refresco entre los diferentes elementos
# tamaño mínimo y máximo de los objetos que se guardarán en memoria
# Ej: 200 Mb (maximum_object_size 20480 KB)
minimum_object_size 0 KB
maximum_object_size 4 MB
# objects are evicted (replaced) when disk space is needed
cache_replacement_policy heap LFUDA
# refresh_pattern (frecuencia de actualizacion de archivos) ref: maximum_object_size
# http://www.alterserv.com/foros/index.php?topic=363.msg2695#msg2695
# Calcule Minutos http://www.convertworld.com/es/tiempo/Minutos.html
# Agregue mas Extensiones http://filext.com/
# Nota: override-expire override-lastmod refresh-ims reload-into-ims ignore-reload ignore-no-store ignore-private ignore-auth ignore-must-revalidate pueden generar advertencia 'violates HTTP'
# Standard de actualización de objetos: Mayor a 43200 min (30d) download. Menor a 14400 min (10d) keep. Fecha de modificacion mayor a 80%, download
refresh_pattern -i .(gif|png|jp?g|ico|bmp|pict|tiff?)$ 14400 80% 43200  reload-into-ims ignore-no-store ignore-private ignore-auth refresh-ims
refresh_pattern -i .(swf|htm|html|shtm|shtml|nub)$ 14400 80% 43200  reload-into-ims ignore-no-store ignore-private ignore-auth refresh-ims refresh-ims
refresh_pattern -i .(rpm|cab|deb|exe|msi|msu|zip|tar|xz|bz|bz2|lzma|gz|tgz|rar|bin|7z|doc?|xls?|ppt?|pdf|nth|psd|sis)$ 14400 80% 43200  reload-into-ims ignore-no-store ignore-private ignore-auth refresh-ims
refresh_pattern -i .(avi|iso|wav|mid|ogg|mp?|mpe?g?|mpeg|aiff?|mov|3gp|wm?|flv|x-flv|axd)$ 14400 80% 43200 reload-into-ims ignore-no-store ignore-private ignore-auth refresh-ims
refresh_pattern -i .(qtm?|viv|au|ram?|snd|sit|hqx|arj|lzh|lha|txt|rtf|tex|latex|class|js|ico|do|dll|asf|dat|psf)$ 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
refresh_pattern -i \.css$ 10 20% 4320
# Default
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

# Opcional (Antivirus) (descomente la que necesite)
#refresh_pattern .avast.com/.*\.(vpu|stamp) 14400 80% 43200 reload-into-ims
#refresh_pattern .eset.com/.*\.(exe|rar|nup|ver) 4320 100% 43200 reload-into-ims
#refresh_pattern .avg.com/.*\.(rar|nup|ver) 4320 100% 43200 reload-into-ims
#refresh_pattern .pandasecurity.com/.*\.* 4320 100% 43200 reload-into-ims
#refresh_pattern .pandasoftware.com/.*\.exe 4320 100% 43200 reload-into-ims
#refresh_pattern .*downloads.*\.kaspersky-labs\.com/.*\.(.*)  1440 100% 1440 reload-into-ims
Reinicie el Squid (en dependencia de su version 2x o 3x)
sudo service squid restart
o
sudo service squid3 restart
El último paso es modificar el apt de los terminales con Linux que se conectarán a nuestro servidor de repositorios caché. Si existe apt.conf lo editamos
sudo gedit /etc/apt/apt.conf
Si no existe, pero hay una carpeta llamada /etc/apt.conf.d/, creamos un archivo con cualquier nombre (Ejemplo: cachedeb) y lo colocamos dentro de esta carpeta. En cualquiera de los casos, ya sea en el archivo apt.conf o en el que creamos, debe agregarle las siguientes líneas:
# Configuración para utilizar apt
Acquire {
  http {
    Proxy "http://192.168.1.10:3128";
  }
}
Donde 192.168.1.10 es la IP de nuestro servidor que tiene el Squid con el Disk Caché, y el puerto 3128, el el puerto por defecto de Squid (esto puede variar en dependencia de la ip y puerto asignado al Squid por el Administrador TI)
Si el proxy requiriere autenticación deberá colocarla en el archivo
# Configuración para utilizar apt
Acquire {
  http {
    Proxy "http://usuario:contrasena@192.168.1.10:3128";
  }
}
NOTA: Si expira o cambia la contraseña, debe actualizar el archivo con la nueva información.
Si existe el archivo /etc/apt/apt.conf se debe comentar la siguiente línea para que no falle el apt-get:
#Acquire::http::proxy “false”;
Tenga en cuenta que el servidor debe tener el mismo sistema operativo linux y la misma versión de los terminales de su red local, para que los repositorios que descargue le sirvan o generará error la actualización.
Para finalizar ejecute
sudo apt-get update
Cache Manager Interface
Squid v3.x tiene un bug relacionado con cachemgr.cgi, el cual se debate en el Foro Ubuntu, que consiste en que el nuevo cachemgr3.cgi está mal compilado, sin embargo se soluciona (casi en su totalidad) haciendo las modificaciones siguientes:
Edite su archivo de configuración del squid3 con el editor de su preferencia (asegúrese de tener instalado bien el squid3)
sudo apt-get install squid3-cgi squid3 squid3-common squid3-client
sudo gedit /etc/squid3/squid.conf
Verifique las siguientes directivas (Reemplace nombre_del_servidor por el nombre de su servidor).
acl manager proto cache_object
# Only allow cachemgr access from localhost
http_access allow manager nombre_del_servidor
http_access allow manager localhost
http_access deny manager
Nota: En la versión 3x de Squid las acls acl manager proto cache_object y acl localhost src 127.0.0.1/8 0.0.0.0/32 generan error por tanto debe eliminarlas
http_port (en dependencia de su Squid. Para 2x use la cláusula "transparent" y para 3x "intercept")
http_port 192.168.1.10:8080 transparent
o
http_port 192.168.1.10:8080 intercept
Active cachemgr_password (Reemplace su_contraseña por la contraseña deseada)
#Example:
# cachemgr_passwd secret shutdown
# cachemgr_passwd lesssssssecret info stats/objects
# cachemgr_passwd disable all
cachemgr_passwd su_contraseña all
Si usa Webmin, edite el archivo de configuración (como root puede utilizar nautilus para editarlo.
/etc/webmin/squid/config
Para squid3 debe quedar así:
sort_conf=0
squid_restart=service squid3 restart
squidclient=squidclient
cache_dir=/var/spool/squid3
sync_create=0
log_dir=/var/log/squid3
pid_file=/var/run/squid3.pid
cal_max=50000
squid_start=service squid3 start
sync_modify=1
cal_fmt=w
cal_all=1
cal_extra=
squid_path=squid3
calamaris=calamaris
squid_conf=/etc/squid3/squid.conf
sync_delete=0
cal_args=-aw
cachemgr_path=/usr/lib/cgi-bin/cachemgr.cgi
crypt_conf=0
restart_pos=0
squid_stop=service squid3 stop
Ahora edite el archivo de configuración de Cache Manager Interface (válido hasta squid 3.2x)
sudo cp /etc/squid/cachemgr.conf /etc/squid3/
sudo gedit /etc/squid3/cachemgr.conf
Reemplace la línea localhost por la ip y puerto de su servidor. Ejemplo:
192.168.1.10:8080
Reinicie squid
sudo service squid3 restart
Ahora cree una carpeta llamada squid en /etc y dentro copie los archivos cachemgr.conf y squid.conf que se encuentran en la carpeta squid3; o sea que estos dos archivos quedarán repetidos en las carpetas squid y squid3, (ambas en /etc), y luego dele los permisos necesarios. Al finalizar, reinicie los servicios.
Edite su archivo /etc/apache2/sites-enabled/000-default.conf e incluya la configuración: Para Squid3x
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

 AllowOverride None
 Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
 Require all granted
 
Y reinicie apache2
sudo service apache2 restart
Nota importante: Si tenía instalado anteriormente squid (2x), elimínelo primero y también el contenido de la carpeta, para evitar cualquier redirección al antiguo squid y luego reinicie y cree nuevamente la carpeta squid y haga el procedimiento indicado arriba.
sudo apt-get purge squid
sudo apt-get autoremove
sudo rm -rf squid
sudo reboot
Ahora ya puede acceder a Cache Manager Interface. Si accede por el Webmin
https://localhost:10000/squid3/cachemgr.cgi
O directamente por url en el navegador
http://localhost/cgi-bin/cachemgr.cgi
A partir de la v3.2x hasta la 3.3 cambia el enlace. Debe ingresar con el usuario y contraseña establecido en el squid.conf (cache_mgr y cachemgr_passwd)
# Ej: http://ip_del_servidor:puerto/squid-internal-mgr/info
http://192.168.1.10:3128/squid-internal-mgr/info
En la entrada Cache Server debe estar la ip y puerto de su servidor. En el campo Manager name debe colocar root y en Password, la contraseña que eligió en el archivo de configuración de squid3, en la directiva cachemgr_passwd
Muy importante:
Por alguna razón que desconocemos, squid-cache cada vez que se actualiza a una nueva versión, desafortunadamente cambia los parámetros de cachemgr y su acceso (y de otro montón de cosas). Las configuraciones propuestas son hasta squid3.2 y 3.3.1. No podemos garantizar el funcionamiento de CacheMgr en versiones posteriores. Para mayor información visite a los reyes magos: la wiki de cachemgr squid. especialmente el enlace a esta herramienta CGI para los últimos cambios.
También debe tener en cuenta que si utiliza la aplicacion sqstat, para estadísticas de squid3 en tiempo real, al establecer un password en cachemgr_passwd, debe agregarla también al archivo de configuración de sqstat y reiniciar apache2. Para mayor información sobre cómo configurar sqstat visite el post Network Monitor
Otras caches y configuraciones adicionales
1. Ajuste "cache_swap_low" y "cache_swap_high", al valor por default. Estas opciones se encargan de realizar la limpieza de la cache al llegar a los porcentajes indicados (90% y 95%)
cache_swap_low 90
cache_swap_high 95
2. Ajuste memory_pools al valor por default "off", para que Squid libere memoria RAM que no está usando el servidor y la coloque en la fuente de memoria y la cantidad de RAM para squid
# Liberando Memoria Ram
memory_pools off
# Cantidad de RAM para almacenamiento Squid
memory_pools_limit 512 MB
3. Ajuste half_closed_clients al valor por default "off".  (Si es un proxy inverso, póngalo en "on"). Cerrar las peticiones de los clientes que se queden a medias cuando cierran la conexión TCP
half_closed_clients off
4. Evite que Squid se atasque y  ponga los dns_nameservers de su red local. Ejemplo de dns de Google
dns_nameservers 8.8.8.8 8.8.4.4
5. Establecer nombre del proxy (Reemplace proxy.lan por el nombre de su proxy)
visible_hostname proxy.lan
6. Proteger el squid
cache_effective_user proxy 
cache_effective_group proxy
7. Limitando máximo de conexiones por usuario. Establezca en una acl llamada limit las ips que quiera limitar y determine su ruta (Ej: /etc/squid3/acls/limit)
acl conexiones maxconn 5
http_access deny conexiones
acl limit src "/etc/squid3/acls/limit"
acl abuse maxconn 3
http_access deny limit abuse
8. Mensajes de error por defecto en español (puede personalizar las páginas de error). No esta declarado por defecto. Pueden cambiarlo en el siguiente enlace:
error_directory /usr/share/squid3/errors/es
Si quiere personalizar aún más sus páginas de error del Squid, visite el foro Alterserv y encontrará varios ejemplos usando la directiva deny_info
9. Declarar paginas que contengan ciertos caracteres no deben almacenarse en cache (sitios de webmail y paginas locales en su red, etc)
# reemplazar
hierarchy_stoplist cgi-bin ? 
# por
hierarchy_stoplist cgi-bin ? hotmail gmail yahoo outlook misitioweb.com
10. Activar y ver Logs
cache_log /var/log/squid3/cache.log
# logs
access_log daemon:/var/log/squid3/access.log squid
access_log stdio:/var/log/squid3/access.log squid
cache_access_log stdio:/var/log/squid3/access.log
cache_store_log stdio:/var/log/squid3/store.log
cache_store_log daemon:/var/log/squid3/store.log
# Ver los logs
cat /var/log/squid3/cache.log
11. Windows Update
Para los que quieran cachear las actualizaciones de Windows Update, pueden visitar el tutorial en AlterServ
12. Verifique la carga de su squid
# Ejemplo
squidclient -h 192.168.1.10 -p 3128 mgr:info | grep 'Average HTTP requests'
13. En algunas versiones de Squid, si utiliza el modo proxy no-transparente con autenticación (proxy_auth), es posible que necesite priorizar (subir de posición) la acl CONNECT con respecto a las acls SSL_ports y Safe_ports, para evitar doble (o falsa) autenticación de los usuarios. Si no es su caso, dejela como viene por default, o sea, debajo de las acl SSL_ports y Safe_ports
acl CONNECT method CONNECT
acl SSL_ports port 443
acl Safe_ports port 80  # http
acl Safe_ports port 21  # ftp
acl Safe_ports port 443  # https
acl Safe_ports port 70  # gopher
acl Safe_ports port 210  # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280  # http-mgmt
acl Safe_ports port 488  # gss-http
acl Safe_ports port 591  # filemaker
acl Safe_ports port 777  # multiling http
Follow X-Forwarded-For headers
Otra configuración que ayuda a que se conozca la naturaleza de las peticiones y por tanto hace más transparente el tráfico es X-Forwarded-For-Headers, sin embargo con el asunto de la "violación a la privacidad" se puede convertir más en un problema que en una solución. No obstante para los que quieran activarla, abran su squid.conf y coloquen lo siguiente:
acl localhost src 127.0.0.1 # Linea no valida para squid3x
acl my_proxy srcdomain .proxy.example.com
follow_x_forwarded_for allow localhost
follow_x_forwarded_for allow my_proxy
acl_uses_indirect_client on
delay_pool_uses_indirect_client on
log_uses_indirect_client on
Reemplace my_proxy y proxy.example.com por los de su organización
Con esta acción se puede confiar en las solicitudes de la dirección IP 127.0.0.1 desde cualquier host en el dominio (proxy.example.com). La información de la cabecera X-Forwarded-For, en este caso, se utilizará en lugar de la dirección del cliente directamente para los efectos de las ACL, delay pools y logging.

Consultas
Manual de Administración Squid, Borrado de Cache Squid, Configuración de squid, Cache Manager

Continúa Squid Cache II
Maravento, Actualizado en: 19:31
Escrito por: Maravento Studio
 
© 2017 Maravento. All Rights Reserved | Powered by Maravento
Design by Novatoz and Maravento | Bloggerized By LawnyDesignz
# https://github.com/google/code-prettify