Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Eugene Grosbein                      2:5006/1       12 Oct 2004  14:46:28
 To : Vladimir Kurtukov
 Subject : Re: freebsd bridge && arpwatch
 -------------------------------------------------------------------------------- 
 
 12 окт 2004, вторник, в 14:18 KRAST, Vladimir Kurtukov написал(а):
 
  VK> есть бридж на 5-ке, BETA6 вроде. две сетевухи.
  VK> на одной из них ip адрес. есть arpwatch на другой машине,
  VK> который с периодом в минут 10 говорит, что ip сменил
  VK> мак с мака первой сетевухи на мак второй и наоборот.
  VK> почему и как ликвидировать?
 
 Почему - не знаю, знаю как замести проблему под ковер.
 
 Патч для arpwatch-2.1-a11 добавляет ключ -x, подобный ключу -n.
 Указанные через -x сети не анализируются и отчеты по ним
 не шлются по e-mail и не отмечаются в syslod.
 
 - --- arpwatch.c.orig  Thu Dec 19 16:46:32 2002
 +++ arpwatch.c Thu Dec 19 17:30:32 2002
 @@ -121,19 +121,22 @@
    u_int32_t netmask;
  };
  
 -static struct nets *nets;
 -static int nets_ind;
 -static int nets_size;
 +static struct nets *nets, *skipnets;
 +static int nets_ind=0,skipnets_ind=0;
 +static int nets_size,skipnets_size;
  
  extern int optind;
  extern int opterr;
  extern char *optarg;
  
 +#define  ADD  0
 +#define SKIP  1
  /* Forwards */
 -int  addnet(const char *);
 +int  addnet(int action, const char *);
  RETSIGTYPE checkpoint(int);
  RETSIGTYPE die(int);
  int  isbogon(u_int32_t);
 +int  toskip(u_int32_t);
  int  main(int, char **);
  void  process_ether(u_char *, const struct pcap_pkthdr *, const u_char *);
  void  process_fddi(u_char *, const struct pcap_pkthdr *, const u_char *);
 @@ -172,7 +175,7 @@
    interface = NULL;
    rfilename = NULL;
    pd = NULL;
 -  while ((op = getopt(argc, argv, "df:i:m:n:Nr:")) != EOF)
 +  while ((op = getopt(argc, argv, "df:i:m:n:Nr:x:")) != EOF)
       switch (op) {
  
       case 'd':
 @@ -192,7 +195,7 @@
        break;
  
       case 'n':
 -      if (!addnet(optarg))
 +      if (!addnet(ADD,optarg))
           usage();
        break;
  
 @@ -208,6 +211,11 @@
        Watcher = optarg;
        break;
  
 +     case 'x':
 +      if (!addnet(SKIP,optarg))
 +         usage();
 +      break;
 +
       default:
        usage();
       }
 @@ -384,6 +392,10 @@
    /* Source ip address */
    BCOPY(SPA(ea), &sia, 4);
  
 +  /* Skip excluded nets */
 +  if (toskip(sia))
 +     return;
 +
    /* Watch for bogons */
    if (isbogon(sia)) {
       dosyslog(LOG_INFO, "bogon", sia, sea, sha);
 @@ -533,6 +545,9 @@
    /* Source ARP ip address */
    BCOPY(SPA(ea), &sia, 4);
  
 +  if (toskip(sia))
 +     return;
 +
    /* Watch for bogons */
    if (isbogon(sia)) {
       dosyslog(LOG_INFO, "bogon", sia, sea, sha);
 @@ -640,32 +655,44 @@
  }
  
  int
 -addnet(register const char *str)
 +addnet(int action, register const char *str)
  {
    register char *cp;
    register int width;
    register u_int32_t n, m;
 -  register struct nets *np;
 +  register struct nets *np, *ns;
    char *cp2;
    char tstr[64];
 +  int size, ind;
  
    if (strlen(str) > sizeof(tstr) - 1)
       return(0);
  
 -  if (nets_size <= 0) {
 -     nets_size = 8;
 -     nets = malloc(nets_size * sizeof(*nets));
 -  } else if (nets_size <= nets_ind) {
 +  if (action == ADD) { 
 +     size = nets_size;
 +     ind = nets_ind;
 +     ns = nets;
 +  }
 +  else {
 +     size = skipnets_size;
 +     ind = skipnets_ind;
 +     ns = skipnets;
 +  }
 +
 +  if (size <= 0) {
 +     size = 8;
 +     ns = malloc(size * sizeof(*ns));
 +  } else if (size <= ind) {
       /* XXX debugging */
 -     nets_size <<= 1;
 -     nets = realloc(nets, nets_size * sizeof(*nets));
 +     size <<= 1;
 +     ns = realloc(ns, size * sizeof(*ns));
    }
 -  if (nets == NULL) {
 +  if (ns == NULL) {
       (void)fprintf(stderr, "%s: addnet: malloc/realloc: %s\n",
           prog, strerror(errno));
       exit(1);
    }
 -  np = nets + nets_ind;
 +  np = ns + ind;
  
    width = 0;
    strcpy(tstr, str);
 @@ -706,7 +733,18 @@
  
    np->net = n;
    np->netmask = m;
 -  ++nets_ind;
 +  ++ind;
 +
 +  if (action == ADD) { 
 +     nets_size = size;
 +     nets_ind = ind;
 +     nets = ns;
 +  }
 +  else {
 +     skipnets_size = size;
 +     skipnets_ind = ind;
 +     skipnets = ns;
 +  }
  
    return (1);
  }
 @@ -725,6 +763,18 @@
       if ((sia & np->netmask) == np->net)
        return (0);
    return (1);
 +}
 +
 +int
 +toskip(register u_int32_t sia)
 +{
 +  register int i;
 +  register struct nets *np;
 +
 +  for (i = 0, np = skipnets; i < skipnets_ind; ++i, ++np)
 +     if ((sia & np->netmask) == np->net)
 +      return (1);
 +  return (0);
  }
  
  RETSIGTYPE
 
 Eugene
 -- 
 "Люди забыли эту истину," - сказал Лис, - "но ты не забывай"
 --- slrn/0.9.8.0 (FreeBSD)
  * Origin: Svyaz Service JSC (2:5006/1@fidonet)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 freebsd bridge && arpwatch   Vladimir Kurtukov   12 Oct 2004 13:18:27 
 Re: freebsd bridge && arpwatch   Eugene Grosbein   12 Oct 2004 14:46:28 
 freebsd bridge && arpwatch   Vladimir Kurtukov   14 Oct 2004 13:18:39 
 Re: freebsd bridge && arpwatch   Eugene Grosbein   14 Oct 2004 14:26:33 
 Re: freebsd bridge && arpwatch   Max Yuzhakov   12 Oct 2004 23:11:02 
 freebsd bridge && arpwatch   Vladimir Kurtukov   14 Oct 2004 12:09:50 
Архивное /ru.unix.bsd/2609346444473.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional