Squid 3 Arturo Bgl Ice Ns

12
Squid3 en Debian Squeeze Arturo Borrero González IES G.Nazareno, IAIG Febrero 2011 Documento bajo licencia “"CC-BY-SA 3.0" ”. Usted es libre de copiar, modificar y redistribuir este documento, bajo la misma licencia. Este documento o uno muy similar puede encontrarse en http://www.ral-arturo.blogspot.com/ .

Transcript of Squid 3 Arturo Bgl Ice Ns

Page 1: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze

Arturo Borrero GonzálezIES G.Nazareno, IAIG

Febrero 2011Documento bajo licencia “"CC-BY-SA 3.0"”.Usted es libre de copiar, modificar y redistribuir estedocumento, bajo la misma licencia.Este documento o uno muy similar puede encontrarse en http://www.ral-arturo.blogspot.com/.

Page 2: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

INTRODUCCIÓN

Squid3 es un proxy http que sirve, entre otras cosas, para cachear y filtrar contenido que pasa por su control, ofreciendo funciones de control de tráfico web, control de acceso y reducción del tráfico de red.La finalidad de esta memoria se describe a continuación:

Objetivos

1. Comprender el funcionamiento de un servidor proxy web2. Configurar listas de control de acceso en squid3. Crear reglas de NAT en iptables para que squid funcione en modo transparente

Pasos a realizar

1. Instala y configura squid3 para que puedan utilizarlo los equipos de la red virtual 10.0.0.0/8

2. Realiza las configuraciones necesarias para que los equipos de la red virtual utilicen squid de forma transparente y que esta modificación permanezca tras reiniciar el servidor.

3. Incluye una ACL para que no puedan descargarse URL que incluya alguna de las siguientes palabras: tube, mega, direct, free.

4. Bloquear las respuestas de videos quicktime.

Para ello, dispongo de la siguiente configuración previa de máquinas y sistemas:

· Máquina “nostromo”. Dom0, debian squeeze.· Ips: 10.0.0.128 y 192.168.0.17· Router entre la red 10.0.0.0/8 y la red 192.168.0.0/24, NAT.· Proxy squid3

· Máquina “goku”. DomU (kvm), debian squeeze.· Ip 10.0.0.1· Cliente web.

· Cable-modem router· Ip 192.168.0.1· NAT entre la red 192.168.0.0/24 e internet.

Todo el software usado puede encontrarse de forma libre y gratuita en los repositorios oficiales de Debian.

IES G.Nazareno | IAIG | Febrero 2011 Pag. 2/12

Page 3: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

INSTALACIÓN Y CONFIGURACIÓN DE SQUID3

Squid3 se instala fácilmente desde los repositorios oficiales de debian. Se instalarán algunos paquetes como dependencias:

# aptitude install squid3

El fichero de configuración de Squid3 es muy completo y complejo. En la versión de debian squeeze, tiene más de 5400 lineas y muchas posibles directivas. Por fortuna, la gran mayoría son comentarios sobre la utilización del sistema.

Para empezar a trabajar, tendremos que modificar las directivas de control de acceso (ACLs) que permitirán a la red local virtual 10.0.0.0/24 usar squid3:

/etc/squid3/squid3.conf

[…][…]acl localnet src 10.0.0.0/24 # RFC1918 possible internal networkhttp_access allow localnethttp_port 3128 transparent[…][…]

Para conseguir los filtrados requeridos, creamos las siguientes directivas:

acl urls_prohibidas url_regex -i “/etc/squid3/urls_prohibidas.txt”http_access deny urls_prohibidas

Y en el fichero citado añadimos las palabras claves que queremos filtrar en las URLs:

/etc/squid3/urls_prohibidas.txt

tubemegadirectfree

Para filtrar por tipo MIME los vídeos “quicktime” tendremos que agregar la siguiente directiva:

acl videos_quicktime rep_mime_type video/quicktimehttp_reply_access deny videos_quicktime

Esto filtrará descargas http tanto de ficheros “.mov” como “.qt”

IES G.Nazareno | IAIG | Febrero 2011 Pag. 3/12

Page 4: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

La configuración final de Squid3 quedaría de la siguiente manera:

