#SysAdmin – Proxy #Squid Mejorar las consultas con DNS local

Squid
Squid

Este artículo pretende ser una guía general para la configuración de este tipo de servidores por lo que daré un esquema global. En mi caso tengo más de 50 máquinas accediendo a Internet en un enlace que no supera los 256kb. Esto claramente no podría funcionar sin un Proxy, control de Ancho de Banda, bloqueo de P2P, etc. y por cuestiones lógicas (es una red empresarial) necesito bloquear el acceso a determinados sitios web.

Ahora si, vamos por parte:

Proxy SQUID “Transparente ” y filtrado de sitios web

El primer paso es instalar Squid y hacerlo trabajar de forma transparente* (luego veremos que esto tiene algunos problemas).

*Transparente: Significa que no es necesario configurar las máquinas cliente para que utilicen el proxy, sino que se redireccionan las peticiones a páginas web para que las resuelva squid.

Reglas en Iptables:

Se supone que ya tienen configurado el enmascaramiento para dar Internet a su red local, de todas formas esta es la regla (eth0 es mi interfaz de red conectada al ISP)

-A POSTROUTING -o eth0 -j MASQUERADE

Ahora si redireccionamos las peticiones al puerto 80 (remoto) en nuestra interfaz de LAN (en este caso eth1), al puerto donde escucha Squid (en este caso 3128), también agrego a la regla que la IP remota no se corresponda con el mismo servidor (! -d 172.16.0.1), esto es para que las peticiones al servidor web local no sean tratadas de la misma manera.

-A PREROUTING -p tcp -m tcp ! -d 172.16.0.1 -i eth1 --dport 80 -j REDIRECT --to-ports 3128

Bueno ya tenemos (en parte) configurado nuestro entorno.

Bloqueo de sitios con SquidGuard

Para el bloqueo de sitios he utilizado una aplicación externa llamada SquidGuard, ya que es fácil de configurar y bastante eficiente al parecer. Su sitio web es http://www.squidguard.org/

Básicamente hay que agregar una regla en squid.conf para redireccionar las peticiones:

redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
redirect_children 4 (esto es el número de procesos máximos activos, seguramente para limitar el uso de CPU o memoria)

Y editar el archivo squidGuard.conf con las reglas de filtrado, en mi caso bloqueo muchos sitios de blacklists conseguidas en internet (por ejemplo en la misma web de squidGuard) y otros sitios que voy agregando manualmente, además es posible habilitar accesos para determinados horarios/días de la semana y rangos de IP.

Solo queda por decir que los sitios se organizan en carpetas en el home configurado (ej: dbhome /var/lib/squidguard/db) y que en realidad esta herramienta utiliza una bd asi que para crearla/actualizarla hay que correr el siguiente comando:

squidGuard -C all

(compilamos la BD entera)

Ahora bien, no todo es tan simple lamentablemente, con solo utilizar conexiones seguras (https) saltan nuestro filtro de sitios. Las soluciones para esto son básicamente 2.

Sol 1: Redireccionamos el puerto 443 también (Squid 3 soporta conexiones SSL), claro que se rompe el esquema de seguridad y estamos haciendo un “Man-In-The-Middle”:

Cliente <–conex seg–> (clave pub mi server) Squid <– conex seg—> (clave pub real) Remoto

Esto hace que al cliente de nuestra red local le llegue nuestro certificado y no el real, asi que los navegadores lo verán como un posible ataque, además es una solución riesgosa porque si alguien logra tomar el control de nuestro servidor podrá sniffear las conexiones, realmente no recomiendo bajo ningún motivo utilizar este esquema.

Sol 2: Hacemos que el uso del proxy sea Explícito y no transparente como lo teníamos para el puerto 80. Es necesario configurar las máquinas para que (al menos) las conexiones SSL se resuelvan utilizando nuestro proxy. Esto puede hacerse manualmente, con scripts de registro en caso de maquinas windows, etc o bien utilizar un protocolo de resolución de Proxy. Algo así como funciona nuestro DHCP para asignar direcciones de IP, también existen protocolos para esto. Si han visto en los browsers alguna vez “detectar la configuración del proxy automáticamente” se trata de esto, se puede hacer justamente como parte del DHCP, DNS o con protocolos WDAP. No voy a profundizar en esto porque realmente las soluciones son muchas de acuerdo al ambiente y tal vez lo más simple sea configurar las máquinas manualmente. Lo importante es que si el proxy es explícito las peticiones https son enviadas desde el browser a nuestro Proxy y este simplemente reenvía el certificado y los datos sin hacer cache ni nada de eso (pero si filtrando los sitios con squidGuard!)

Soluciones alternativas: El bloqueo de sitios lo realizamos por otro método, se pueden bloquear rangos de IPs con iptables o bloquear dominios desde el DNS (en este caso tendríamos que filtrar también el puerto 53 (dns) y que nuestro servidor de DNS local resuelva los dominios bloqueados localmente a una página web de “sitio bloqueado” por ejemplo).

Ahora si ya nuestro proxy filtra todos los sitios includos los https, solo resta bloquear el tráfico que intenta salir a Internet sin pasar por nuestro proxy para esto creamos una regla en Iptables, por ejemplo una muy restrictiva sería:

-A FORWARD -p tcp -m tcp -s 172.16.0.0/16 ! -d 172.16.0.1 -i eth1 -o eth0 ! --dport 80 -j REJECT --reject-with icmp-host-prohibited

Esto quiere decir que para toda nuestra LAN (172.16.0.0/16) si el puerto no es 80 (! –dport 80) y la ip remota no es la de nuestro server (! -d 172.16.0.1), simplemente ese tráfico se rechaza.

Cabe aclarar que acá estoy bloqueando más que solo el puerto SSL: 443, estoy bloqueando absolutamente TODO lo que no sea al puerto 80. Esto lo hago por una simple razón, existen Web Proxys que atienden peticiones en otros puertos distintos del 80 y si no hacemos esto saltarán nuestros filtros de sitios utilizando uno de ellos. Si configuran nuestro proxy explícitamente también podrán acceder a esos web proxys pero pasando por nuestros filtros de SquidGuard y hay listas de miles de Proxys para que sean filtrados.

Como solución total sería también filtrar los puertos remotos distintos de 80, 443, etc en el mismo squid, ya que los free proxys generalmente utilizan puertos en el rango de (1025-65535) pero esto trae más problemas porque tendremos todo esos accesos bloqueados y son utilizados por los software antivirus, windows, etc para sus updates y demás (aunque con un poco de trabajo y para determinados ambientes puede ser muy útil para evitar esto de jugar al gato y al ratón de las blacklists de proxys)

Bueno hasta este punto tenemos configurado el Proxy con bloqueo de sitios, Squid también admite limitar el número de ips y conexiones concurrentes para cada cliente y muchas otras cosas útiles.

Ahora veamos como Limitar el Tráfico:

En mi caso contamos con una pequeña conexión para toda una escuela asi que sin este punto es imposible que algo funcione! Como todas las conexiones pasan a través de Squid que mejor que limitarlo ahí mismo, para esto existen las Delay Pools (nuestro squid debe estar compilado con soporte para esto). Un artículo completo al respecto lo pueden encontrar en http://bulma.net/body.phtml?nIdNoticia=2284

Un ejemplo de uso sería el siguiente, simplemente editando squid.conf agregamos estas líneas:

delay_pools 1 delay_class 1 2
delay_parameters 1 32768/32768 8192/6144

Con esto creamos el límite de forma global, limitando el máximo para toda la red (32kb con ráfagas de 32kb) y cada cliente particular (8kb con ráfagas de 6kb). Cabe destacar que con los Delay Pools solo se limita el trafico de bajada (downstream)

Una alternativa para hacerlo directamente con iptables de una forma simple es con el script htb-gen: http://www.praga.org.ar/wacko/DevPraga/htbgen

Bloqueando el software P2P:

Esto no es sencillo y creo que la mejor alternativa es limitar el ancho de banda por cliente y el número de conexiones concurrentes (los 2 grandes problemas que traen estos programas) y simplemente quedarnos con eso. Sino la forma es analizando el tráfico y para esto hay una herramienta ipp2p (plugin de iptables), el sitio original es: http://www.ipp2p.org/ pero al parecer ya no dan soporte para nuevos kernels y versiones de iptables asi que ahora el proyecto parece continuar en xtables: http://sourceforge.net/projects/xtables-addons/

Por último y no menos importante necesitamos monitorear el uso de la red:

El que más me ha gustado particularmente es ntop: http://www.ntop.org

El servicio alimenta una interfaz web muy intuitiva que es muy útil para monitorear el uso y abuso de la red por parte de los clientes, nos sirve para detectar servidores proxys, malware, etc evaluando las conexiones y el ancho de banda utilizado.

También recomiendo utilizar algún sniffer para tales propósitos como ettercap o whireshark.

4 Replies to “#SysAdmin – Proxy #Squid Mejorar las consultas con DNS local”

  1. Bro, me he hecho un adicto a tu blog, pues realmente no tengo internet, y parafraseando el tema, te has vuelto un tremendo proxy entre mi trabajo e internet, quisiera saber algo más sobre squid, pero en este caso sobre proxy transparente, mi dirección de correo es nsaid26@hatuey.alinet.cu, saludos desde Santiago…

  2. Hola. Muchas gracias por tu artículo.
    Querìa hacerte una consulta, por si me podès dar una mano.
    Estoy interesado hacer dos grupos de ip uno con un ancho de banda TOTAL de 3 megas para todos los clientes, pero que a medida que lo vayan usando lo vayan dividiendo entre sí.
    Supongamos con dos usuarios cada uno tendrìa la mitad, con 3 usuarios 1/3 y asì sucesivamente, es decir que si alguno deja de navegar pues quede disponible para el otro nuevamente.
    Y hacer otro grupo prioritario que siempre tenga asegurado un mìnimo de descarga, supongamos que ese grupo puede descargar siempre a 512 megas.

    Es viable???

    Saludos y muchas gracias por tu tiempo!!!!!!!!1

  3. Hola, acabo de chocar con este espectacular blog, quiciera preguntar algo que en tres años, tras recorrer todo Internet no he podido lograr.
    Se trata de bloquear en squid un x Usuario… usando el logeo por ldap de window (active directory) y no solo como hasta ahora lo hago por el IP.

    #Tengo lo siguiente:
    auth_param basic program /usr/lib/squid3/squid_ldap_auth -R -v 3 -s sub -b “dc=empresa,dc=co,dc=cu” -D root@empresa.co.cu -W /etc/squid3/ldappass.txt -f sAMAccountName=%s -h 192.168.1.1

    acl passwd proxy_auth REQUIRED

    #Todo funciona ok, pero tengo la necesidad dado que varios usuarios trabajan en la misma pc, de que no todos puedan acceder al mismo sitio.

    #…esto ha sido un reto para mi, aun no encuentro respuestas.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*