Squid Rewrite Program

En este artículo vamos a crear un redirector para Squid. El objetivo de este redirector será poder modificar la url de destino de los usuarios si estos intentan acceder a alguna página que deseamos controlar o limitar su acceso. De esta forma podremos redirigir las peticiones de los equipos clientes hechas a urls no permitidas a paginas informativas predeterminadas o a la dirección deseada. Mostraremos ciertos ejemplos y estudiaremos las opciones de configuración básicas para hacer funcionar el sistema correctamente.

¿Qué necesitamos?

     – Proxy Squid instalado correctamente (acceder al manual de instalación)

     – Script de redirección en perl

 

Lo primero que haremos será crear nuestro script de redirección.

     > vim redirector.pl

 

A continuación mostramos un ejemplo estándar que podremos usar como base para los diferentes scripts que queramos crear:

#!/usr/bin/perl
$|=1;
while (<>) {
     @X = split;
     $url = $X[0];
     if ($url =~ /^http:\/\/www\.gmail\.com/) {
          print "302:http:\/\/www\.hotmail\.com\n";
     }
}

Con este script vamos a redirigir a todos los usuarios que quieran accede a http://www.gmail.com/ a http://www.hotmail.com. Es importante tener en cuenta que el redirector recibirá la url con “http://&#8221; al inicio y “/” al final por lo tanto debemos tenerlo en cuenta a la hora de trabajar con urls en el script. Además deberemos añadir “302:” al inicio indicando “movido temporalmente” o “301:” movido permanentemente.

En este siguiente ejemplo vamos a enviar información a un Servicio Web para que este nos informe sobre si un determinado usuario puede visitar una determinada página. De esta forma, podemos usar este Servicio Web para decidir si permitimos o no el acceso a un cliente determinado. Para eso, lógicamente, tendremos que programar un Servicio Web para que haga esta función (no mostrado en este manual).

Este ejemplo está basado en el artículo publicado hace unos días en este Blog “Cliente Web Service en Perl”.

#!/usr/bin/perl
use SOAP::Lite;
$service = SOAP::Lite
          -> uri('http://main/xs')
          -> proxy('http://localhost/axis2/services/filtrado);
$|=1;
while (<>) {
     @X = split;
     $url = $X[0]; #Obtenemos URL solicitada
     $ip = $X[1]; #Obtenemos IP del cliente
 
     $result = $service -> filtrado($ip, $url) -> result();
 
     if ($result == 0){ #BLOQUEADO
          print "302:http://pc1/filter/prohibido.html\n";
     }else{ #PERMITIDO
          print "$url\n";
     }
}

Como podemos ver, primero configuramos el servicio para conectarnos al Web Service, posteriormente obtenemos el primer parámetro (dirección URL) y el segundo parámetro (dirección IP del cliente) que nos facilitará Squid. Una vez tenemos esta información llamaremos al servicio web el cual nos devolverá un resultado numérico: 0 bloquear acceso, 1 permitir acceso. De esta forma, sabemos si este usuario puede visitar una determinada página Web.

La gran ventaja de este sistema es que podemos crear diferentes perfiles para diferentes usuarios según sus características.

Una vez hemos creado el script, lo guardaremos y le daremos permisos de ejecución. Seguidamente podemos probar su funcionamiento introduciendo:

     > perl redirector.pl
     https://blogdeaitor.wordpress.com/ 192.168.1.1
     https://blogdeaitor.wordpress.com/

Aquí vemos como nos ha permitido el acceso a Aitor’s Blog. Tras introducir “perl redirector.pl” nuestro sript se quedará esperando a recibir los parámetros de entrada. Al introducir “https://blogdeaitor.wordpress.com/ 192.168.1.1” el sistema hace las operaciones programadas y nos devuelve “https://blogdeaitor.wordpress.com/&#8221;.

 

En este otro ejemplo, vemos como el programa detecta que este usuario no puede visitar la página solicitada y lo redirige a otro destino (en este caso, una página creada por nosotros mismos):

     > perl redirector.pl
     http://www.otrapaginaprohibida.com/ 192.168.1.1
     302:http://192.168.1.11:8000/filter/prohibido.html

 

Ahora que hemos comprobado que todo funciona correctamente, vamos a decirle a Squid que debe usar este redirector y a indicarle donde encontrarlo.

Accedemos al archivo de configuración:

     > vim /etc/squid/squid.conf

Y añadiremos la ruta del script creado en la etiqueta “url_rewrite_program”.

     url_rewrite_program /home/aitor/scripts/redirector.pl

Con esto, el redirector debería funcionar correctamente.

 

A continuación explicaremos los parámetros de configuración de Squid referentes al URL Rewriter:

 

Nombre de la Opción: url_rewrite_program

Valor por defecto: none

Nos indica la ubicación del script creado anteriormente. Para cada request, Squid nos envía una entrada formada por:

“URL <SP> client_ip “/” fqdn <SP> user <SP> method [<SP> kvpairs]<NL>”

Como hemos visto antes, para recuperar esta información usaremos “$parm1 = $X[0];” para el primer parámetro, “$parm2 = $X[1];” para el segundo, etc.

 

Nombre de la Opción: url_rewrite_access

Valor por defecto: todas

Nos informa sobre que requests (URLs) deberán ser procesadas por el redirector. Es una acl con las direcciones url a ser procesadas. Por defecto se procesan todas las peticiones.

 

Nombre de la Opción: url_rewrite_bypass

Valor por defecto: off

Cuando esta activado “on”, una petición no utilizará un redirector si todos ellos están ocupados y, por lo tanto, el cliente accederá a la página solicitada sin ningún control. Si este en “off”, si Squid no dispone de redirectores suficientes para todas las solicitudes, este terminará con un error crítico pidiendo el aumento del número de redirectores. En el caso de que este redirector este haciendo un trabajo de control de acceso, se recomienda no tener esta opción a “on” para que un cliente nunca pueda saltarse este control en el caso de que todos los redirectores estén ocupados.

 

Nombre de la Opción: url_rewrite_children

Valor por defecto: 5

El numero de procesos hijo de nuestro redirector que vamos a tener en ejecución a la vez. Un número muy pequeño puede causar que algunas peticiones deban esperar a ser resueltas si todos los redirectores están ocupados atendiendo peticiones. Un número muy grande causará un mayor uso de CPU y de memoria en nuestro sistema.

 

Nombre de la Opción: url_rewrite_concurrency

Valor por defecto: 0

El número de solicitudes de ayuda que cada redirector puede manejar de forma concurrente en paralelo. Un valor de 0 indica que el redirector utiliza un solo hilo de ejecución. Cuando el valor es >=1 puede usar diferentes hilos de ejecución.

 

Nombre de la Opción: url_rewrite_host_header

Valor por defecto: on

De forma predeterminada Squid reescribe cualquier cabecera en las peticiones redirigidas. Las entradas se almacenarán en cache con el resultado de la reescritura de sus cabeceras con lo cual se debe ir con cuidado si se utilizan hosts virtuales.

 

A no ser que tengamos unas necesidades concretas, las opciones por defecto bastarán para trabajar correctamente con Squid utilizando redirectores.

Anuncios

2 Responses to Squid Rewrite Program

  1. luz elena says:

    Hola, me encantan tus publicaciones : ) disculpa tienes mail o msn en donde pueda contactarte?

    Gracias

    Luz

  2. jgalarzar says:

    excelente aporte

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: