Патч для белого списка сетей в arpwatch (arp patch)
Ключевые слова: 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