lunes, 19 de marzo de 2012

Pfsense 2: Debugear Squid.

Una cosa es instalar y configurar las opciones que nos da squid en la GUI de pfsense y otra cosa es saber cuando squid nos esta bloqueando.

Cuando deseamos tener un control total del trafico que sale de nuestra red las ACL son nuestras armas mas letales, sabiendo como usarlas y aplicarlas nos abre un mundo de posibilidades, pero al ser muy estricto con nuestros usuarios aunque se enojen(dice un gran maestro mio: Prefiero se un gran paranoico y desconfiado que ser un gran estupido confiado), debemos ser capaces de resolver los problemas.

Resolver problemas con squid es saber entender sus logs y saber cuando entra en juego tambien el firewall, cualquier servicio que nosotros administremos, llamese mysql, apache, ldap, spam assassin, pf, squid, etc, etc, todos ellos manejan logs, los cuales siempre estan a la orden para poder saber si algo anda mal y algo necesita modificarse.

En el caso de squid, nos indicara si estamos bloqueando algo, el usuario te va a llamar y va a querer que le resuelvas el problema rapido por que si no se cae la luna sobre la tierra y te va a mandar un correo si esta muy molesto con copia a gente que nada que ver con la operacion y vas a ver algo asi:

Imagen 1: Pagina Bloqueada por Squid
Como podran ver en la Imagen 1, squid bloqueo la pagina, por que?

La palabra magica: "Access Denied", nos dice todo, a veces los usuarios se pierden y existen otras que dicen "Time Out", o "Return Zero", que nos indican que el problema es con el servidor externo.

Yo vivo en Tijuana, Mexico y nuestras grandes institituciones como el IMSS tienen un pesimo sistema en linea, y aqui es donde nosotros debemos estar listos para ver cuando squid esta bloqueando las cosas, y otra cosa mas algunas paginas de ellos nos redireccionan a otros dominios a veces IP's, ese sitios nos permite entender mejor los logs de squid y como abrir lo que el sitio requiere.
Imagen 2: Pagina inicial del IMSS.
Desconzco quien los administra pero si leen este blog espero se pongan las pilas aunque yo se que les importa poco lo que aqui digo, pero espero algun dia nuestra mentalidad cambie.

Bien vamos retomando el tema, como entender los logs de squid y como desbloquear paginas.

Para iniciar, vamos a ver que en squid tenemos unos ACL que estan hechos para el departamento de RH que son los que entran a el IMSS, el acl esta asi:

### Grupo RH
acl GRUPO2 src "/usr/local/etc/squid/acl/GRUPO2.acl"
acl GRUPO2_SITIOS dstdomain "/usr/local/etc/squid/acl/GRUPO2_SITIOS.acl"

Definicion de ACL GRUPO2.acl:

192.168.50.99/32

Indico el grupo de maquinas que caen en este acl.

Definicion de ACL GRUPO2_SITIOS.acl:

.sat.gob.mx
.infonavit.org.mx
.imss.gob.mx

Aqui indico que paginas puede accesar este grupo.

Ahora sigue ver como las tiene squid activadas.

### ACL acceso a grupo de usuarios de contabilidad
http_access allow GRUPO2 GRUPO2_SITIOS
http_access deny GRUPO2

Como he dicho en mis post anteriores, siempre que un acl recibe acceso enseguida es negarlo, recordar que squid se detiene cuando aparece el primer acceso o bloqueo.

Con esto tenemos encajonados a este grupo de usuarios a no salir de donde nosotros deseamos.

Una vez que squid esta operando, el usuario empieza a hacer uso del portal, vamos a ver que dicen los logs de squid:

