Date: Mon, 27 Nov 2000 14:19:25 +0300 From: "Oleg A. Paraschenko" <prof@infosite.ru> To: <cjclark@alum.mit.edu>, "Dominick LaTrappe" <seraf@2600.COM> Cc: <freebsd-security@FreeBSD.ORG> Subject: Re: static ARP tables Message-ID: <007201c05863$e65f8480$0701a8c0@dkn> References: <200011252212.PAA26585@faith.cs.utah.edu> <Pine.NEB.4.21.0011261501020.15375-100000@phalse.2600.com> <20001126123153.D70192@149.211.6.64.reflexcom.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Hello!
> > What I'd really like to see is a 'static' flag that can be added to
> > individual ARP table entries. I have several networks with servers and
> > routers whose MAC/IP/switchport associtions should never change, but
also
> > workstations that change all the time.
> -s hostname ether_addr
> Create an ARP entry for the host called hostname with the Ether-
> net address ether_addr. The Ethernet address is given as six hex
> bytes separated by colons. The entry will be permanent unless
> the word temp is given in the command. ^^^^^^^^^
>
In FreeBSD 2.2.7 term 'permanent' means that kernel will not delete ARP
entry after time of inactivity of workstation. Any host on network can
change IP, and kernel will say 'arp: %s moved from %6D to %6D', even if
IP/MAC is set to 'permanent'.
> >
> > I'm going to try to work on a patch for this, though maybe someone
already
> > knows a hack?
>
I chanhed '/sys/netinet/if_ether.c' in order to disable IP/MAC changes.
---- Old file
...
la = arplookup(isaddr.s_addr, itaddr.s_addr == myaddr.s_addr, 0);
if (la && (rt = la->la_rt) && (sdl = SDL(rt->rt_gateway))) {
if (sdl->sdl_alen &&
bcmp((caddr_t)ea->arp_sha, LLADDR(sdl), sdl->sdl_alen))
log(LOG_INFO, "arp: %s moved from %6D to %6D\n",
inet_ntoa(isaddr), (u_char *)LLADDR(sdl), ":",
ea->arp_sha, ":");
(void)memcpy(LLADDR(sdl), ea->arp_sha, sizeof(ea->arp_sha));
sdl->sdl_alen = sizeof(ea->arp_sha);
...
----- New file
...
if (la && (rt = la->la_rt) && (sdl = SDL(rt->rt_gateway))) {
#ifndef DONT_MOVE_ARP
if (sdl->sdl_alen &&
bcmp((caddr_t)ea->arp_sha, LLADDR(sdl), sdl->sdl_alen))
log(LOG_INFO, "arp: %s moved from %6D to %6D\n",
inet_ntoa(isaddr), (u_char *)LLADDR(sdl), ":",
ea->arp_sha, ":");
(void)memcpy(LLADDR(sdl), ea->arp_sha, sizeof(ea->arp_sha));
#else // DONT_MOVE_ARP
if (sdl->sdl_alen &&
bcmp((caddr_t)ea->arp_sha, LLADDR(sdl), sdl->sdl_alen))
{
log(LOG_INFO, "arp: %s will not be moved from %6D to %6D\n",
inet_ntoa(isaddr), (u_char *)LLADDR(sdl), ":",
ea->arp_sha, ":");
} else {
(void)memcpy(LLADDR(sdl), ea->arp_sha, sizeof(ea->arp_sha));
}
#endif // DONT_MOVE_ARP
sdl->sdl_alen = sizeof(ea->arp_sha);
...
--------
Probably it is not what you want, but you can start with it.
Bye!
----
Oleg
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-security" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?007201c05863$e65f8480$0701a8c0>
