From owner-freebsd-net@FreeBSD.ORG Sun Feb 17 21:57:09 2008 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4AD2316A417 for ; Sun, 17 Feb 2008 21:57:09 +0000 (UTC) (envelope-from rpaulo@gmail.com) Received: from fk-out-0910.google.com (fk-out-0910.google.com [209.85.128.185]) by mx1.freebsd.org (Postfix) with ESMTP id 6DF9313C45E for ; Sun, 17 Feb 2008 21:57:08 +0000 (UTC) (envelope-from rpaulo@gmail.com) Received: by fk-out-0910.google.com with SMTP id b27so1693852fka.11 for ; Sun, 17 Feb 2008 13:57:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:from:to:content-type:mime-version:subject:date:x-mailer:sender; bh=Aal+4PSfUWfn2MK1g2QSnlwNtI6rfFD22SmqvYR1GTs=; b=ictCHV8UURoYwSdn2sm1Bvryu2Wfg3Fxxa06FzzHIr+ASNi3VZcLlgs/BWkhXk3aVI8TRnV4P7txBLUgOvOqDE0iafE/mSJd92B/EMHNgGbxPuRO4F31naBkLhF0xBK8K02OLI0adoHmgU9c9zX8sJur9gO31Bh4SzPU0aUaMRQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:from:to:content-type:mime-version:subject:date:x-mailer:sender; b=d0b6hTvx6tBGMReKhBjKVYzaLZEOlLkKvouourq+esTw6pzKECG038yf0jC7FXFVUWI7iFDF2Wu0DSEaFX1TJWSUCBL0nAtmQMZ+3L1rrFHYIvbZSgV2DYU4H+qlOBj0joFKeBITwr1Zf9fsMig9ZE/xsEpyi5jhzzvAVEx12e4= Received: by 10.82.121.15 with SMTP id t15mr10313007buc.1.1203283854363; Sun, 17 Feb 2008 13:30:54 -0800 (PST) Received: from ?89.214.236.125? ( [89.214.236.125]) by mx.google.com with ESMTPS id j8sm6706609gvb.7.2008.02.17.13.30.47 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 17 Feb 2008 13:30:52 -0800 (PST) Message-Id: <5C5B3E4E-AE10-449C-925C-C9AB681FB6C3@FreeBSD.org> From: Rui Paulo To: freebsd-net@freebsd.org Content-Type: multipart/mixed; boundary=Apple-Mail-3--509138870 Mime-Version: 1.0 (Apple Message framework v919.2) Date: Sun, 17 Feb 2008 21:30:44 +0000 X-Mailer: Apple Mail (2.919.2) Sender: Rui Paulo Subject: traceroute AS path patch X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Feb 2008 21:57:09 -0000 --Apple-Mail-3--509138870 Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Hi, The attached patch ports a traceroute functionality from FreeBSD called AS path. The concept is simple. On each hop we query a whois server to find the corresponding hop AS number. I think it doesn't hurt if we have this functionality. An example output: traceroute to freebsd.org (69.147.83.40), 64 hops max, 72 byte packets ... 7 [AS6453] if-2-1.core1.PV9-Lisbon.teleglobe.net (195.219.187.21) 35.105 ms 34.008 ms 35.334 ms 8 [AS6453] 195.219.144.5 (195.219.144.5) 63.880 ms 60.448 ms 60.809 ms 9 [AS6453] 195.219.144.10 (195.219.144.10) 138.593 ms 193.709 ms 173.415 ms 10 [AS7199] if-2-0.core1.NJY-Newark.teleglobe.net (216.6.63.10) 133.912 ms 134.393 ms 144.071 ms 11 [AS9557] if-3-1.mcore3.NJY-Newark.teleglobe.net (216.6.57.1) 135.600 ms 144.979 ms 168.247 ms 12 [AS9557] if-12-0-0-741.core4.AEQ-Ashburn.teleglobe.net (216.6.57.70) 180.346 ms 138.718 ms 138.927 ms 13 [AS6453] 64.86.85.38 (64.86.85.38) 142.745 ms 143.163 ms 143.358 ms 14 [AS26085] so-0-0-0.pat2.pao.yahoo.com (216.115.101.130) 252.417 ms 213.377 ms 212.859 ms 15 [AS26085] ge-0-1-0-p301.pat1.sjc.yahoo.com (216.115.106.147) 214.709 ms 213.198 ms 235.253 ms 16 [AS26085] g-1-0-0-p160.msr1.sp1.yahoo.com (216.115.107.61) 219.091 ms [AS26085] g-0-0-0-p170.msr2.sp1.yahoo.com (216.115.107.81) 217.650 ms [AS26085] g-1-0-0-p160.msr1.sp1.yahoo.com (216.115.107.61) 286.376 ms 17 [AS36752] ge-1-45.bas-b2.sp1.yahoo.com (209.131.32.49) 213.747 ms [AS36752] ge-1-41.bas-b2.sp1.yahoo.com (209.131.32.33) 274.140 ms [AS36752] ge-1-45.bas-b2.sp1.yahoo.com (209.131.32.49) 213.341 ms 18 [AS36752] freebsd.org (69.147.83.40) 214.386 ms 223.515 ms 212.548 ms What do you think? Regards. -- Rui Paulo --Apple-Mail-3--509138870 Content-Disposition: attachment; filename=traceroute.diff Content-Type: application/octet-stream; x-unix-mode=0644; name="traceroute.diff" Content-Transfer-Encoding: 7bit Index: contrib/traceroute/as.c =================================================================== RCS file: contrib/traceroute/as.c diff -N contrib/traceroute/as.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ contrib/traceroute/as.c 16 Feb 2008 16:29:26 -0000 @@ -0,0 +1,242 @@ +/* $FreeBSD$ */ +/* $NetBSD: as.c,v 1.1 2001/11/04 23:14:36 atatat Exp $ */ + +/* + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Andrew Brown. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "as.h" + +#define DEFAULT_AS_SERVER "whois.radb.net" +#undef AS_DEBUG_FILE + +struct aslookup { + FILE *as_f; +#ifdef AS_DEBUG_FILE + FILE *as_debug; +#endif /* AS_DEBUG_FILE */ +}; + +void * +as_setup(server) + char *server; +{ + struct aslookup *asn; + struct hostent *he = NULL; + struct servent *se; + struct sockaddr_in in; + FILE *f; + int s; + + if (server == NULL) + server = DEFAULT_AS_SERVER; + + (void)memset(&in, 0, sizeof(in)); + in.sin_family = AF_INET; + in.sin_len = sizeof(in); + if ((se = getservbyname("whois", "tcp")) == NULL) { + warnx("warning: whois/tcp service not found"); + in.sin_port = ntohs(43); + } else + in.sin_port = se->s_port; + + if (inet_aton(server, &in.sin_addr) == 0 && + ((he = gethostbyname(server)) == NULL || + he->h_addr == NULL)) { + warnx("%s: %s", server, hstrerror(h_errno)); + return (NULL); + } + + if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) { + warn("socket"); + return (NULL); + } + + do { + if (he != NULL) { + memcpy(&in.sin_addr, he->h_addr, he->h_length); + he->h_addr_list++; + } + if (connect(s, (struct sockaddr *)&in, sizeof(in)) == 0) + break; + if (he == NULL || he->h_addr == NULL) { + close(s); + s = -1; + break; + } + } while (1); + + if (s == -1) { + warn("connect"); + return (NULL); + } + + f = fdopen(s, "r+"); + (void)fprintf(f, "!!\n"); + (void)fflush(f); + + asn = malloc(sizeof(struct aslookup)); + if (asn == NULL) + (void)fclose(f); + else + asn->as_f = f; + +#ifdef AS_DEBUG_FILE + asn->as_debug = fopen(AS_DEBUG_FILE, "w"); + if (asn->as_debug) { + (void)fprintf(asn->as_debug, ">> !!\n"); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + + return (asn); +} + +int +as_lookup(_asn, addr) + void *_asn; + struct in_addr *addr; +{ + struct aslookup *asn = _asn; + char buf[1024]; + int as, rc, dlen; + + as = rc = dlen = 0; + (void)fprintf(asn->as_f, "!r%s/32,l\n", inet_ntoa(*addr)); + (void)fflush(asn->as_f); + +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, ">> !r%s/32,l\n", + inet_ntoa(*addr)); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + + while (fgets(buf, sizeof(buf), asn->as_f) != NULL) { + buf[sizeof(buf) - 1] = '\0'; + +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, "<< %s", buf); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + + if (rc == 0) { + rc = buf[0]; + switch (rc) { + case 'A': + /* A - followed by # bytes of answer */ + sscanf(buf, "A%d\n", &dlen); +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, + "dlen: %d\n", dlen); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + break; + case 'C': + case 'D': + case 'E': + case 'F': + /* C - no data returned */ + /* D - key not found */ + /* E - multiple copies of key */ + /* F - some other error */ + break; + } + if (rc == 'A') + /* skip to next input line */ + continue; + } + + if (dlen == 0) + /* out of data, next char read is end code */ + rc = buf[0]; + if (rc != 'A') + /* either an error off the bat, or a done code */ + break; + + /* data received, thank you */ + dlen -= strlen(buf); + + /* origin line is the interesting bit */ + if (as == 0 && strncasecmp(buf, "origin:", 7) == 0) { + sscanf(buf + 7, " AS%d", &as); +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, "as: %d\n", as); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + } + } + + return (as); +} + +void +as_shutdown(_asn) + void *_asn; +{ + struct aslookup *asn = _asn; + + (void)fprintf(asn->as_f, "!q\n"); + (void)fclose(asn->as_f); + +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, ">> !q\n"); + (void)fclose(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + + free(asn); +} Index: contrib/traceroute/as.h =================================================================== RCS file: contrib/traceroute/as.h diff -N contrib/traceroute/as.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ contrib/traceroute/as.h 16 Feb 2008 16:29:17 -0000 @@ -0,0 +1,42 @@ +/* $FreeBSD$ */ +/* $NetBSD: as.h,v 1.1 2001/11/04 23:14:36 atatat Exp $ */ + +/* + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Andrew Brown. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +void *as_setup __P((char *)); +int as_lookup __P((void *, struct in_addr *)); +void as_shutdown __P((void *)); Index: contrib/traceroute/traceroute.8 =================================================================== RCS file: /home/ncvs/src/contrib/traceroute/traceroute.8,v retrieving revision 1.16 diff -u -p -r1.16 traceroute.8 --- contrib/traceroute/traceroute.8 15 Oct 2006 17:44:49 -0000 1.16 +++ contrib/traceroute/traceroute.8 16 Feb 2008 16:27:09 -0000 @@ -16,7 +16,7 @@ .\" $Id: traceroute.8,v 1.19 2000/09/21 08:44:19 leres Exp $ .\" $FreeBSD: src/contrib/traceroute/traceroute.8,v 1.16 2006/10/15 17:44:49 dwmalone Exp $ .\" -.TH TRACEROUTE 8 "21 September 2000" +.TH TRACEROUTE 8 "17 February 2009" .UC 6 .SH NAME traceroute \- print the route packets take to network host @@ -24,7 +24,7 @@ traceroute \- print the route packets ta .na .B traceroute [ -.B \-dDeFISnrvx +.B \-adDeFISnrvx ] [ .B \-f .I first_ttl @@ -71,6 +71,9 @@ traceroute \- print the route packets ta .B \-w .I waittime ] [ +.B \-A +.I as_server +] [ .B \-z .I pausemsecs ] @@ -98,6 +101,13 @@ name. .PP Other options are: .TP +.B \-a +Turn on AS# lookups for each hop encountered. +.TP +.B -A +Turn on AS# lookups and use the given server instead of the +default. +.TP .B \-e Firewall evasion mode. Use fixed destination ports for UDP and TCP probes. Index: contrib/traceroute/traceroute.c =================================================================== RCS file: /home/ncvs/src/contrib/traceroute/traceroute.c,v retrieving revision 1.34 diff -u -p -r1.34 traceroute.c --- contrib/traceroute/traceroute.c 1 Jul 2007 12:08:05 -0000 1.34 +++ contrib/traceroute/traceroute.c 12 Feb 2008 00:51:03 -0000 @@ -263,6 +263,7 @@ static const char rcsid[] = #include "findsaddr.h" #include "ifaddrlist.h" +#include "as.h" #include "traceroute.h" /* Maximum number of gateways (include room for one noop) */ @@ -350,6 +351,9 @@ int options; /* socket options */ int verbose; int waittime = 5; /* time to wait for response (in seconds) */ int nflag; /* print addresses numerically */ +int as_path; /* print as numbers for each hop */ +char *as_server = NULL; +void *asn; #ifdef CANT_HACK_IPCKSUM int doipcksum = 0; /* don't calculate ip checksums by default */ #else @@ -535,9 +539,17 @@ main(int argc, char **argv) prog = argv[0]; opterr = 0; - while ((op = getopt(argc, argv, "edDFInrSvxf:g:i:M:m:P:p:q:s:t:w:z:")) != EOF) + while ((op = getopt(argc, argv, "aA:edDFInrSvxf:g:i:M:m:P:p:q:s:t:w:z:")) != EOF) switch (op) { - + case 'a': + as_path = 1; + break; + + case 'A': + as_path = 1; + as_server = optarg; + break; + case 'd': options |= SO_DEBUG; break; @@ -913,6 +925,16 @@ main(int argc, char **argv) exit (1); } + if (as_path) { + asn = as_setup(as_server); + if (asn == NULL) { + Fprintf(stderr, "%s: as_setup failed, AS# lookups" + " disabled\n", prog); + (void)fflush(stderr); + as_path = 0; + } + } + #if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC) if (setpolicy(sndsock, "in bypass") < 0) errx(1, "%s", ipsec_strerror()); @@ -1118,6 +1140,8 @@ main(int argc, char **argv) (unreachable > 0 && unreachable >= nprobes - 1)) break; } + if (as_path) + as_shutdown(asn); exit(0); } @@ -1458,6 +1482,9 @@ print(register u_char *buf, register int hlen = ip->ip_hl << 2; cc -= hlen; + if (as_path) + Printf(" [AS%d]", as_lookup(asn, &from->sin_addr)); + if (nflag) Printf(" %s", inet_ntoa(from->sin_addr)); else @@ -1764,8 +1791,8 @@ usage(void) Fprintf(stderr, "Version %s\n", version); Fprintf(stderr, - "Usage: %s [-dDeFInrSvx] [-f first_ttl] [-g gateway] [-i iface]\n" + "Usage: %s [-adDeFInrSvx] [-f first_ttl] [-g gateway] [-i iface]\n" "\t[-m max_ttl] [-p port] [-P proto] [-q nqueries] [-s src_addr]\n" - "\t[-t tos] [-w waittime] [-z pausemsecs] host [packetlen]\n", prog); + "\t[-t tos] [-w waittime] [-A as_server] [-z pausemsecs] host [packetlen]\n", prog); exit(1); } Index: usr.sbin/traceroute/Makefile =================================================================== RCS file: /home/ncvs/src/usr.sbin/traceroute/Makefile,v retrieving revision 1.22 diff -u -p -r1.22 Makefile --- usr.sbin/traceroute/Makefile 22 Aug 2006 07:51:10 -0000 1.22 +++ usr.sbin/traceroute/Makefile 12 Feb 2008 00:47:42 -0000 @@ -5,7 +5,7 @@ TRACEROUTE_DISTDIR?= ${.CURDIR}/../../co PROG= traceroute MAN= traceroute.8 -SRCS= version.c traceroute.c ifaddrlist.c findsaddr-socket.c +SRCS= as.c version.c traceroute.c ifaddrlist.c findsaddr-socket.c BINOWN= root BINMODE=4555 CLEANFILES= version.c --Apple-Mail-3--509138870 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit --Apple-Mail-3--509138870--