1332135178.385      0 192.168.50.99 TCP_DENIED/403 1400 GET http://www.encuentra.gob.mx/css/apf.css - NONE/- text/html
1332135178.385      0 192.168.50.99 TCP_DENIED/403 1428 GET http://www.encuentra.gob.mx/api/gobmxWidgetAPI-min.js - NONE/- text/html
1332135178.386      0 192.168.50.99 TCP_DENIED/403 1444 GET http://www.encuentra.gob.mx/properties/gobmxWidgetAPI-conf.js - NONE/- text/html
1332135178.405      0 192.168.50.99 TCP_DENIED/403 1444 GET http://www.encuentra.gob.mx/properties/gobmxWidgetAPI-conf.js - NONE/- text/html
1332135178.528    147 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/carrusel_2.css - DIRECT/201.144.108.20 -
1332135178.528    147 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/ms.css - DIRECT/201.144.108.20 -
1332135178.534    149 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/scroll.css - DIRECT/201.144.108.20 -
1332135178.534    153 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/estilo.css - DIRECT/201.144.108.20 -
1332135178.539    149 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/javascript/C2_V4.js - DIRECT/201.144.108.20 -
1332135178.546    156 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/javascript/mootools.js - DIRECT/201.144.108.20 -
1332135178.590    410 192.168.50.99 TCP_MISS/200 29887 GET http://www.imss.gob.mx/Pages/default.aspx - DIRECT/201.144.108.20 text/html
1332135178.607     77 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/banners/pot.jpg - DIRECT/201.144.108.20 -
1332135178.608     77 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/Style%20Library/Images/Portada_linkexterno.gif - DIRECT/201.144.108.20 -
1332135178.613     77 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/banners/presidencia_nuevo.jpg - DIRECT/201.144.108.20 -
1332135178.615     79 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/banners/revista_imss.jpg - DIRECT/201.144.108.20 -
1332135178.626     85 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/banners/2.jpg - DIRECT/201.144.108.20 -
1332135178.639     91 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/twitter_bk.gif - DIRECT/201.144.108.20 -
1332135178.670     80 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/youtube_bk.gif - DIRECT/201.144.108.20 -
1332135178.672    170 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/comunicacion/PublishingImages/01.jpg - DIRECT/201.144.108.20 -
1332135178.689     78 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/facebook_bk.gif - DIRECT/201.144.108.20 -
1332135178.703     92 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/Portada_altaSMS.gif - DIRECT/201.144.108.20 -
1332135178.708      0 192.168.50.99 TCP_DENIED/403 1402 GET http://www.youtube.com/embed/86S-TY1Teqc - NONE/- text/html
1332135178.708      0 192.168.50.99 TCP_DENIED/403 1396 GET http://www.google-analytics.com/ga.js - NONE/- text/html
1332135178.718    103 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/imagenes/Portada_estamos_trabajando.jpg - DIRECT/201.144.108.20 -
1332135178.731    115 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/imagenes/Portada_revista.jpg - DIRECT/201.144.108.20 -
1332135178.741    113 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/imagenes/Portada_equipamiento.jpg - DIRECT/201.144.108.20 -
1332135178.785     79 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/imagenes/Portada_guarderias.jpg - DIRECT/201.144.108.20 -
1332135178.786     80 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/imagenes/Portada_delegaciones.jpg - DIRECT/201.144.108.20 -
1332135178.792     85 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/contacto_webmaster.png - DIRECT/201.144.108.20 -
1332135178.994     77 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/fondo_menu.jpg - DIRECT/201.144.108.20 -
1332135178.994     77 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/encabezado.jpg - DIRECT/201.144.108.20 -
1332135179.000     82 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/fondo_notas.png - DIRECT/201.144.108.20 -
1332135179.001     83 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/bullet1.gif - DIRECT/201.144.108.20 -
1332135179.008     90 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/imagenes/V4-Carrusel2_fondo.jpg - DIRECT/201.144.108.20 -
1332135179.016     97 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/imagenes/flechas_carrusel2.gif - DIRECT/201.144.108.20 -
1332135179.023    102 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/pie1.jpg - DIRECT/201.144.108.20 -
1332135179.032    110 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/pie.jpg - DIRECT/201.144.108.20 -
1332135179.079     84 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/arrow-up.gif - DIRECT/201.144.108.20 -
1332135179.080     84 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/stripe.gif - DIRECT/201.144.108.20 -
1332135179.084     83 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/knob-top.gif - DIRECT/201.144.108.20 -
1332135179.099     97 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/vertical-knob.gif - DIRECT/201.144.108.20 -
1332135180.102   1092 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/knob-bottom.gif - DIRECT/201.144.108.20 -
1332135180.109   1091 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/arrow-down.gif - DIRECT/201.144.108.20 -
1332135180.117   1030 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/arrow-right.gif - DIRECT/201.144.108.20 -
1332135180.119   1038 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/knob-right.gif - DIRECT/201.144.108.20 -
1332135180.119   1038 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/horizontal-knob.gif - DIRECT/201.144.108.20 -
1332135180.120   1095 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/arrow-left.gif - DIRECT/201.144.108.20 -
1332135180.120   1086 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/carrusel/scroll/knob-left.gif - DIRECT/201.144.108.20 -
1332135180.122    631 192.168.50.99 TCP_MISS/304 468 GET http://www.imss.gob.mx/css/imagenes/bullet_menu.png - DIRECT/201.144.108.20 -


Significados de los logs de squid:

TCP_DENIED: Sitio bloqueado, este es nuestro principal palabra clave a buscar cuando algo es bloqueado.

TCP_MISS: Cuando squid no tiene en cache la pagina, indica que tiene que ir a el servidor del dominio remoto por los datos en este caso www.imss.gob.mx.

TCP_HIT: No aparece aqui por que mi pfsense es un sistema nano y tengo deshabilitado el cache solo estoy bloqueando, si ustedes tienen hablitado su cache, este parametro significa que squid esta haciendo uso de su cache y no tuvo necesidad de ir a el sitio remoto por los datos.

Existen muchos mas pero estos son los que mas van a ver en sus logs.

Si observan, aparecen muchos dominios que nada que ver con www.imss.gob.mx, por ejemplo:


http://www.encuentra.gob.mx
http://www.youtube.com
http://www.google-analytics.com


Yo se que por sentido comun estos son sitios que "no" necesariamente deben estar abiertos para que portal funcione, los de http://www.google-analytics.com aparecen por todos lados.

No los abro al menos que alguna funcion del sitio los requiera, en mi caso ninguno, sigamos.

Hasta aqui todo bien, el usuario a logrado entrar a el portal, empieza a trabajar, nosotros seguimos nuestra agenda y de repente nos llega la 1ra llamada de auxilio y ya nos mando en el correo esto:
Imagen 3: Sitio bloqueado por squid.


Yo marque datos importantes que son los que nosotros como administradores debemos poner atencion, en la imagen 3 podemos ver 1 dato interesante, dice:


http://201.144.108.69/hlda/


Bien, el usuario no entiende esto y esta bien, lo del Cesar a el Cesar, y el log de squid dice lo mismo:


1332136401.647      1 192.168.50.99 TCP_DENIED/403 1376 GET http://201.144.108.69/hlda/ - NONE/- text/html


Nosotros preguntamos, "Oyes me podrias mostrar de donde llegastes a esta pagina?" y el usuario nos indica que viene de esta pagina:
Imagen 4: Sitio inicial.
Dice la imagen 4 que deseaba entrar a el link:


Reporte Informativo de Semanas Cotizadas del Asegurado


Si observan la imagen 4, poner el puntero del mouse ya nos indica que lo esta dirigiendo a otro IP, recodar nuestros ACL para este grupo, ninguno tiene dado de alta este IP, muchas sitios manejan IP's en vez de nombres de dominio, como les habia mencionado antes.


Que tenemos que hacer?

Primero que nada debemos actualizar nuestros acl y dar de alta el IP en nuestra lista de dominios permitidos para este grupo:


.sat.gob.mx
.infonavit.org.mx
.imss.gob.mx
.201.144.108.69



Recordar siempre poner un "." antes del IP o nombre de dominio, hecho esto le pedimos a squid que levante los cambios:


squid -k reconfigure


Y le pedimos a el usuario que vuelva a intentar.

Imagen 5: Sitio bloqueado de nuevo.
Por que les digo que nuestras instituciones tiene un cochinero?


Si observan el sitio esta abajo y nos retorna de nuevo una pagina bloqueada de un servidor en el rango de IP privadas(198.168.x.y), error grave, estos IP's nunca deben de aparecer en redes publicas como Internet.

Ahora observen que aparece en mi PC que tiene todo abierto para navegar:

Imagen 6: Sitio Caido.

El servidor remoto no responde y la imagen 6 nos dice todo, a veces los usuarios no entienden y aunque les expliquemos con manzanas no se quedan contentos y dicen que somos unos inutiles, pero ni modo no puedes hacer entender a todos.

Aqui lo que sigue es pedirle que intenen mas tarde y nosotros tambien mas tarde intentar si el sitio vuelve solo confirmar si ellos logran accesar el sitio.

Despues nos habla de nuevo el usuario y dice que ahi otro sitio que no puede accesar:

Imagen 7: Otro sitio bloqueado.
Este mensaje es totalmente distinto a el problema anterior, el log dice:


1332138102.991      0 192.168.50.99 TCP_DENIED/403 1360 CONNECT 201.144.108.83:8443 - NONE/- text/html


Otro IP, pero ademas esta indicando un puerto, interesante...


Vamos hacer lo mismo que el problema anterior, dar de alta el sitio en los ACL:


.sat.gob.mx
.infonavit.org.mx
.imss.gob.mx
.201.144.108.69
.201.144.108.83



Son del mismo bloque los ultimos IP's pero distinto nodo.


Pedimos a squid que levante los cambios:


squid -k reconfigure


Le pedimos intentar de nuevo, y....


1332138590.838      0 192.168.50.99 TCP_DENIED/403 1360 CONNECT 201.144.108.83:8443 - NONE/- text/html


Mismo problema, ya lo que sigue es que viendo el log, nos dice que aparte de tener que dar de alta el IP en el ACL debemos de dar de alta el puerto en squid, por default squid tiene ya un rango de puertos definidos y como todos los otros programas, el tiene un rango default en squid.conf:

acl safeports port 21 70 80 210 280 443 488 563 591 631 777 901 249 3128 1025-65535
acl sslports port 443 563 249

Como podran ver el 8443 no existe y ademas es https(ver imagen 7), voy a agregar en la lista de squid.


acl sslports port 8443  #Puerto para GRUPO2 SITIO IMSS 2012-03-18


Yo agrego el ACL y le pongo un comentario para cuando regrese saber por que esta ahi.

Ya saben:


squid -k parse
squid -k reconfigure


Tambien cuando ya estamos involucrando puertos no oficiales, el firewall tiene algo que ver, como soy paranoico y yo configure el firewall, se que este puerto no es de los permitidos, entonces no hay como entrar remotamente a el equipo del usuario y hacer uso del bueno viejo lobo de mar, telnet:

Imagen 8: Telnet sin respuesta.
Como podran ver el servidor externo no responde, vamos a ver que dicen los logs del firewall:
Imagen 9: pfsense bloqueando puerto.
Confirmado, Pfsense nos esta bloqueando tambien, asi que agregamos un alias para este grupo y le abrimos el puerto en el firewall.

Imagen 10: Creando alias para este grupo.
Imagen 11: Agregando regla a la LAN para nuestro alias.

Imagen 12: Regla agregada.
Ahora si podemos volver a probar desde el cliente con el telnet.

Imagen 13: Conexion exitosa.
Como podran observar desde la consola del cliente ya ha logrado conectarse.

Ahora es cuestion de que intente de nuevo y...

Imagen 14: Acceso aprobado.
Al parecer hemos logrado arreglar el problema, checamos el log:


1332141021.973    155 192.168.50.99 TCP_MISS/200 1275 CONNECT 201.144.108.83:8443 - DIRECT/201.144.108.83 -


Parece que todo va bien..

Imagen 15: Pagina correcta.
Asi es el usuario a logrado entrar a la pagina que deseaba, ya nos agradecio que es lo mejor de todo.

Puede squid bloquear a un todo poderoso?

Respuesta: Si.

Aunque nosotros estemos en la ACL de usuarios sin-restricciones, ahi veces que squid nos bloquea, vean este caso:

Imagen 16: Administrador bloqeueado.
Asi es, squid nos bloqueo, por que?

Si observan la imagen 16, aparece otro puerto, el 81, nuestro logs dice:

192.168.50.100 TCP_DENIED/403 1400 GET http://pfsense.foofus.com:81//downloads - NONE/- text/html

