Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Sep 2001 00:32:38 +0200 (CEST)
From:      Dan Lukes <dan@obluda.cz>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/30854: bootpd/bootpgw change - skip ARP modifications by option
Message-ID:  <200109262232.f8QMWcd41938@xkulesh.vol.cz>

next in thread | raw e-mail | index | archive | help

>Number:         30854
>Category:       bin
>Synopsis:       bootpd/bootpgw change - skip ARP modifications by option
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 26 15:40:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Dan Lukes
>Release:        FreeBSD 4.4-STABLE i386
>Organization:
Obludarium
>Environment:
System: FreeBSD 4.4-STABLE #31: Thu Sep 20 23:06:53 CEST 2001 i386

>Description:
	I have pre-set ARP table with permanent records (MAC addresses) 
for all possible directly connected IP address. It complicate IP address 
spoofing a lot. I want retain distribution of IP adresses (and other
options) via BOOTP (central management is easy).

	The bootpd and bootpgw replace already present ARP permanent 
records with temporary ones. I want disable this functionality by option.

	The new [-a] option force bootpd and bootpgw to skip the ARP table
modifications.
	
	(Yes, I know, skilled user can change the MAC address of NIC, so
spoofing is still possible - but it's better than nothing)

>How-To-Repeat:
	N/A
>Fix:

--- libexec/bootpd/bootpd.c.ORIG	Sat Dec 16 23:43:25 2000
+++ libexec/bootpd/bootpd.c	Thu Sep 27 00:01:40 2001
@@ -151,6 +151,7 @@
 	15 * 60L,					/* tv_sec */
 	0							/* tv_usec */
 };
+int noarp = FALSE;				/* skip modifications of ARP table */
 
 /*
  * General
@@ -272,6 +273,9 @@
 			break;
 		switch (argv[0][1]) {
 
+		case 'a':				/* don't modify the ARP table */
+			noarp = TRUE;
+			break;
 		case 'c':				/* chdir_path */
 			if (argv[0][2]) {
 				stmp = &(argv[0][2]);
@@ -588,7 +592,8 @@
 usage()
 {
 	fprintf(stderr,
-			"usage:  bootpd [-d level] [-i] [-s] [-t timeout] [configfile [dumpfile]]\n");
+			"usage:  \nbootpd [-a] [-c path] [-d level] [-i] [-s] [-t timeout] [configfile [dumpfile]]\n");
+	fprintf(stderr, "\t -a\tdon't modify ARP table\n");
 	fprintf(stderr, "\t -c n\tset current directory\n");
 	fprintf(stderr, "\t -d n\tset debug level\n");
 	fprintf(stderr, "\t -i\tforce inetd mode (run as child of inetd)\n");
@@ -1066,10 +1071,12 @@
 		if (haf == 0)
 			haf = HTYPE_ETHERNET;
 
-		if (debug > 1)
-			report(LOG_INFO, "setarp %s - %s",
-				   inet_ntoa(dst), haddrtoa(ha, len));
-		setarp(s, &dst, haf, ha, len);
+		if ( noarp == FALSE ) {
+			if (debug > 1)
+				report(LOG_INFO, "setarp %s - %s",
+					   inet_ntoa(dst), haddrtoa(ha, len));
+			setarp(s, &dst, haf, ha, len);
+		}
 	}
 
 	if ((forward == 0) &&
--- libexec/bootpd/bootpgw/bootpgw.c.ORIG	Sat Dec 16 23:43:25 2000
+++ libexec/bootpd/bootpgw/bootpgw.c	Thu Sep 27 00:01:40 2001
@@ -130,6 +130,7 @@
 u_char maxhops = 4;				/* Number of hops allowed for requests. */
 u_int minwait = 3;				/* Number of seconds client must wait before
 						   its bootrequest packets are forwarded. */
+int noarp = FALSE;				/* skip modifications of ARP table */
 
 /*
  * General
@@ -246,6 +247,9 @@
 			break;
 		switch (argv[0][1]) {
 
+		case 'a':				/* don't modify the ARP table */
+			noarp = TRUE;
+			break;
 		case 'd':				/* debug level */
 			if (argv[0][2]) {
 				stmp = &(argv[0][2]);
@@ -511,7 +515,8 @@
 usage()
 {
 	fprintf(stderr,
-			"usage:  bootpgw [-d level] [-i] [-s] [-t timeout] server\n");
+			"usage:  \nbootpgw [-a] [-d level] [-h count] [-i] [-s] [-t timeout] [-w time] server\n");
+	fprintf(stderr, "\t -a\tdon't modify ARP table\n");
 	fprintf(stderr, "\t -d n\tset debug level\n");
 	fprintf(stderr, "\t -h n\tset max hop count\n");
 	fprintf(stderr, "\t -i\tforce inetd mode (run as child of inetd)\n");
@@ -656,19 +661,21 @@
 	send_addr.sin_addr = bp->bp_yiaddr;
 	send_addr.sin_port = htons(bootpc_port);
 
-	/* Create an ARP cache entry for the client. */
-	ha = bp->bp_chaddr;
-	len = bp->bp_hlen;
-	if (len > MAXHADDRLEN)
-		len = MAXHADDRLEN;
-	haf = (int) bp->bp_htype;
-	if (haf == 0)
-		haf = HTYPE_ETHERNET;
+	if ( noarp == FALSE ) {
+		/* Create an ARP cache entry for the client. */
+		ha = bp->bp_chaddr;
+		len = bp->bp_hlen;
+		if (len > MAXHADDRLEN)
+			len = MAXHADDRLEN;
+		haf = (int) bp->bp_htype;
+		if (haf == 0)
+			haf = HTYPE_ETHERNET;
 
-	if (debug > 1)
-		report(LOG_INFO, "setarp %s - %s",
-			   inet_ntoa(bp->bp_yiaddr), haddrtoa(ha, len));
-	setarp(s, &bp->bp_yiaddr, haf, ha, len);
+		if (debug > 1)
+			report(LOG_INFO, "setarp %s - %s",
+				   inet_ntoa(dst), haddrtoa(ha, len));
+		setarp(s, &dst, haf, ha, len);
+	}
 
 	/* Send reply with same size packet as request used. */
 	if (sendto(s, pktbuf, pktlen, 0,
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200109262232.f8QMWcd41938>