Libertonia
Portada · Todo · Software Libre · Desarrolladores · Comunidad · Internet · Tecnología · Meta · Diarios
Chapucity of Service en router OfficeConnect Remote 812 de 3com

atordo's Diary
Por atordo
departamento Pepe Gotera y Otilio , Sección Diarios
Puesto a las Tue Oct 12th, 2004 at 12:15:38 AM CET
Como bien sabemos sus sufridos usuarios, este router ADSL no tiene nada parecido a QoS (Quality of Service), pero no hay mal que un BOFH cabre^H^H motivado y unas líneas de perl no puedan remediar.

 


Escenario
Red diversa conectada al router que da salida a Internet. Usuario demasiado aficionado a las redes de pares al que por desgracia no se le puede cortar sin más la conexión. Tampoco es posible enrutar todo el tráfico a través de un equipo (lo que haría posible poner QoS de verdad), pero disponemos de un equipo Linux permanentemente encendido.

Apaño (aquí hubiera preferido poner "solución", pero me temo que esto se aproxima más a la verdad)
Script en perl que activa o desactiva un filtro del 3com según el número de conexiones que tenga el usuario. Usaremos el directorio $HOME/filtro. Al script lo he llamado conexiones.pl


#!/usr/bin/perl
#
#

use strict;
use HTTP::Request::Common;
use LWP::UserAgent;

my $ruta="$ENV{HOME}/filtro";

sub main {
   my @num;
   #my @ip;
   my $url="http://usuario:clave\@ip_del_router/US/Internet/list_nataddr";
   my $pagina;
   my $i=0;
   my $k;
   my @linea;

   do {
      $pagina=&mira_pagina($url);
      $i++;
   } while (!$pagina && $i<3);

   if ($pagina) {
      @linea=split(/\n/,$pagina);
      #print "Líneas: $#linea\n";
      $i=0;
      #print $pagina;
      do {
         $k=$#num+1 if ($linea[$i] =~ /a\.b\.c\.d/);
         push (@num,$1)
            if ($linea[$i] =~ /\t       \t       (\d+)\t\t   <\/TD>/);
         $i++;
      } while ($i<$#linea);
      #print "Conexiones totales: ".($num[$k]+$num[$k+1])."\n";

      if ($num[$k]+$num[$k+1] > 30) {
         unless (&filtrado) {
            print "$num[$k]/$num[$k+1] conexiones, activando filtro\n";
            system("$ruta/filtroon");
            &filtrado(1);
         }
      }
      elsif (&filtrado) {
         print "$num[$k]/$num[$k+1] conexiones, desactivando filtro\n";
         system("$ruta/filtrooff");
         &filtrado(2);
      }
   }
   else {
      die ("No puedo descargar $url tras $i intentos\n");
   }
}

sub mira_pagina {
   my $url=shift;
   my $ua = new LWP::UserAgent;
   my $res;

   $res = $ua->request(GET $url);
   if ($res->is_success) {
      return $res->content;
   }
   else {
      return;
   }

}

sub filtrado {
   my $param=shift;  # nada=estado, 1 filtrar, 2 quitar flitro
   my $estado;

   if ($param) {
      open (FILTRO,">$ruta/filtrado") || die("No puedo abrir $ruta/filtrado\n");
      if ($param==1) {
         print FILTRO 1;
      }
      elsif ($param==2) {
         print FILTRO 0;
      }
      close (FILTRO);
   }
   else {
      open (FILTRO,">$ruta/filtrado") || return 0;
      read (FILTRO,$estado,1);
      close (FILTRO);
      return $estado;
   }
}

&main;

A cambiar:

  • usuario: un usuario del router con permiso para usar el interfaz web.
  • clave: la de usuario en el router.
  • ip_del_router: la del 3com en la red local.
  • a\.b\.c\.d: IP a vigilar.
  • 30: número de conexiones (UDP+TCP) con las que se activará el filtro.

Scripts para activar y desactivar el filtro
Mi intención original era entrar al CLI con expect, pero no he conseguido encontrar en el puñetero manual de 3com la forma de habilitar y deshabilitar filtros desde el CLI (pasarlos de enabled: no a enabled: yes). Si alguien tiene más información, se agradecería que la compartiese. Así que al final he optado por usar el interfaz web con curl.
Nótese que estos scripts cambian el estado del filtro "nombre". Este filtro debe estar creado previamente, y en mi caso contiene la sencilla (y efectiva) regla "Discard Packet if IP Source Address is Equal to a.b.c.d".

  • filtroon
    #!/bin/sh
    
    curl http://usuario:clave@ip_del_router/US/1/Forms/filterModify \
    -d 'usrDefinedFilterName=nombre&usrDefinedFilterEnabled=on&Submit=Modify'
    
  • filtrooff
    #!/bin/sh
    
    curl http://usuario:clave@ip_del_router/US/1/Forms/filterModify \
    -d 'usrDefinedFilterName=nombre&Submit=Modify'
    

Ojo que es posible que la url varíe de router a router, pero para averiguarlo basta con habilitar el filtro desde un navegador.

Ya sólo queda poner el script en cron:

*/5 * * * *       /usr/bin/perl /ruta_a_home/filtro/conexiones.pl

También es conveniente quitar el filtro de vez en cuando, por si fallase el router (sorpresa) y no se grabase correctamente el estado, se apagase el equipo o cualquier otra eventualidad:

3 */8 * * *     rm -f /ruta_a_home/filtro/filtrado ; /ruta_a_home/filtro/filtrooff

No es que sea una solución óptima, pero es más cómodo que poner el filtro a mano cada vez que tengo un ping de 5 segundos.

< Sun y el software libre (47 comments) | Conoce Portugal de la mano del Software Libre (0 comments) >
Enlaces Relacionados
· QoS de verdad
· expect
· puñetero manual de 3com
· curl
· More on atordo's Diary
· Also by atordo

Encuesta
Mejor hubiera sido...
· ingeniería social 22%
· desenchufar el cable ethernet 0%
· crucifixión 11%
· empalamiento 22%
· desuello 0%
· descuartizamiento 0%
· ¡la hogera! ¡la hogera! ¡la hogera! 22%
· todas las de arriba 22%

Votos: 9
Resultados | Otras Encuestas

Menu
· crear cuenta
· FAQ
· búsqueda
· Fuentes de Noticias

Login
Nueva cuenta
Usuario:
Contraseña:

Ver: Modo: Orden:
Chapucity of Service en router OfficeConnect Remote 812 de 3com | 4 comentarios (4 temáticos, editoriales, 0 ocultos)
Filtros desde el CLI (none / 0) (#1)
por atordo a las Tue Oct 12th, 2004 at 06:39:25 PM CET
(Información Usuario)

La interfaz web falla más que una escopeta de feria, pero al fin me enteré de cómo activar los filtros por telnet. El caso es que no funciona con filtros creados desde web, así que hay hacerlo a pelo:
  • Crear un fichero de texto (nombre.FLT) con el filtro:
    #filter
    IP:
    1 REJECT src-addr = a.b.c.d;
    
  • Subir el fichero al router por tftp.
  • Añadir el filtro a la lista de idems con add filter nombre.FLT.
  • Ahora ya puede activarse y desactivarse con las órdenes set vc Internet output_filter nombre.FLT y set vc Internet output_filter "" (esta última orden también desactivará cualquier otro filtro de salida, pero no parece haber una forma de seleccionarlos individualmente).


El script filtroon para expect quedaría así:
#!/usr/bin/expect -f

set timeout 30
spawn telnet ip_del_router
expect "login:"
send -- "usuario\r"
expect "Password:"
send -- "clave\r"
expect "3Com-DSL>"
send -- "set vc Internet output_filter nombre.FLT\r"
expect "3Com-DSL>"
send -- "exit\r"
expect eof
Para filtrooff basta cambiar la línea set vc Internet...



 
Corrección (none / 0) (#2)
por atordo a las Tue Oct 12th, 2004 at 06:55:34 PM CET
(Información Usuario)

En el script conexiones.pl, donde pone:
open (FILTRO,">$ruta/filtrado") || return 0;
debería poner:
open (FILTRO,"<$ruta/filtrado") || return 0;
(Tuve problemas con el HTML y convertí a mano los signos de mayor y menor).



 
Oh maestro, iluminame (none / 0) (#3)
por jamarier a las Fri Oct 15th, 2004 at 02:06:01 PM CET
(Información Usuario) http://barbacana.net/blog/

Yo tambien tengo un cacharro (cariñosamente) como el tuyo. Todo eso que has aprendido ¿lo sacaste del manual del 3com al que haces referencia? o ¿tienes otras documentaciones alternativas donde te ilustraste?

Oh muestranos el camino, gran gurú de los pobres ignorantes.

-----
- Porque mañana será un gran día.



Documentación (none / 0) (#4)
por atordo a las Fri Oct 15th, 2004 at 05:31:44 PM CET
(Información Usuario)

Cesa ya tus genuflexiones, pequeño saltamontes ;)

Simplemente buscando "3com 812" encontrarás abundante material, gran parte de él en castellano (debido a la masiva implantación de este router por Telefónica en los primeros tiempos del ADSL).

También puedes experimentar abriendo una sesión telnet y probando los comandos del manual. Los cambios no son permanentes mientras no los grabes (save all), así que si rompes algo debería solucionarse haciendo un reboot.

Lo irritante del cacharro es que no siempre hace lo que debería hacer. Por ejemplo, en los filtros tiene la curiosa costumbre de cambiar AND por OR después de un reboot...

[ Padre ]


 
Chapucity of Service en router OfficeConnect Remote 812 de 3com | 4 comentarios (4 temáticos, editoriales, 0 ocultos)
Ver: Modo: Orden:

ecol Logo Powered by Scoop
Todas las Marcas Registradas y copyrights de esta página son propiedad de sus respectivos dueños.
Los comentarios son propiedad del que los escribe.
Los iconos de las noticias y el logotipo son propiedad de Javier Malonda.
El Resto © 2002 Escomposlinux.org y aledaños.

Puedes sindicar los contenidos de libertonia en formato RSS 1.0 y RDF 0.9. También se puede sindicar la cola de envíos pendientes de moderación.

El proyecto escomposlinux.org está dedicado a la memoria de tas

crear cuenta | faq | búsqueda