Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Mar 2000 21:00:02 -0800 (PST)
From:      Louis Mamakos <louie@TransSys.COM>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/17606  bad IPSEC and traceroute interaction, with fix!
Message-ID:  <200003280500.VAA34714@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/17606; it has been noted by GNATS.

From: Louis Mamakos <louie@TransSys.COM>
To: FreeBSD-gnats-submit@freebsd.org
Cc:  
Subject: Re: bin/17606  bad IPSEC and traceroute interaction, with fix!
Date: Mon, 27 Mar 2000 23:52:10 -0500 (EST)

 >Submitter-Id:   current-users
 >Originator:     Louis Mamakos
 >Organization:   
 >Confidential:   no
 >Synopsis:       traceroute and kernel-IPSEC policy can interact badly
 >Severity:       non-critical
 >Priority:       medium
 >Category:       bin
 >Release:        FreeBSD 5.0-CURRENT i386
 >Class:          sw-bug
 >Environment: 
 
 FreeBSD 5.0-current, as of 25 March or so.  Kernel configured with
 IPSEC.
 
 >Description: 
 
 When the default kernel IPSEC policy (as configured with setkey(8)) 
 includes all the traffic to a particular host, then attempting a
 traceroute to that host fails.  The packets being sent are encrypted,
 and thus the ICMP time exceeded message cannot be returned.
 
 This is a follow-up to PR bin/17606
 
 >How-To-Repeat: 
 
 As described.
 
 >Fix: 
 
 Steal the same sort of fix done in traceroute6, and apply to the IPv4
 "standard" traceroute in FreeBSD.  Patch could be as attached.  
 Surprisingly, the ipsec.h file is in sys/netinet6 rather than sys/netinet.
 
 
 Index: contrib/traceroute/traceroute.c
 ===================================================================
 RCS file: /usr/local/FreeBSD/cvs/src/contrib/traceroute/traceroute.c,v
 retrieving revision 1.11
 diff -u -r1.11 traceroute.c
 --- contrib/traceroute/traceroute.c	1999/06/25 21:48:40	1.11
 +++ contrib/traceroute/traceroute.c	2000/03/28 04:38:10
 @@ -24,7 +24,7 @@
      "@(#) Copyright (c) 1988, 1989, 1991, 1994, 1995, 1996\n\
  The Regents of the University of California.  All rights reserved.\n";
  static const char rcsid[] =
 -    "@(#)$Header: /home/ncvs/src/contrib/traceroute/traceroute.c,v 1.10 1999/05/12 17:28:31 archie Exp $ (LBL)";
 +    "@(#)$Header: /usr/local/FreeBSD/cvs/src/contrib/traceroute/traceroute.c,v 1.11 1999/06/25 21:48:40 archie Exp $ (LBL)";
  #endif
  
  /*
 @@ -217,6 +217,11 @@
  
  #include <arpa/inet.h>
  
 +#ifdef	IPSEC
 +#include <net/route.h>
 +#include <netinet6/ipsec.h>	/* XXX */
 +#endif	/* IPSEC */
 +
  #include <ctype.h>
  #include <errno.h>
  #ifdef HAVE_MALLOC_H
 @@ -322,6 +327,9 @@
  char	*getaddr(u_int32_t *, char *);
  char	*getsin(struct sockaddr_in *, char *);
  char	*savestr(const char *);
 +#ifdef	IPSEC
 +int	setpolicy __P((int so, char *policy));
 +#endif
  void	send_probe(int, int);
  void	tvsub(struct timeval *, struct timeval *);
  __dead	void usage(void);
 @@ -718,6 +726,14 @@
  #endif
  	}
  
 +#if	defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
 +	if (setpolicy(sndsock, "in bypass") < 0) 
 +		errx(1, ipsec_strerror());
 +
 +	if (setpolicy(sndsock, "out bypass") < 0) 
 +		errx(1, ipsec_strerror());
 +#endif	/* defined(IPSEC) && defined(IPSEC_POLICY_IPSEC) */
 +
  	Fprintf(stderr, "%s to %s (%s)",
  	    prog, hostname, inet_ntoa(to->sin_addr));
  	if (source)
 @@ -884,6 +900,28 @@
  
  	return(cc);
  }
 +
 +#if	defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
 +int
 +setpolicy(so, policy)
 +	int so;
 +	char *policy;
 +{
 +	char *buf;
 +
 +	buf = ipsec_set_policy(policy, strlen(policy));
 +	if (buf == NULL) {
 +		warnx(ipsec_strerror());
 +		return -1;
 +	}
 +	(void)setsockopt(so, IPPROTO_IP, IP_IPSEC_POLICY,
 +		buf, ipsec_get_policylen(buf));
 +
 +	free(buf);
 +
 +	return 0;
 +}
 +#endif
  
  void
  send_probe(int seq, int ttl)
 Index: usr.sbin/traceroute/Makefile
 ===================================================================
 RCS file: /usr/local/FreeBSD/cvs/src/usr.sbin/traceroute/Makefile,v
 retrieving revision 1.11
 diff -u -r1.11 Makefile
 --- usr.sbin/traceroute/Makefile	1999/08/28 01:20:22	1.11
 +++ usr.sbin/traceroute/Makefile	2000/03/28 04:33:17
 @@ -4,7 +4,7 @@
  MAN8=	traceroute.8
  BINMODE=4555
  CFLAGS+=-DHAVE_SYS_SELECT_H=1 -DHAVE_SETLINEBUF=1 -DHAVE_RAW_OPTIONS=1 \
 -	-DSTDC_HEADERS=1 
 +	-DSTDC_HEADERS=1 -DIPSEC
  # RTT Jitter on the internet these days means printing 3 decimal places on
  # > 1000ms times is plain useless.  Uncomment this to enable variable precision
  # reporting, ie: print a variable precision from 0.001ms through 1000ms
 @@ -12,6 +12,8 @@
  
  SRCS=	version.c traceroute.c
  CLEANFILES+=	version.c
 +DPADD=	${LIBIPSEC}
 +LDADD=	-lipsec
  
  TRACEROUTE_DISTDIR?= ${.CURDIR}/../../contrib/traceroute
  
 
 
 


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?200003280500.VAA34714>