No es posible que nos haya bloqueado, bueno aqui esta un ejemplo, el problema es que el puerto numero 81 no es un valor que sea de los conocidos, pero a diferencia del problema anterior, este no es https, es una peticion http, asi que nos vamos a la seccion safeports y agregamos el puerto con su comentario:

acl safeports port 81   #Puerto para administrador 2012-03-18

Ya saben:

squid -k parse
squid -k reconfigure

Si gustan vamos viendo si mi equipo tiene acceso a el puerto 81:
Imagen 17: Acceso denegado a el administrador.
Log de nuestro firewall:
Imagen 18: Pfsense bloqueando puerto 81.
Ustedes a lo mejor si estan en el sistema de produccion con tantos usuarios conectados y pfsense logeando a lo mejor les pueden aparecer muchos logs bloqueando el puerto 81 y varios IP's distintos, como podriamos confirmar cual IP es?

En mi caso dice que el IP del sitio bloqueado es el 64 71 188 242, podremos hacer uso de dig en nuestra consola de pfsense:
Imagen 19: Confirmando IP de dominio bloqueado.
Ahi tienen, es el mismo que indica el log de mi pfsense.

Nos falta ademas recordar que nuestro firewall tampoco tienen dado de alta el puerto 81 por ser un valor no estandarizado, asi que de nuevo doy de alta un alias y una regla que permite a este alias salir a el puerto 81(ya vieron en la imagen 10 y consecutivas como se hace) y probamos.

Imagen 20: Acceso autorizado.

Como hemos visto, como cada seccion de nuestro pfsense entra en juego, hemos observado como hacer uso de los logs que es lo mas importante, muchas veces llegamos a el foro y preguntamos cosas como estas y nunca damos estos detalles, espero que esto sirva a todos y con esto contribuir con post mas avanzados y no ver preguntas basicas en donde el problema sea algo como esto.

Va a ver muchas casos mas, pero mas o menos yo los ataco de esta manera, herramientas tan basicas como telnet nos dan informacion muy valiosa.

Los alias de pfsense es otra joya.

Este procedimiento es mi forma de atacar los problemas, y lo referente a squid no es solo para pfsense, sino a todos los administradores que hagan uso de squid, ya que sus logs y configuracion es la misma, les puede servir, no importa si es Linux, FreeBSD, pfsense, el firewall lo mismo solo deben cambiar sus reglas a la version de firewall que usen, iptables, pf, etc, etc.

Otra cosa que me gustaria agregar, a veces algunos sitios actualizan sus paginas, nombres de dominio, ip's, etc, una pagina puede estar funcionando sin problemas la semana anterior y este semana cambio algo en su estructura que nuestros ACL's deben actualizarse, esto pasa comunmente.

Bueno amigos, ojala y les sea util este tiempo que he regalado y si le sirve a 1 solo me basta.

Saludos desde Tijuana.

5 comentarios:

Anónimo dijo...

Esta del carajo este post, me ah ayudado mucho, pero me queda una duda. Como haces para editar el quid.conf y desde donde lo haces?

Gracias por tu respuesta

Pedro Moreno dijo...

Hola.

Todo desde la consola, el gui no te da el poder de la consola.

ssh->putty.

Te recomiendo que access via llave-publica.

Saludos!!!

Hosting Chile dijo...

Buena información.
saludos.
Hosting Chile

Anónimo dijo...

Tengo una duda @pheriko cómo puedo ver los logs de squid de la forma en que viene aqui en tu tutorial?

Se ve que los puedes accesar desde la consola. Cual es la instrucción para desplegarlos en la consola?

Saludos

Pedro Moreno dijo...

Hola, entrando en la consola estas ya bajo Unix, usando los comandos basicos como: tail, cat, grep.

Ejemplo:

tail -n 50 /var/squid/logs/access.log
(muestras las ultimas 50 lineas)

Ahora si le agregas un grep:

tail -n 50 /var/squid/logs/access.log | grep usuario1
(busca la palabra usuario1 de las las ultimas 50 lineas)

En fin estos 3 comandos son mis aliados para debugear, investiga un poco de ellos y vas a ver todo lo que pueden hacer por ti.

Buscan en mi blog comando gnu-watch/ifstat y vas a ver todo el poder de la consola para debugear problemas de manera rapida, saludos!!!