Proxy Transparente con SMP en Squid 3.3.3

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 se desea 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 se hablará 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 aplicación.

Squid

Existen una cierta cantidad de términos que se deben conocer antes de configurar un Servidor Proxy, ya sea directo o transparente.

Entender dichos términos, 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 autentificación 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.


Proxy 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 mediante reglas FORWARD de Iptables.


Multiprocesamiento Simétrico (SMP)

En computación, SMP (del inglés Symmetric Multi-Processing, en español "multiproceso simétrico") es un tipo de arquitectura de computadores en la que dos o más unidades de procesamiento comparten una única memoria central.
Explicación detallada

La arquitectura SMP (también llamada UMA, del inglés Uniform Memory Access, en español "acceso uniforme a memoria") se caracteriza por el hecho de que varias unidades de procesamiento comparten el acceso a la memoria, compitiendo en igualdad de condiciones por dicho acceso, de ahí la denominación "simétrico".

Los sistemas SMP permiten que cualquier procesador trabaje en cualquier tarea sin importar su localización en memoria; con un propicio soporte del sistema operativo, estos sistemas pueden mover fácilmente tareas entre los procesadores para garantizar eficientemente el trabajo.

Una computadora SMP se compone de microprocesadores independientes que se comunican con la memoria a través de un bus compartido. Dicho bus es un recurso de uso común. Por tanto, debe ser arbitrado para que solamente un microprocesador lo use en cada instante de tiempo. Si las computadoras con un único microprocesador tienden a gastar considerable tiempo esperando a que lleguen los datos desde la memoria, SMP empeora esta situación, ya que hay varios parados en espera de datos.


Términos de Enrutamiento

* '''PREROUTING = ANTES DE RUTEAR:''' Significa que todavía no está definido para donde va el paquete. El paquete pasa por DNAT y luego pasa por la tabla de ruteo y ahí se define el destino. Justamente DNAT cambia la IP destino del paquete, entonces es NECESARIO que esté antes de la tabla de ruteo.

* '''POSTROUTING = DESPUES DE RUTEAR:''' Significa que ya está claro el destino del paquete, ya pasó por la tabla de ruteo. Pero antes de salir a la red, SNAT cambia la IP origen del paquete por otra IP.

* '''SNAT:''' se suele usar cuando tenés una LAN (ej: 192.168.100.0/24) y tenés que mandar un paquete a internet. Como no se puede mandar un paquete con IP PRIVADA a internet, cuando éste pasa por el router, SNAT le pone a cada paquete la IP PUBLICA del router. Por eso es necesario definir la interfaz de destino (que sería el cable por donde salís a internet) Todo lo que vaya por esa interfaz tiene que tener IP PUBLICA. '''Ejemplo:'''
 iptables -t nat -A POSTROUTING –s 192.168.10.0/24 -o eth0 -j MASQUERADE

* '''DNAT:''' se suele usar para lo contrario. Por ejemplo, vos estás en China y querés entrar a un servidor web que tenés en la PC de tu casa, que está en una LAN con la IP 192.168.100.1. ¡Es imposible mandar por internet un paquete con IP destino PRIVADA! Entonces le mandás el paquete al router de tu casa (que tiene IP PUBLICA) Cuando el paquete pasa por el router, DNAT le cambia la IP destino por la IP PRIVADA de tu PC. '''Ejemplo:'''
 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.100.1:80
En ambos casos eth0 sería la interfaz para internet.


Configuraciones Previas del Servidor

Optimizando Conexión SSH

Realizar modificación en el archivo ''/etc/ssh/sshd_config''.

 # vim /etc/ssh/sshd_config

 # Puerto por el cual ssh escuchará
 Port 83
 # Authentication:
 # Tiempo máximo para captar la contraseña del cliente
 LoginGraceTime 15
 # No permitir la entrada de root
 PermitRootLogin no
 # Número de veces que puede haber equivocaciones de Usuario y Contraseña
 MaxAuthTries 3