root@nostromo:/home/arturo# cat-dry /etc/squid3/squid.conf ---> Mostrando fichero /etc/squid3/squid.conf || Original: 5545 || Visualizado: 34 1 acl manager proto cache_object 2 acl localhost src 127.0.0.1/32 ::1 3 acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 4 acl urls_prohibidas url_regex -i "/etc/squid3/urls_prohibidas.txt" 5 acl videos_quicktime rep_mime_type video/quicktime 6 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network 7 acl SSL_ports port 443 8 acl Safe_ports port 80 # http 9 acl Safe_ports port 21 # ftp 10 acl Safe_ports port 443 # https 11 acl Safe_ports port 70 # gopher 12 acl Safe_ports port 210 # wais 13 acl Safe_ports port 1025-65535 # unregistered ports 14 acl Safe_ports port 280 # http-mgmt 15 acl Safe_ports port 488 # gss-http 16 acl Safe_ports port 591 # filemaker 17 acl Safe_ports port 777 # multiling http 18 acl CONNECT method CONNECT 19 http_reply_access deny videos_quicktime 20 http_access deny urls_prohibidas 21 http_access allow localnet 22 http_access allow manager localhost 23 http_access deny manager 24 http_access deny !Safe_ports 25 http_access deny CONNECT !SSL_ports 26 http_access allow localhost 27 http_access deny all 28 http_port 3128 transparent 29 hierarchy_stoplist cgi-bin ? 30 coredump_dir /var/spool/squid3 31 refresh_pattern ^ftp: 1440 20% 10080 32 refresh_pattern ^gopher: 1440 0% 1440 33 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 34 refresh_pattern . 0 20% 4320

IES G.Nazareno | IAIG | Febrero 2011 Pag. 4/12

Page 5: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

CONFIGURACIÓN DE IPTABLES

Para que las máquinas de la red virtual 10.0.0.0/8 usen el protocolo http de forma transparente a través de squid3, necesitaremos la siguiente configuración de iptables:

/etc/iptables.conf

#!/bin/bash

# borrado de reglas anteriores iptables -F iptables -t nat -F PREROUTING iptables -t nat -F POSTROUTING iptables -t nat -F OUTPUT iptables -t filter -F FORWARD iptables -t filter -F OUTPUT iptables -t filter -F INPUT

# Redireccionamiento a SQUID3 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128

# Source NAT hacia 192.168.0.0/24 para que pueda hacerse # una conexión hacia internet de ida y vuelta correcta.# Invariablemente se usan interfaces eth0 y eth1 iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Es importante pensar en qué va a pasar cuando el servidor se reinicie. Estas reglas de iptables no son “persistentes”. Voy a proponer una manera de solucionarlo, aunque a priori se me ocurren varios métodos que pueden ser igual de válidos:

/etc/init.d /iptables

#!/bin/bash

RETVAL=0

# Funcion iniciar iptables start() { echo -n "Iptables insertadas..." sh /etc/iptables.conf RETVAL=0 }

# Función parar iptablesstop() { echo -n "Lo siento, tendrás que borrar las reglas de iptables mano." # fichero de borrado de reglas, no creado.. RETVAL=0 }

case $1 in

IES G.Nazareno | IAIG | Febrero 2011 Pag. 5/12

Page 6: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

start) start ;; stop) stop ;; restart) stop start ;; status) /sbin/iptables -L /sbin/iptables -t nat -L RETVAL=0 ;; *) echo "Sitaxis: iptables{start|stop|restart|status}" RETVAL=1 esac

exit

Este script debe tener permisos de ejecución para root. Para que se inicie automáticamente en el arranque del sistema, debemos hacer lo siguiente:

root@nostromo:~# update-rc.d /etc/init.d/iptables defaults

Esto generará que debian introduzca automáticamente el fichero en la configuración de arranque del sistema, en función de las dependencias, etc..Ahora si nos fijamos, el script tendrá un enlace en las carpetas de scripts de los distintos runlevels (p.e. /etc/rc2.d/) y se le habrá asignado un número correcto.Este es el método correcto de agregarlo al inicio, porque hacerlo manualmente puede dar muchos problemas (aparte de que tendríamos que inventarnos la posición de arranque dentro de la carpeta /etc/rcX.d/).

IES G.Nazareno | IAIG | Febrero 2011 Pag. 6/12

Page 7: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

PRUEBAS DE FUNCIONAMIENTO

De un mismo movimiento voy a probar que Squid3 realmente funciona de manera transparente para los clientes http y que además filtra el contenido que hemos especificado a través de las ACLs.

Aquí puede verse una conexión TCP/IP desde goku (10.0.0.1) al puerto 80 de www.youtube.com.Youtube.com no debe mostrarse al cliente dado que choca con las ACLs escritas.Al hacer “GET http://youtube.com”, Squid3 intercede, mostrando el correspondiente mensaje de advertencia/error. Dado que usé telnet y no un navegador, el http/html es devuelto plano, sin nada que lo procese e interprete. He recortado la etiqueta <style> para mayor comprensión:

root@goku:~# telnet www.youtube.com 80 Trying 74.125.230.163... Connected to youtube-ui.l.google.com. Escape character is '^]'. GET http://youtube.com/ HTTP/1.0 403 Forbidden Server: squid/3.1.6 Mime-Version: 1.0 Date: Sun, 13 Feb 2011 20:00:59 GMT Content-Type: text/html Content-Length: 3012 X-Squid-Error: ERR_ACCESS_DENIED 0 Vary: Accept-Language Content-Language: en X-Cache: MISS from localhost X-Cache-Lookup: NONE from localhost:3128 Via: 1.0 localhost (squid/3.1.6) Connection: close

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ERROR: The requested URL could not be retrieved</title> <style type="text/css">[...][...][...]</style></head><body> <div id="titles"> <h1>ERROR</h1> <h2>The requested URL could not be retrieved</h2> </div> <hr>

