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