viernes, 18 de marzo de 2011

Instalar y configurar proxy Squid en Debian y Ubuntu

Un proxy básicamente es un programa o dispositivo que recibe las peticiones de una red y en base a diferentes reglas que tiene configuradas las permite o no.
Por ejemplo, si mi PC sale a internet directamente a traves de un router standard va a poder acceder a todas las paginas que desee. El diagrama sería algo así:

PC > ROUTER > INTERNET

Ahora, con un proxy en el medio la salida a internet estaría limitada por las reglas que le configuremos:

PC > PROXY > ROUTER > INTERNET

Si en el proxy configuramos una regla donde, por ejemplo, nadie pueda acceder a youtube al intentar hacerlo aparecerá un mensaje como éste:


Para instalarlo solo necesitamos a nuestro querido apt-get:

sudo apt-get install squid

Una vez instalado procedemos a configurarlo, para ello editamos el siguiente archivo:

sudo nano /etc/squid/squid.conf

1. Con Ctrl + W buscamos la siguiente linea: http_port 3128


En esta linea configuramos el puerto por el cual Squid "escuchará" las peticiones. Por defecto viene el 3128, podemos cambiarlo por ejemplo al 8080. En mi caso, dejo el que viene por defecto.

2. Nuevamente con Ctrl + W buscamos la siguiente linea: cache_mem 8 MB


Aquí configuraremos la cantidad de memoria asignada para la caché de Squid. Ésta valor va a depender de la cantidad de RAM de la máquina, pero si tenemos 1GB podemos asignarle unos 256 MB. No olviden descomentar las líneas (quitar el simbolo #)

3. Buscamos la linea: cache_dir ufs /var/spool/squid 100 16 256


Este parámetro se encarga de asignar un espacio en el disco para almacenar la caché de Squid. Ufs es el formato con el que Squid guarda la caché en disco, luego viene la ruta donde se almacenará la misma y, por ultimo, aparece el tamaño máximo en disco que Squid utilizará.
Al primer valor (100) le asignaremos 1000 (MB), este valor no puede ser menor que el que hemos asignado antes a la memoria caché. Luego vienen los parámetro de directorio primario (16) y directorio secundario (256) en niveles. Establecerá 16 directorios de primer nivel y 256 subdirectorios de segundo nivel. Estos valores conviene dejarlo por defecto.

Hasta fue la configuración del proxy. Ahora seguimos con las listas de control de acceso:

1. Buscamos la linea: acl CONNECT method CONNECT
Aquí crearemos la primera regla que luego permitiremos (o denegaremos). La regla debe comenzar con "acl" y luego elegiremos el nombre de la misma, el metodo de acceso y por ultimo el rango de acceso. Por ejemplo:

acl redlocal src 192.168.1.0/24

En ésta regla indicamos cual es el origen de las conexiones. En este caso es la dirección de red 192.168.1.0 con mascara 255.255.255.0. Lo que abarca el rango de IP desde 192.168.1.0 hasta 192.168.1.255 (tener en cuenta que la primer dirección y la última no deben utilizarse).
Ahora crearemos otra regla para denegar la conexión a distintas paginas:

acl denegado url_regex "/etc/squid/denegado"

El método url_regex es para que el proxy analice las direcciones de acuerdo a las palabras que anotemos en una lista. En éste ejemplo luego del método colocamos una ruta con un archivo que Squid chequeará antes de permitir la conexión. Ese archivo estará formado por todas las palabras que queremos denegar. En lugar de la ruta podríamos escribirlas todas una al lado de la otra, separadas por espacios, pero si son muchas quedaría bastante desprolijo. Entonces, las 2 reglas que creamos quedaron de la siguiente forma:


2. Para permitir o denegar las reglas que creamos en el paso anterior debemos buscar la siguiente linea: http_access y debajo de la linea que dice # Only allow cachemgr access from localhost agregamos:

http_access deny denegado
http_access allow redlocal

Con esto denegamos el listado de palabras situado en "/etc/squid/denegado" y permitimos las conexiones de nuestra red.


Ya con esto estaría configurado el archivo squid.conf. Presionamos Ctrl + O para guardar, ENTER para mantener el nombre del archivo y Ctrl + X para salir.

Ahora crearemos el archivo con las palabras que deseamos denegar, para ello escribimos en la terminal:

sudo nano /etc/squid/denegado

Acá ingresamos todas aquellas palabras que queremos denegar una debajo de la otra. Guardamos con Ctrl + O, presionamos ENTER para mantener el nombre del archivo y Ctrl + X para salir.

3. Para activar el servicio escribimos en la terminal:

sudo /etc/init.d/squid restart

También podemos usar el parámetro "reload" en lugar de "restart" si en lugar de reiniciar el servicio solo queremos "recargar" la configuración del archivo squid.conf. Otros parametros posibles son "start" para iniciar el servicio o "stop" para detenerlo.
Aclaración: Cuando seguí estos pasos con Ubuntu 10.10 a la hora de reiniciar el servicio me encontré con que no estaba en /etc/init.d/squid sino en /etc/default/squid. Así que si no les llega a funcionar el paso anterior prueben escribiendo directamente "sudo squid restart" (si les dice que "Squid is already running!" deberán primero "matarlo" con "sudo kill NumeroProcessID" . En Debian 6.0 Squeeze funciona todo tal cual fue descripto.

Para hacer efectivo la configuración de nuestro proxy debemos configurarlo en el navegador.

1. Para Internet Explorer vamos a "Herramientas" > "Opciones de internet" > Pestaña "Conexiones" > "Configuración LAN"


Tildamos "Usar un servidor proxy para la LAN", en dirección escribimos la direccion IP de la máquina en la que está corriendo Squid y en puerto el 3128 (si es que no lo cambiamos). También debemos tildar la opción "No usar servidor proxy para direcciones locales".


Y listo, ya no deberia permitirnos ingresar a las palabras claves del archivo "denegado" ubicado en "/etc/squid/"

2. Por supuesto que el proxy se puede configurar en cualquier navegador. Por ejemplo para Chromium con Debian / Ubuntu debemos ir a "Herramientas" > "Opciones" ("Preferencias") > "Avanzadas" > "Cambiar la configuración del proxy" > "Configuración manual del proxy".


3. Para Firefox: "Herramientas" > "Opciones" o "Editar" > "Preferencias" > "Avanzadas" > Pestaña "Red" > "Configuración" > "Configuracion manual del proxy"


Y así con todos :)

Para que el proxy nos devuelva los mensajes de error en español debemos editar el archivo de configuración:

sudo nano /etc/squid/squid.conf

Luego buscamos la linea "error_directory /usr/share/squid/errors/en" la descomentamos y al final en lugar de "en" (inglés) escribimos "es" (español).


Guardamos con Ctrl + O, presionamos ENTER para mantener el nombre del archivo y Ctrl + X para salir.

Para que haga efecto la nueva configuración ejecutamos en la terminal:

sudo /etc/init.d/squid reload

Si deseamos editar los mensajes de error debemos seguir la ruta "/usr/share/squid/errors/es" y editar el mensaje que queramos. Dentro de esa carpeta aparecen todos los archivos con los mensajes de error que al ser abiertos a traves de un editor de texto podremos ver que están hechos con HTML con lo cual podremos editarlas facilmente y dejar el mensaje como queramos. Por ejemplo, yo edité el mio y quedó así:


Por ultimo, y ya para finalizar el tutorial, decirles que si desean ver el log con los intentos de acceso a las palabras clave denegadas pueden hacerlo abriendo el archivo ubicado en /var/log/squid/access.log.

Eso ha sido todo, a denegar! :P

Referencia: Instalación de un servidor proxy Squid en Ubuntu

IMPORTANTE: Si lo que queres es bloquear una sola página, o unas pocas, quizás te convenga hacerlo editando el archivo hosts como expliqué una vez aquí. Ahí no vas a tener que instalar ni configurar nada, basta con editar un solo archivo.

12 comentarios:

  1. hace tiempo que se puede usar como opcion que el Proxy sea transparente.

    En la linea:

    http_port tu_IP:3128

    cambiala por

    http_port tu_ip:3128 transparent

    - Guarda el archivo squid.conf
    Reinicia Squid
    # service squid restart

    ahora para que pesque correctamente...

    # iptables -t nat -A PREROUTING -i ethX -p tcp --dport 80 -j REDIRECT --to-port 3128

    donde ethX es la tarjeta de red que tienes asignada para que escuche a tu red local, en un ambiente de dos adaptadores de red, usualmente es el eth1, pero lo tienes que ver tu.

    Para que el iptables mantenga esa nueva configuracion:

    # iptables save
    # service iptables restart

    Disfruta ahora un proxy transparente, para que no tenga cada usuario que modificar sus opciones de navegacion agregando tu proxy.

    ResponderEliminar
    Respuestas
    1. En la línea, donde dices http_port tu_ip:3128 transparent, que ip has de poner??

      Otra, cuando escribo iptables save, no me lo reconoce como comando.

      Gracias por todo.

      Eliminar
  2. Muy bonito amigo sigue adelante, yo aprendi esto de mala manera pero alli estamos!

    ResponderEliminar
  3. Yo lo tengo montado en windows, con Delay pools habilitado, de esta forma puedes controlar la velocidad que tenga cada computadora lo malo la limitante de squid es que no es capaz de controlar el trafico https. Bueno aunque en si no es limitante de squid es la naturaleza del trafico https.

    ResponderEliminar
    Respuestas
    1. Lo puedes controlar con iptables

      Eliminar
  4. Donde va
    #iptables save va realmente
    #iptables-save

    ResponderEliminar
  5. tengo varias dudas que me estan matando.
    1-. si configuro el modem adsl en la eth0 y configuro la atarjeta eth0 con inet dhcp sirve?
    2.- como sabe eth1 que va a salir por la eth0?
    3.- si configuro todo asi como dice aca y saco un cable de la eth1 hacia un switch de 24 puertos, y configuro cada PC manualmente asignandole ip estatica ademas el proxy en el browser o navegador con el puerto 3128 como sabe el squid que esa pc saldra por la eth1 y luego por la eth0?

    estoy tratando de hacer mi proxy con debian 6 sin el entorno grafico, tengo las 2 tarjetas y ademas tengo un adsl de 2mb de CANTV.net (provedor de servicio en venezuela), creo que no es necesario el dhcp-server ó isr-dhcp-server porque no pienso darles ip automaticas sino manuales para saber quien es quien en mi listado de pc.

    agradesco toda la ayuda posible al correo: semer_uco@hotmail.com gracias

    ResponderEliminar
  6. me aparece un error al reiniciar el squid...

    "acl ParseACLline: Warning: empty acl denegado url_regex "etc/squid/denegado"

    . "acl name all not defined"

    terminate abnormally ...

    espero que me puedan ayudar gracias.

    ResponderEliminar
  7. Tengo instalado el Squid en Windows 7, pero no se como habilitarlo,alguien me podría ayudar por favor. Muchas Gracias

    ResponderEliminar
  8. Instalé Squid versión 3.4.9 en Centos 7, pero al querer iniciar squid me sale el siguiente error Failed to issue method call: Unit squid.service failed to load: No such file or directory.
    Alguien puede ayudarme?

    ResponderEliminar
    Respuestas
    1. como hago para que me bloquee una pagina web no me funciona :(

      Eliminar