Añadir un Usuario para el Acceso por SSH

 # add nombre_usuario


Habilitar Bit de Forward

Se debe habilitar el bit de forward para que los Paquetes de Datos que lleguen al Proxy puedan ser enrutados. Para esto se utiliza el siguiente comando como Super Usuario.

 echo 1 > /proc/sys/net/ipv4/ip_forward


Iptables para Squid

Se deben configurar reglas de iptables para direccionar el tráfico proveniente de la Red LAN xx.xx.0.0/16 a la Dirección IP xx.xx.xx.xx, la misma es la que tiene salida a Internet, y luego direccionar los Paquetes de Datos de la Interfaz eth1 de puerto 80 a 3128 de la Dirección que lleva a Internet. Así como también agregar las diferentes reglas que se deseen.

 iptables -t nat -A POSTROUTING -s xx.xx.0.0/16 -o eth0 -j SNAT --to xx.xx.xx.xx
 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to xx.xx.xx.xx:3128
 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128


Enrutamiento del Servidor

En este apartado deben ser especificadas la tabla de ruta del Servidor para que pueda llegar de una red a otra; para éste caso el Gateway será ''172.16.0.20''.

 route -n = Visualiza el enrutamiento del Servidor
 route add default gw 172.16.0.20 eth0 = Agregar Gateway


Arrancar Iptables con S.O.

Colocar en un script.sh las reglas Iptables que se deseen cargar cuando por alguna eventualidad sea reiniciado el Servidor para que sean cargadas automáticamente cuando cargue el Sistema Operativo (S.O.) y no hacerlo de manera manual; el mismo debe ser guardado en ''/etc/init.d'' Con la siguiente línea de Comando se realiza la tarea de colocarlo en el arranque del S.O.

 update.rc.d nombre_iptables.sh defaults


 Opciones de Iptables

* '''-A''': Le dice a iptables que abra esta regla para la cadena INPUT
* '''-s''' [origen]: Dirección de origen. Esta regla solo pertenece al trafico proviniente de esta IP. Sustituya con la direccion IP desde donde estamos generando el SSH.
* '''-d''' [destino]: Dirección de Destino. Puede ser un nombre de host, dirección de red o dirección IP singular.
* '''–dport''' [puerto]: Puerto de Destino. Especificando tráfico que es TCP puerto 22 (SSH).
* '''-j''' [salto]: Si todo funciona en esta regla saltar para ACCEPT (aceptar)
* '''-p''' [protocolo]: Protocolo al que pertenece el paquete.
* '''-s''' [origen]: dirección de origen del paquete, puede ser un nombre de host, una dirección IP normal, o una dirección de red (con máscara, de forma dirección/máscara).
* '''-i''' [interfaz-entrada]: Especificación del interfaz por el que se recibe el paquete.
* '''-o''' [interfaz-salida]: Interfaz por el que se va a enviar el paquete.
* ''' [!] -f''': Especifica que la regla se refiere al segundo y siguientes fragmentos de un paquete fragmentado. Si se antepone !, se refiere sólo al primer paquete, o a los paquetes no fragmentados.
* '''-j''' [target]: Nos permite elegir el target al que se debe enviar ese paquete, esto es, la acción a llevar a cabo con él.

Instalación

Instalando Paso a Paso de Squid

1. Descargar la última versión de Squid desde la [http://www.squid-cache.org/ Pagina Oficial]

2. Enviar por ''ssh'' al Servidor el archivo descargado.

3. Descomprimir el archivo ''tar.gz''.

 # tar -xvzf /ruta/archivo

4. Otorgarle todos los permisos a la Carpeta descomprimida.

 chmod -R 777 /ruta/archivo

5. Luego compilar:

 # ./configure --prefix=/usr/local/squid
 # make all
 # make install

6. Personalizar el squid.conf de acuerdo a la necesidad.

 vim /usr/local/squid/etc/squid.conf

7. Inicializar el cache de Squid, esto se hace con el siguiente:

 # /usr/local/squid/sbin/squid -z

8. Iniciar el Servicio de Squid:

 # /usr/local/squid/sbin/squid

Ejemplo Archivo squid.conf

El siguiente archivo squid.conf es un ejemplo, el cual se encuentra optimizado y adaptado para una empresa y funcionando al 100% con Multiprocesamiento. O puedes descargarlos el .conf haciendo clic aqui.

 acl red src xx.xx.0.0/16 # Red LAN

 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
 acl CONNECT method CONNECT

 ##### REGLAS #####
 # Sitios Web's Bloqueados
 acl paginasbloqueadas url_regex -i "/usr/local/squid/etc/reglas/paginas_bloqueadas"

 # Páginas Desbloqueadas para toda la Red
 acl paginasdesbloqueadas url_regex -i "/usr/local/squid/etc/reglas/paginas_desbloqueadas"

 # Páginas Permitidas a Medios
 acl paginasmedios url_regex -i "/usr/local/squid/etc/reglas/paginas_medios"

 # Mac para Acceder a Páginas necesarias en Medios
 acl macmedios arp "/usr/local/squid/etc/reglas/mac_medios"

 # Frases Bloqueadas en las Busquedas de Tod@s l@s Usuari@s
 acl palabrasbloqueadas url_regex -i "/usr/local/squid/etc/reglas/palabras_bloqueadas"

 # Mac para Acceder a cualquier sitio
 acl maclibres arp "/usr/local/squid/etc/reglas/mac_libres"

 acl mactemporales arp "/usr/local/squid/etc/reglas/mac_temporales"

 acl paginastemporales url_regex -i "/usr/local/squid/etc/reglas/paginas_temporales"

 acl paginasssl port 443

 acl macbloqueadas arp "/usr/local/squid/etc/reglas/mac_bloqueadas"

 # MacAddress desbloqueadas para Nivel Medio
 acl maclibresnivelmedio arp "/usr/local/squid/etc/reglas/mac_libres_nivelmedio"

 # Paginas para Acceso de Nivel Medio
 acl paginasdesbloqueadasnivelmedio url_regex -i "/usr/local/squid/etc/reglas/paginas_desbloqueadas_nivelmedio"

 # Navegacion Libre para fines de semana S - Domingo : M - Lunes : T - Martes : W - Miércoles : H - Jueves : F - Viernes : A - Sábado
 acl horariolibrerecepcion time MTWHF 18:00-23:59
 acl horariolibrerecepcion1 time MTWHF 00:00-6:00

 # Mac Libres Fin de Semana
 acl macfindsemana arp "/usr/local/squid/etc/reglas/mac_findsemana"
 acl macrecepcion arp "/etc/squid/reglas/mac_recepcion"

 # Paginas permitidas para Recepcion
 acl paginasdesbloqueadasrecepcion url_regex -i "/etc/squid/reglas/paginas_desbloqueadas_recepcion"

 ####################################
 acl iexplorer browser MSIE
 #acl EXE urlpath_regex \.[eE][xX][eE]
 acl ISO urlpath_regex \.[iI][sS][oO]
 acl MP3 urlpath_regex \.[mM][pP][3]

 # Recommended minimum Access Permission configuration:
 # Only allow cachemgr access from localhost
 http_access allow localhost manager
 http_access deny manager

 # Deny requests to certain unsafe ports
 http_access deny !Safe_ports

 # Deny CONNECT to other than secure SSL ports
 http_access deny CONNECT !SSL_ports

 # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
 #
 # Denegar Acceso de MacAddress Bloqueadas a la Red
 http_access deny red macbloqueadas

 http_access allow mactemporales paginastemporales

 http_access allow macmedios paginasmedios

 # Permitir Acceso a maclibres a bloqueados
 http_access allow maclibres paginasbloqueadas
 http_access allow maclibres palabrasbloqueadas
 http_access allow maclibres paginasmedios
 #http_access allow maclibres EXE
 http_access allow maclibres ISO
 http_access allow maclibres MP3
 http_access allow maclibres iexplorer

 # Permitir acceso a ciertas paginas TODOS
 http_access allow red paginasdesbloqueadas

 # Permitir Acceso a Nivel Medio las MacAddess descritas a las Paginas determinadas
 http_access allow maclibresnivelmedio paginasdesbloqueadasnivelmedio
 http_access allow maclibresnivelmedio paginasmedios
 #http_access allow maclibresnivelmedio EXE
 http_access allow maclibresnivelmedio ISO
 http_access allow maclibresnivelmedio MP3

 http_access allow macrecepcion horariolibrerecepcion paginasmedios
 http_access allow macrecepcion horariolibrerecepcion1 paginasmedios
 http_access allow macrecepcion horariolibrerecepcion1 paginasdesbloqueadasrecepcion

 # Denegar Acceso a bloqueados
 http_access deny paginasbloqueadas

 # Denegar frasesbloqueadas para Usuari@s
 http_access deny palabrasbloqueadas

 http_access deny iexplorer
 #http_access deny EXE
 http_access deny ISO
 http_access deny MP3

 # Example rule allowing access from your local networks.
 # Adapt localnet in the ACL section to list your (internal) IP networks
 # from where browsing should be allowed
 http_access allow red
 http_access allow localhost

 # And finally deny all other access to this proxy
 http_access deny all

 # icp_access deny all
 icp_access deny all

 htcp_access deny all

 http_port 3128 transparent

 cache_mem 384 MB

 maximum_object_size_in_memory 512 KB

 cache_dir diskd /usr/local/squid/var/cache/squid 10000 16 256

 maximum_object_size 4 MB

 cache_swap_low 90

 cache_swap_high 95

 access_log daemon:/usr/local/squid/var/logs/squid/access.log squid

 cache_store_log /usr/local/squid/var/logs/squid/store.log

 logfile_rotate 10

 cache_log /usr/local/squid/var/logs/squid/cache.log

 coredump_dir /var/cache/squid

 # Add any of your own refresh_pattern entries above these.
 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

 # Si el objeto no expiró, se pasa a la siguiente etapa.
 # Si el objeto tiene más de 28800 minutos (20 dias)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 (14400) en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.
 # Imagenes
 refresh_pattern -i \.gif$ 14400 80% 28800
 refresh_pattern -i \.tiff?$ 14400 80% 28800
 refresh_pattern -i \.bmp$ 14400 80% 28800
 refresh_pattern -i \.jpe?g$ 14400 80% 28800
 refresh_pattern -i \.xbm$ 14400 80% 28800
 refresh_pattern -i \.png$ 14400 80% 28800
 refresh_pattern -i \.wrl$ 14400 80% 28800
 refresh_pattern -i \.ico$ 14400 80% 28800
 refresh_pattern -i \.pnm$ 14400 80% 28800
 refresh_pattern -i \.pbm$ 14400 80% 28800
 refresh_pattern -i \.pgm$ 14400 80% 28800
 refresh_pattern -i \.ppm$ 14400 80% 28800
 refresh_pattern -i \.rgb$ 14400 80% 28800
 refresh_pattern -i \.ppm$ 14400 80% 28800
 refresh_pattern -i \.rgb$ 14400 80% 28800
 refresh_pattern -i \.xpm$ 14400 80% 28800
 refresh_pattern -i \.xwd$ 14400 80% 28800
 refresh_pattern -i \.pict?$ 14400 80% 28800

 # Videos
 refresh_pattern -i \.mov$ 14400 80% 28800
 refresh_pattern -i \.mpe?g?$ 14400 80% 28800
 refresh_pattern -i \.avi$ 14400 80% 28800
 refresh_pattern -i \.qtm?$ 14400 80% 28800
 refresh_pattern -i \.viv$ 14400 80% 28800
 refresh_pattern -i \.swf$ 14400 80% 28800

 # Sonido
 refresh_pattern -i \.wav$ 14400 80% 28800
 refresh_pattern -i \.aiff?$ 14400 80% 28800
 refresh_pattern -i \.au$ 14400 80% 28800
 refresh_pattern -i \.ram?$ 14400 80% 28800
 refresh_pattern -i \.snd$ 14400 80% 28800
 refresh_pattern -i \.mid$ 14400 80% 28800
 refresh_pattern -i \.mp2$ 14400 80% 28800
 refresh_pattern -i \.mp3$ 14400 80% 28800

 # archivos varios
 refresh_pattern -i \.sit$ 14400 80% 28800
 refresh_pattern -i \.zip$ 14400 80% 28800
 refresh_pattern -i \.hqx$ 14400 80% 28800
 refresh_pattern -i \.exe$ 14400 80% 28800
 refresh_pattern -i \.arj$ 14400 80% 28800
 refresh_pattern -i \.lzh$ 14400 80% 28800
 refresh_pattern -i \.lha$ 14400 80% 28800
 refresh_pattern -i \.cab$ 14400 80% 28800
 refresh_pattern -i \.rar$ 14400 80% 28800
 refresh_pattern -i \.tar$ 14400 80% 28800
 refresh_pattern -i \.gz$ 14400 80% 28800
 refresh_pattern -i \.z$ 14400 80% 28800
 refresh_pattern -i \.a[0-9][0-9]$ 14400 80% 28800
 refresh_pattern -i \.r[0-9][0-9]$ 14400 80% 28800

 # Archivos de documentacion
 refresh_pattern -i \.txt$ 14400 80% 28800
 refresh_pattern -i \.pdf$ 14400 80% 28800
 refresh_pattern -i \.doc$ 14400 80% 28800
 refresh_pattern -i \.xls$ 14400 80% 28800
 refresh_pattern -i \.ppt$ 14400 80% 28800
 refresh_pattern -i \.odt$ 14400 80% 28800
 refresh_pattern -i \.ods$ 14400 80% 28800
 refresh_pattern -i \.odp$ 14400 80% 28800
 refresh_pattern -i \.rtf$ 14400 80% 28800
 refresh_pattern -i \.tex$ 14400 80% 28800
 refresh_pattern -i \.latex$ 14400 80% 28800

 # Java-type objects
 refresh_pattern -i \.class$ 14400 80% 28800
 refresh_pattern -i \.js$ 14400 80% 28800
 refresh_pattern -i \.class$ 14400 80% 28800

 # Web-type objects
 refresh_pattern -i \.css$ 10 20% 4320
 refresh_pattern -i \.html?$ 10 20% 4320
 refresh_pattern \/$ 10 20% 4320

 cache_mgr informatica@xxxx.xx.xx

 cache_effective_user proxy

 visible_hostname Proxy Empresa

 error_directory /usr/local/squid/share/errors/es-es/

 nonhierarchical_direct off

 dns_nameservers xx.xx.xx.xx xx.xx.xx.xx

 hosts_file /etc/hosts

 ipcache_size 1024

 ipcache_low 90

 ipcache_high 95

 fqdncache_size 1024
 
 memory_pools off

 workers 3


Logs de Squid

Lectura Log de Squid

Los logs (access.log, store.log, cache.log) de Squid se alojan en la siguiente ruta:
 /var/log/squid/*.log

Los datos que guarda son, por orden:
# Fecha y hora en formato Unix UTC.
# Duración de la transacción, tiempo de respuesta.
# Dirección IP del cliente (equipo que hace la petición web).
# Resultado de la transacción.
# Tamaño de la descarga del objeto solicitado.
# Método de solicitud para obtener un objeto.
# URL solicitada.
# Por defecto en esta columna no aparece nada, pues mostrará información sólo si el parámetro ident_loookups está activado. Está desactivado por defecto porque afecta al rendimiento. Si está desactivado en esta columna aparecerá un guión "-".
# Código de jerarquía de la información, se compone de tres elementos: '''a.''' TIMEOUT_. '''b.''' Código que indica cómo ha sido manejada la solicitud: NONE, DIRECT, SIBLING_HIT, PARENT_HIT, DEFAULT_PARENT, SINGLE_PARENT, FIRST_UP_PARENT, NO_PARENT_DIRECT, FIRST_PARENT_MISS, CLOSEST_PARENT_MISS, CLOSEST_PARENT, CLOSEST_DIRECT, NO_DIRECT_FAIL, SOURCE_FASTEST, ROUNDROBIN_PARENT, CACHE_DIGEST_HIT, CD_PARENT_HIT, CD_SIBLING_HIT, NO_CACHE_DIGEST_DIRECT, CARP, ANY_PARENT. '''c.''' IP o hostname del equipo que hace la solicitud.
# Tipo de objeto descargado, tal y como indica el encabezado HTTP.


Tipos de Mensajes en Log de Squid

* '''TCP_HIT:''' copia válida en la caché de squid del objeto solicitado.

* '''TCP_MISS:''' el objeto solicitado no existe en la caché.

* '''TCP_MISS/200''' Se verá esta entrada en el log cuando se esté intentando descargar algún archivo que no esté en el Cache del Servidor. Lo que siginifica que sera descargado desde el servidor web. Tomar en cuenta que los scripts no se pueden almacenar en cache, esto aplica para los archivos con terminacion .pl o .php entre otros.

* '''TCP_MISS/304''' Al igual que el anterior significa que el archivo que se intenta descargar no está en el cache del servidor proxy, pero si esta almacenado en el cache de tu navegador de internet. En este caso el navegador enviará una solicitud de descarga solo si el archivo en el servidor web es mas reciente que el del cache de Navegador.

* '''TCP_REFRESH_HIT:''' el objeto solicitado estaba en la caché, pero es "antiguo". Se hace una petición para descargar el objeto reciente actual.

* '''TCP_REFRESH_FAIL_HIT:''' el objeto solicitado estaba en la caché, pero era viejo. La petición de validación del objeto falló. Por lo tanto se servirá el objeto de la caché.

* '''TCP_REFRESH_MISS:''' el objeto solicitado estaba en la caché, pero era viejo. Se hizo una petición de traer un objeto más reciente y se descargó correctamente.

* '''TCP_CLIENT_REFRESH_MISS:''' el cliente solicita el refresco de una web determinada, pidiendo una nueva versión.

* '''TCP_IMS_HIT:''' el cliente ha solicitado una nueva versión de un objeto que estaba cacheado, pero se encuentra que el objeto de la caché aún no estaba caducado, es decir, que ya era lo más nuevo posible.

* '''TCP_IMS_MISS:''' el cliente solicita nueva copia acerca de un objeto viejo.

* '''TCP_SWAPFAIL:''' falla la petición del objeto a la caché.

* '''TCP_SWAPFAIL_MISS:''' el objeto solicitado está en la caché pero no se puede acceder a él.

* '''TCP_NEGATIVE_HIT:''' solicitud negativa de objeto en caché, ejemplo "404 no encontrado".

* '''TCP_MEM_HIT A:''' una copia válida del objeto solicitado estaba en la caché y fue puesta en memoria, evitando así accesos al disco.

* '''TCP_DENIED:''' acceso denegado para esta petición.

* '''TCP_DENIED/400:''' indica que la petición tenía una mala sintaxis. El usuario (o un link a una página web) hizo algo mal.

* '''TCP_DENIED/401:''' indica que la página requiere autorización.

* '''TCP_DENIED/403:''' lo más probable es que sea un sitio bloqueado por una de las listas de control de acceso del Squid.

* '''TCP_DENIED/407:''' indica que el proxy está configurado para usar alguna forma de autenticación y esta autenticación está fallando.


Códigos de Estado de Squid

 '''CÓDIGO     DESCRIPCIÓN'''
   000     Respuesta no recibida (puede que tenga un problema con el enlace de Internet)
 - 1xx     Una serie de respuestas informativas
   100     Continuar
   101     Protocolos de intercambio
 - 2xx     Número de respuestas satisfactorias a las solicitudes
   200     Bueno
   201     Creado
   202     Aceptado
   203     Información no autorizada
   204     Sin contenido
   205     Contenido eliminado
   206     Contenido parcial
 - 3xx     Redirecciones
   300     Múltiples opciones
   301     Movido permanentemente
   302     Encontrado
   303     Ver más
   304     Sin modificar
   305     Utilice el proxy
   306     No se utiliza
   307     Redirección temporal
 - 4xx     Número de errores en el cliente
   400     Mala respuesta
   401     No autorizado
   402     Pago solicitado
   403     Denegado / prohibido
   404     No se ha encontrado
   405     Método no encontrado
   406     No estoy de acuerdo
   407     Autenticación de solicitud para el proxy
   408     Tiempo de espera
   409     Conflicto
   410     Hecho
   411     Tamaño requerido
   412     No se pudo pre-condicional
   413     Entrada amplia solicitud de
   414     URL solicitada demasiado tiempo
   415     Tipo de medio no es compatible
   416     Rango requerido insatisfactoria
   417     Esperanzas fallidas
 - 5xx     Número de errores en el servidor
   500     Error interno del servidor
   501     No se ha aplicado
   502     Puerta de enlace incorrecta
   503     Servicio no disponible
   504     Tiempo de espera de puerta de enlace
   505     HTTP versión no es compatible
 - 6xx     Una serie de errores de proxy
   600     Cabecera de la respuesta incorrecta


Visualizar Log de Squid

1. De la siguiente manera se visualizan los últimos diez (10) registros del log
 # tail -l /var/log/squid/access.log

2. Con la ésta línea de Comandos se puede observar el log con colores que hacen un poco fácil su lectura. Para ejecutarlo se debe instalar el Paquete multitail.
 # aptitude install multitail
 # multitail -cS squid -i /var/log/squid/access.log

3. Otra opción es squidview, el cual debe ser instalado y leugo de ejecutarlo mostrará línea a línea las conexiones a través del proxy, éste no muestra mayores detalles en cuanto a las peticiones.
 # aptitude install squidview
 # squidview


Reportes

sarg



Optimización de Squid

Algunas Opciones a Revisar

# Añadir las opciones "cache_swap_low"(90) y "cache_swap_high"(95) que ayudan a determinar cuando Squid empezará a vaciar la caché. Esto es importante para mantener la caché dentro de unos límites razonables y accesibles rápidamente.
# Ajustar la opción "memory_pools" en "off" para que Squid libere la RAM que no está usando el servidor y la coloque en la fuente de memoria.
# Indicar sus servidores de nombres DNS usando la opción "dns_nameserves". Esto es importante puesto que Squid se queda atascado cuando hace búsquedas de DNS.
# Añadir la opción "half_closed_clients" para ponerla en "off" en el archivo de configuración. Además, cambia la opción "maximum_object_size" por "1024KB" para mejoras menores.
# Cambiar la opción "cache_mem" de 8MB, el predeterminado, a 32 MB. Si la máquina tiene memoria disponible, aumentar esta opción de memoria caché puede mejorar mucho el rendimiento. Algunas personas ponen esto a 100 MB o más.


Restricción de Acceso por Horarios

Denegar el acceso en ciertos horarios permite hacer un uso más racional del ancho de banda del que se dispone.
Los días de la semana se definen con letras, las cuales corresponden a la primera letra del nombre en inglés, de modo que se utilizarán del siguiente modo:

 S - Domingo : M - Lunes : T - Martes : W - Miércoles : H - Jueves : F - Viernes : A - Sábado

Ejemplo:
 acl laboral time MTWHF 08:00-15:00

Esta regla define a la lista laboral, la cual comprende un horario de 08:00 a 15:00 horas desde el Lunes hasta el Viernes.

La definición de la Regla de Control de Acceso sería:
 http_access deny !laboral red_lan

Lo anterior, significa que quienes conformen red_lan solo podrán acceder a Internet de Lunes a Viernes de 08:00-15:00 horas.


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 ''-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.


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.

'''Ejemplo:'''

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

En este grupo se tienen 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.
'''Aclaratoria:''' Estos objetos se mantendrán frescos el 100% de su tiempo de vida promedio (el tiempo promedio que pasa entre una solicitud y otra).

 # Imagenes
 refresh_pattern -i \.gif$ 14400 80% 28800
 refresh_pattern -i \.tiff?$ 14400 80% 28800
 refresh_pattern -i \.bmp$ 14400 80% 28800
 refresh_pattern -i \.jpe?g$ 14400 80% 28800

Si el objeto no expiró, se pasa a la siguiente etapa.
Si el objeto tiene más de 28800 minutos (20 dias)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 (14400) en caché, NO se descarga, se usa el que está cacheado. Sino, se descarga.


Verificar Archivo squid.conf

Para chequear las reglas y/o parámetros en squid.conf, y de esta manera ver los errores que existen en el Archivo de Configuración squid.conf antes de reiniciar el Servicio del mismo, se utiliza el siguiente Comando:
 # squid -k parse


Referencias

http://www.tutoriales-ubuntu.com/archives/configurar-un-proxy-transparente-con-squid

http://www.esdebian.org/foro/46455/iptables-squid-3-transparente

http://www.ubuntu-es.org/node/165928

http://www.tuxjm.net/docs/Manual_de_Instalacion_de_Servidor_Proxy_Web_con_Ubuntu_Server_y_Squid/html-multiples/index.html

http://www.alcancelibre.org/staticpages/index.php?page=19-4-como-squid-tiempo

http://www.redesymas.org/2011/07/configuracion-de-iptables-firewall-en.html

http://www.pello.info/filez/firewall/iptables.html

http://www.adslayuda.com/Linux-iptables_lan.html

http://www.linuxparatodos.net//web/comunidad/base-de-conocimiento/-/wiki/Base%20de%20Conocimiento/Servidor+Proxy

http://servidordebian.wikidot.com/squeeze-es:intranet-ssl-cert-self-signed

http://www.visolve.com/system_services/opensource/squid/squid30/network.php#sslproxy_client_key

http://www.rahulpahade.com/content/squid-transparent-proxy-over-ssl-https

http://www.sebest.com.ar/?q=node/55

http://thebitdeveloper.com/2010/02/12/instalacion-y-configuracion-de-squid3/

http://www.akadia.com/services/ssh_test_certificate.html

http://wiki.cayu.com.ar/doku.php?id=manuales:servidor_squid

http://www.taringa.net/posts/linux/8448270.R/Servidor-Firewall-en-Linux-_IPTABLES_.html

https://www.arin.net/

http://www.ecualug.org/2008/07/24/comos/optimizar_squid_delays_pools_squish?page=1

http://www.esdebian.org/foro/42775/configurarar-optimamente-squid

http://www.taringa.net/posts/linux/15866058/Squid-a-fondo---editado.html

http://octavio.gnu.org.ve/squid-3-2-4-smp-en-debian-squeeze/

http://wiki.xtech.com.ar/index.php/Proxy

http://eduangi.com/2009/04/04/limpiar-memoria-en-linux/

@jomarore

Comentarios

Entradas populares de este blog

Monitorizar Carpetas o Ficheros con Zabbix Server

Monitoreo de Ficheros de Log desde Zabbix