On Sun, 2003-02-02 at 07:13, Borxa Varela wrote:

> > Lo �nico que se me ocurre es que (1) realmente eres parte de un
> > LAN, y no nos lo hab�as dicho, y est�s ruteando ese LAN a trav�s
> > de tu conexi�n PPP o algo as� (en cuyo caso mi recomendaci�n del
> > netstat aplicar�a para todas las m�quinas del LAN).  O (2), tu
> > proveedor de acceso te est� enviando tr�fico que no es para ti.
>
> Me inclino por la 2? No puede ser que otros usuarios a los que se le
> asign� la ip que me asignan a mi ahora, usasen el mldondkey (u
> otros), y ahora me llegan a mi los paquetes que en teor�a ser�an
> para su conexi�n... aunque la cosa dura siempre, y supongo que si
> tengo el mldondkey apagado, con el paso del tiempo ya no tedr�a m�s.

No, no creo que sea eso.  Si estuvieras recibiendo paquetes del burro,
dirigidos a quien antes estaba en tu IP, ver�as en el log paquetes de
muchas m�quinas dirigidos a una sola direcci�n (la tuya), y resets de
tu m�quina al exterior, porque no est�s escuchando en ese puerto.  Eso
no es lo que est�s viendo.  Me parece que est�s viendo conversaciones
establecidas, en progreso, entre otras m�quinas.

> "wanadoo por RTB" es algo as� como France Telecom por linea
> telefonica basica, un modem 56k, que es lo �nico que tenemos aqu�

Lo cual es a�n m�s extra�o.  Si estuvieras en una conexi�n por cable,
no me extra�ar�a tanto... pero jam�s he visto algo como �sto en una
conexi�n por modem.

> > Si en efecto tienes ese problema, quiz� la raz�n por la que tu
> > pppd no parece caerse a pesar de tu "active-filter" es porque
> > est�s recibiendo los queries de DNS de otras m�quinas.  ...
>
> No, porque eschuco con tcpdump -i ppp0 'port 53 or port 80' y no
> llegan paquetes, para la opci�n demand si funciona el filtro, pero
> para la idle no, lo cual es otro misterio para mi.

Creo que no me supe dar a entender.  Mi teor�a es que el filtro
funciona tanto en demand como en idle.  El problema es que, cuando te
conectas, empiezas a recibir paquetes generados por otras m�quinas,
dirigidos a otras m�quinas, que reinician el contador de inactividad
aunque t� no est�s haciendo nada.  Y por eso pppd no se muere nunca.

Me pregunto si alguien tiene una mejor teor�a que explique qu� caraxo
est� pasando.  La m�a se me hace demasiado dif�cil de tragar.

> > P.D. �Ser�a mucho problema apagar el HTML en tu cliente de correo?
> > El m�o se hace camotes al citar tus mensajes cuando los respondo.
>
> Creo que ya lo he apagado.

No, a�n no :-/

Al menos no en el mensaje que estoy respondiendo.

> Referente al apagado, como suelen decir "es mejor hacerlo tu que
> pedir que te lo hagan", he hecho un programa que si funciona, estoy
> en proceso de optimizado... pero me gustar�a que lo hiciesen los
> programas que vienen con la distribuci�n, por lo de mantener un poco
> de orden en el sistema.

Seg�n yo, pppd podr�a hacerlo, si pudieras poner en el active-filter
algo como "src 123.123.123.123 && dst port 53", donde 123.123.123.123
ser�a la direcci�n local de tu interfaz PPP.  Eso ignorar�a paquetes
generados por otras m�quinas, y s�lo usar�a los tuyos para reiniciar
el conteo de inactividad.

El problema es que tu direcci�n es din�mica.  La asigna el servidor
ppp despu�s de que te conectas, cuando ya es demasiado tarde para
alterar la configuraci�n de pppd.

Le� tu programa, y s�, me parece que funciona.  El inconveniente obvio
es que requiere un archivo en disco, que puede crecer arbitrariamente.
Adicionalmente, requires varios procesos, lo cual consume memoria
innecesariamente.

Respetuosamente me permito incluir en este mensaje una versi�n
alternativa, que en vez de usar un archivo en disco captura ella misma
los paquetes.

La idea es dejar que pppd se levante solo, usando demand, y hacer que
pppd invoque a un script en "/etc/ppp/ip-up.d" para levantar este
programa.  Los scripts invocados por pppd reciben variables de
ambiente con los datos de la conexi�n (mira en /etc/ppp/ip-up).  Un
script para levantar el programa podr�a verse as�:

