The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Патч для белого списка сетей в arpwatch (arp patch)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: arp, patch,  (найти похожие документы)
Date: Tue, 12 Oct 2004 13:46:28 +0600 From: Eugene Grosbein <Eugene_Grosbein@f1.n5006.z2.fidonet.org.> Newsgroups: ftn.ru.unix.bsd Subject: Патч для белого списка сетей в 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

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру