tracerouteの実装による問題

Vine Linux でtracerouteを実行すると何故か「send failed: Operation not permitted」というエラーがでてうまくいかない・・・orz
原因は、FW(iptables)でUDPのポートが空いていないから


tracerouteと言えばICMPのパケットを投げつける物とばかり理解していたのだがLinuxの実装ではUDPで投げるらしい。
Linuxのtracerouteでは送信元ポートは64000から送信先ポートは33434から+1ずつ増やしながらパケットを投げつけるらしい。
・・・さて、FWに大量に穴開けるのもおもしろくないしどうしたもんかな・・・


ちなみにWindowsだと普通にICMPのパケットを投げつける



追記:
Vine Linux 4.1のではと限定しておく
ちなみに、ヘルプを見ても「-I」オプションは書いてない、manも同じく(こっちは略)
バージョンが1.0っていうのは古いな・・・

[root@localhost /]# traceroute --help
traceroute: invalid option -- -
usage: traceroute [-nFV] [-f first_ttl] [-m max_hops] [-p port]
           [-s source_addr] [-i interface] [-g gateway]
           [-t tos] [-w timeout] [-q nqueries] host [packetlen]

[root@localhost /]# traceroute -V
This is traceroute 1.0
Copyright (c) 2002 Olaf Kirch

追記:
送信先ポートを33435から33434に修正

とりあえず、支障のない様にきつめのルールを書いてLAN内だけは使えるようにしてみた

iptables -t filter -A INPUT   -i eth0 -s 192.168.0.0/16 -d 192.168.X.Y/32 -p udp -m udp --sport 64000:64100 --dport 33434:33535 -j ACCEPT
iptables -t filter -A OUTPUT  -o eth0 -s 192.168.X.Y/32 -d 192.168.0.0/16 -p udp -m udp --sport 64000:64100 --dport 33434:33535 -j ACCEPT

tracerouteで投げるだけならOUTPUTのルールだけで良いが受ける場合はINPUTのルールも必要つうことで・・・
IPアドレスは192.168.X.Y/32が自ホスト、192.168.0.0/16がLANと仮定


ちなみに単純に許可するだけの場合は下記で十分かな?

iptables -t filter -A INPUT  -p udp -m udp --sport 64000:64100 --dport 33434:33535 -j ACCEPT
iptables -t filter -A OUTPUT -p udp -m udp --sport 64000:64100 --dport 33434:33535 -j ACCEPT