------------------------------------------------------------------------
#!/bin/sh
# /etc/ppp/ip-up.d/matappp - levanta matappp al establecer conexion

TIMEOUT=360

exec /usr/local/bin/matappp $PPP_IFACE "src $PPP_LOCAL && dst port 53" \
 "/usr/bin/poff $PPP_IFACE" $TIMEOUT
------------------------------------------------------------------------

El exec deber�a evitar tener un shell adicional corriendo durante tu
conexi�n ppp.  El fuente de ese programa "matappp" lo encuentras al
final de este mensaje.  Es un hack r�pido, apenas probado en mi propia
m�quina, de forma que es sano esperar que le salgan sapos.  Necesitas
dar un 'apt-get install libpcap-dev' para compilarlo, con algo como
"gcc -O2 -o matappp matappp.c -lpcap"

Que te sea leve.

 -CR

------------------------------------------------------------------------
/* matappp.c - Un programa que ejecuta a otro cuando detecta un tiempo
 *             de inactividad en el tr�fico de red.
 *
 * Uso: matappp <interfaz> <filtro> <comando> <timeout>
 * Ejemplo: matappp ppp0 "port 53" "/sbin/ifconfig ppp0 down" 60
 * Autor: Cesar Rincon <[EMAIL PROTECTED]>
 * Licencia: Este programa est� en el dominio p�blico.  Haz lo que
 *           quieras con �l.
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/time.h>
#include <sys/types.h>
#include <netinet/ip.h>
#include <pcap.h>

#define SYSLOG_IDENT "matappp"
/* XXX - quitar LOG_PERROR cuando se compile una version para
"produccion".
#define SYSLOG_OPTIONS LOG_PERROR | LOG_PID
#define SYSLOG_FACILITY LOG_USER

int main(int argc, char* argv[])
{
  int e, capfd, segs, r = 0;
  pcap_t* pcap;
  char errbuf[PCAP_ERRBUF_SIZE];
  char* interfaz, * filtro, * comando;
  bpf_u_int32 net, mask;
  struct bpf_program bpfprog;
  struct pcap_pkthdr header;
  fd_set rdfs;
  struct timeval to;

  openlog(SYSLOG_IDENT, SYSLOG_OPTIONS, SYSLOG_FACILITY);

  if(argc != 5) {
    syslog(LOG_ERR, "parametros incorrectos");
    exit(1);
  }

  interfaz = argv[1];
  filtro = argv[2];
  comando = argv[3];
  segs = atoi(argv[4]);
  if(segs < 1)
    segs = 360;

  /* XXX - caplen podria ser menor?  los vamos a tirar a la basura, de
     cualquier forma... */
  pcap = pcap_open_live(interfaz, -1, 1, sizeof(struct iphdr), errbuf);
  if(NULL != pcap) {
    int e = pcap_lookupnet(interfaz, &net, &mask, errbuf);
    if(-1 != e) {
      e = pcap_compile(pcap, &bpfprog, filtro, 1, mask);
      if(-1 != e) {
        e = pcap_setfilter(pcap, &bpfprog);
        if(-1 != e) {
          pcap_freecode(&bpfprog);
          capfd = pcap_fileno(pcap);

          for(;;) {
            FD_ZERO(&rdfs);
            FD_SET(capfd, &rdfs);
            to.tv_sec = segs;
            to.tv_usec = 0;
            e = select(capfd+1, &rdfs, NULL, NULL, &to);
            if(e <= 0) {
              if(e)
                syslog(LOG_ERR, "error, terminando");
              else {
                syslog(LOG_NOTICE, "inactividad detectada, ejecutando
'%s'",
                       comando);
                system(comando);
              }
              break;
            }

            (void)pcap_next(pcap, &header);
          }
        }
        else {
          pcap_freecode(&bpfprog);
          syslog(LOG_ERR, "no puedo activar el filtro '%s' - %s",
                 filtro, pcap_geterr(pcap));
          r = 1;
        }
      }
      else {
        syslog(LOG_ERR, "no puedo compilar el filtro '%s' - %s",
               filtro, pcap_geterr(pcap));
        r = 1;
      }
    }
    else {
      syslog(LOG_ERR, "no puedo obtener informacion de '%s' - %s",
             interfaz, errbuf);
      r = 1;
    }

    pcap_close(pcap);
  }
  else {
    syslog(LOG_ERR, "no puedo capturar paquetes - %s", errbuf);
    r = 1;
  }

  return r;
}
------------------------------------------------------------------------


Responder a