traceroute6でAS PATHを表示する(FreeBSD 7.2)

最近のFreeBSD(7.1以降の-STABLE)では、traceroute コマンドに-a を引数につけることにより、AS PATHを表示する機能が付いているが、何故かtraceroute6 コマンドにはその機能がない。以前、traceroute及びtraceroute6 でAS PATHを表示するパッチを作ったけど、せっかくなんで、/usr/src/contrib/traceroute/as.{c,h} ベースにtraceroute6コマンドを実行するパッチを作ってみた。

さて、AS PATHを表示するにあたって、最新のトピックといえば、4byte ASをASPLAIN表記にて記載することがRFC5396にて決定されている。ここで改めて、as.c を見てみると、このソース、AS番号を「int」で定義しているじゃないか。ポインタが見っけられなかったので、IRS 18の吉田さんの資料にリンクを張ってみるが、ここには、4byte ASは「This is just an unsigned 32 bit integer」と書かれている。なので、ついでにそこも修正。まぁ、そんなことでバグが発見されるのは当分先のような気もするが。
あと、whois.radb.net に掲載されていないASの場合、「[AS0]」と表記されちゃうので、そこは以前と同じように「[?]」で表示するように修正。

cp -p /usr/src/contrib/usr.sbin/traceroute/as.* /usr/src/usr.sbin/traceroute6
を実行して、以下のようなパッチを当てて、make & make installすればオッケー。
無保証ですのでよろしく。

diff -aurN traceroute6.original/Makefile traceroute6/Makefile
--- traceroute6.original/Makefile 2007-07-05 17:56:46.000000000 +0900
+++ traceroute6/Makefile 2009-04-18 22:18:03.000000000 +0900
@@ -15,6 +15,7 @@

PROG= traceroute6
MAN= traceroute6.8
+SRCS= as.c traceroute6.c
BINOWN= root
BINMODE= 4555

diff -aurN traceroute6.original/as.c traceroute6/as.c
--- traceroute6.original/as.c 2008-11-14 00:27:48.000000000 +0900
+++ traceroute6/as.c 2009-04-19 15:01:45.000000000 +0900
@@ -137,23 +137,25 @@
return (asn);
}

-int
+unsigned int
as_lookup(_asn, addr)
void *_asn;
- struct in_addr *addr;
+ char *addr;
{
struct aslookup *asn = _asn;
char buf[1024];
- int as, rc, dlen;
+ unsigned int as;
+ int rc, dlen;

- as = rc = dlen = 0;
- (void)fprintf(asn->as_f, "!r%s/32,l\n", inet_ntoa(*addr));
+ as = 0;
+ rc = dlen = 0;
+ (void)fprintf(asn->as_f, "!r%s/128,l\n", 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)fprintf(asn->as_debug, ">> !r%s/128,l\n",
+ addr);
(void)fflush(asn->as_debug);
}
#endif /* AS_DEBUG_FILE */
@@ -209,7 +211,7 @@

/* origin line is the interesting bit */
if (as == 0 && strncasecmp(buf, "origin:", 7) == 0) {
- sscanf(buf + 7, " AS%d", &as);
+ sscanf(buf + 7, " AS%u", &as);
#ifdef AS_DEBUG_FILE
if (asn->as_debug) {
(void)fprintf(asn->as_debug, "as: %d\n", as);
diff -aurN traceroute6.original/as.h traceroute6/as.h
--- traceroute6.original/as.h 2008-11-14 00:27:48.000000000 +0900
+++ traceroute6/as.h 2009-04-19 15:03:31.000000000 +0900
@@ -38,5 +38,5 @@
*/

void *as_setup __P((char *));
-int as_lookup __P((void *, struct in_addr *));
+unsigned int as_lookup __P((void *, char *));
void as_shutdown __P((void *));
diff -aurN traceroute6.original/traceroute6.c traceroute6/traceroute6.c
--- traceroute6.original/traceroute6.c 2008-05-20 19:46:50.000000000 +0900
+++ traceroute6/traceroute6.c 2009-04-19 15:02:42.000000000 +0900
@@ -282,6 +282,8 @@
#include
#endif

+#include "as.h"
+
#define DUMMY_PORT 10010

#define MAXPACKET 65535 /* max ip packet size */
@@ -309,6 +311,10 @@
u_char packet[512]; /* last inbound (icmp) packet */
struct opacket *outpacket; /* last output (udp) packet */

+int as_path; /* print as numbers for each hop */
+char *as_server = NULL;
+void *asn;
+
int main(int, char *[]);
int wait_for_reply(int, struct msghdr *);
#ifdef IPSEC
@@ -411,8 +417,15 @@

seq = 0;

- while ((ch = getopt(argc, argv, "df:g:Ilm:nNp:q:rs:Uvw:")) != -1)
+ while ((ch = getopt(argc, argv, "aA:df:g:Ilm:nNp:q:rs:Uvw:")) != -1)
switch (ch) {
+ case 'a':
+ as_path = 1;
+ break;
+ case 'A':
+ as_path = 1;
+ as_server = optarg;
+ break;
case 'd':
options |= SO_DEBUG;
break;
@@ -856,6 +869,17 @@
exit(1);
}

+ if (as_path) {
+ asn = as_setup(as_server);
+ if (asn == NULL) {
+ fprintf(stderr, "traceroute6: as_setup failed, AS# lookups"
+ " disabled\n");
+ (void)fflush(stderr);
+ as_path = 0;
+ }
+ }
+
+
{
socklen_t len;

@@ -948,7 +972,8 @@
exit(0);
}
}
-
+ if (as_path)
+ as_shutdown(asn);
exit(0);
}

@@ -1357,10 +1382,21 @@
{
struct sockaddr_in6 *from = (struct sockaddr_in6 *)mhdr->msg_name;
char hbuf[NI_MAXHOST];
+ unsigned int as_num;

if (getnameinfo((struct sockaddr *)from, from->sin6_len,
hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST) != 0)
strlcpy(hbuf, "invalid", sizeof(hbuf));
+
+ if (as_path) {
+ as_num = as_lookup(asn, (char *)hbuf);
+ if(as_num != 0) {
+ printf(" [AS%u]", as_num);
+ } else {
+ printf(" [?]");
+ }
+ }
+
if (nflag)
printf(" %s", hbuf);
else if (lflag)

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント