La Magia de Pensar en Grande -- David J_ Schwartz.pdf
Memoria sobre Squid3
1. 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/.
2. 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 web
2. Configurar listas de control de acceso en squid
3. 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
3. 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 network
http_access allow localnet
http_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
tube
mega
direct
free
Para filtrar por tipo MIME los vídeos “quicktime” tendremos que agregar la siguiente directiva:
acl videos_quicktime rep_mime_type video/quicktime
http_reply_access deny videos_quicktime
Esto filtrará descargas http tanto de ficheros “.mov” como “.qt”
IES G.Nazareno | IAIG | Febrero 2011 Pag. 3/12
5. 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 iptables
stop() {
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
6. 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
7. 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&body=CacheHost%3A%20localhost%0D%0AErrPage%3A
IES G.Nazareno | IAIG | Febrero 2011 Pag. 7/12
8. 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
9. Squid3 en Debian Squeeze Arturo Borrero Gléz.
ALGUNAS CAPTURAS DE PANTALLA
IES G.Nazareno | IAIG | Febrero 2011 Pag. 9/12
10. Squid3 en Debian Squeeze Arturo Borrero Gléz.
IES G.Nazareno | IAIG | Febrero 2011 Pag. 10/12
11. Squid3 en Debian Squeeze Arturo Borrero Gléz.
IES G.Nazareno | IAIG | Febrero 2011 Pag. 11/12
12. Squid3 en Debian Squeeze Arturo Borrero Gléz.
CONCLUSIONE
S
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