<div id="content"> <p>The following error was encountered while trying to retrieve the URL: <a href="http://youtube.com/">http://youtube.com/</a></p>

<blockquote id="error"> <p><b>Access Denied.</b></p> </blockquote>

<p>Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect.</p>

<p>Your cache administrator is <a href="mailto:webmaster?subject=CacheErrorInfo%20-%20ERR_ACCESS_DENIED&amp;body=CacheHost%3A%20localhost%0D%0AErrPage%3A

IES G.Nazareno | IAIG | Febrero 2011 Pag. 7/12

Page 8: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

%20ERR_ACCESS_DENIED%0D%0AErr%3A%20%5Bnone%5D%0D%0ATimeStamp%3A%20Sun,%2013%20Feb%202011%2020%3A00%3A59%20GMT%0D%0A%0D%0AClientIP%3A%2010.0.0.1%0D%0A%0D%0AHTTP%20Request%3A%0D%0AGET%20%2F%20HTTP%2F0.9%0A%0D%0A%0D%0A">webmaster</a>.</p> <br> </div>

<hr> <div id="footer"> <p>Generated Sun, 13 Feb 2011 20:00:59 GMT by localhost (squid/3.1.6)</p> <!-- ERR_ACCESS_DENIED --> </div> </body></html> Connection closed by foreign host.

Esta petición ha generado el siguiente log de squid3:

root@nostromo:~#tail /var/log/squid3/access.log[...]1297627259.432 0 10.0.0.1 TCP_DENIED/403 3368 GET http://youtube.com/ - NONE/- text/html

Viendo el mensaje de log, podriamos pensar que no sería demasiado complicado realizar un pequeño script que lo leyera y pusiera de forma visible quién ha estado intentando acceder a contenido filtrado con Squid3. Aunque no corresponde hacerlo en esta práctica.

Para probar el funcionamiento del filtrado por MIME-TYPE, he accedido a la web […] y he intentado visualizar un archivo de video quicktime.

El video no se ha mostrado, como puede verse en las capturas de pantalla del final de la memoria, y además se ha generado el siguiente mensaje en el log de squid3:

root@nostromo:~#tail /var/log/squid3/access.log[...]1297630445.737 304 127.0.0.1 TCP_DENIED_REPLY/403 5279 GET http://trailers.apple.com/movies/disney/wall-e/wall-e-clip-magnet_h.320.mov - DIRECT/77.67.20.161 text/html

IES G.Nazareno | IAIG | Febrero 2011 Pag. 8/12

Page 9: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

ALGUNAS CAPTURAS DE PANTALLA

IES G.Nazareno | IAIG | Febrero 2011 Pag. 9/12

Page 10: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

IES G.Nazareno | IAIG | Febrero 2011 Pag. 10/12

Page 11: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

IES G.Nazareno | IAIG | Febrero 2011 Pag. 11/12

Page 12: Squid 3 Arturo Bgl Ice Ns

Squid3 en Debian Squeeze Arturo Borrero Gléz.

CONCLUSIONES

He podido comprobar que Squid es un software extremadamente potente. Antes de trabajar con él, no conocía ningún equivalente. Tiene unas inmensas opciones de configuración, algunas de ellas que ni siquiera han sido mencionadas en esta memoria (autenticación contra LDAP, Kerberos, etc..).Configurar a alto nivel Squid imagino que debe de ser un trabajo muy grande y que requerirá mucho trabajo por parte de el/la/los administrador/a/es/as de sistemas.

Pienso que el fichero de configuración de Squid es demasiado grande y complejo y creo que de fábrica se debería partir en varios subconjuntos, como ACLs, configuración de cachés, autenticaciones, etc.. Seguro que se puede hacer manualmente, pero si viene desde los paquetes de este modo, pues mucho mejor.En definitiva, pienso que es una práctica muy pequeña y rápida para las posibilidades que realmente ofrece Squid.

ENLACES y REFERENCIAS

• http://wiki.squid-cache.org/ConfigExamples • http://www.juanfelipe.net/node/30• http://www.linofee.org/~jel/proxy/Squid/accesslog.shtml• http://squidproxy.wordpress.com/2007/11/17/how-cachable-is-google-part-2-

youtube-content/• http://albertomolina.wordpress.com/2009/01/09/nat-con-iptables/• Documentación y apuntes de Iptables de 1º de ASI (09-10) en IES G.Nazareno,

escritos por el profesor Jesús Moreno León.• http://www.google.com

IES G.Nazareno | IAIG | Febrero 2011 Pag. 12/12