traceroute再入門
はじめに
tracerouteのことってどのくらい知っていますか?
- 目的のホストまでの経路が分かる
- ファイアウォール設定によっては経路が分からないことがある
- WindowsはICMP、LinuxはデフォルトはUDPで-IをつけるとICMPを使う
なんとなくこのくらいは知ってる、という方が多いと思います。
以下のネットワーク網を異なる環境で作って試していた時にtracerouteの挙動が違うな、と気づいたので改めて調べてみました。
2種類のtraceroute
結論からいうと、それぞれの環境で別のtracerouteコマンドを使っていました。
Linuxで使われるtracerouteには2種類あります。ひとつはGNU inetutilsのtraceroute(以降、この記事ではinetutils tracerouteと呼ぶことにします)で、もうひとつはsourceforgeにあるtraceroute for linux(こちらはtraceroute for linuxと呼ぶことにします)です。
inetutils traceroute
inetutilsは昔からLinuxを使っている人にはなじみ深いifconfigをはじめとするネットワーク関係のツールを集めたもので、tracerouteはそのツールの中のひとつです。ただ、ifconfigは今はiproute2のipコマンドへの置き換えが進んでおり、inetutilsはちょっと古くなってきているのかもしれないです。
website
manual
Ubuntuパッケージ情報
# dpkg -s inetutils-traceroute
Package: inetutils-traceroute
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 112
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Source: inetutils
Version: 2:2.2-2
Provides: traceroute
Depends: libc6 (>= 2.34), netbase
Description: trace the IPv4 route to another host
The traceroute utility displays the route taken by IP packets on their
way to another host or another network.
.
Install this package if you need a tool to examine network connectivity
or to diagnose network problems.
Original-Maintainer: Guillem Jover <guillem@debian.org>
Homepage: https://www.gnu.org/software/inetutils/
traceroute for linux
traceroute for linuxは「new modern implementation of traceroute」をうたっていて、マニュアルのオプションを見てもこちらの方が機能が多そうには見えます。
website
manual
Ubuntuパッケージ情報
# dpkg -s traceroute
Package: traceroute
Status: install ok installed
Priority: important
Section: net
Installed-Size: 148
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Version: 1:2.1.0-2
Depends: libc6 (>= 2.14)
Description: Traces the route taken by packets over an IPv4/IPv6 network
The traceroute utility displays the route used by IP packets on their way to a
specified network (or Internet) host. Traceroute displays the IP number and
host name (if possible) of the machines along the route taken by the packets.
Traceroute is used as a network debugging tool. If you're having network
connectivity problems, traceroute will show you where the trouble is coming
from along the route.
.
Install traceroute if you need a tool for diagnosing network connectivity
problems.
Original-Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Homepage: http://traceroute.sourceforge.net/
インストール
それぞれ以下のコマンドでインストールできます。
apt install inetutils-traceroute
apt install traceroute
どちらもtracerouteという名前のコマンドなので、「traceroute」と打鍵するとalternativesといういう仕組みでどちらかが実行されます。明示的にどちらかのバージョンを使いたいときはinetutils tracerouteは「inetutils-traceroute」コマンド、traceroute for linuxは「traceroute.db」コマンドで実行できます。
違い
コマンド出力の違い
inetutils tracerouteは以下の通りです。
# ip netns exec ogikubo inetutils-traceroute shinnakano
traceroute to shinnakano (10.254.2.5), 64 hops max
1 10.2.1.20 0.001ms 0.000ms 0.000ms
2 10.2.2.20 0.001ms 0.000ms 0.000ms
3 10.2.3.20 0.000ms 0.001ms 0.001ms
4 10.254.2.5 0.001ms 0.000ms 0.000ms
traceroute for linuxは以下の通りです。
# ip netns exec ogikubo traceroute.db shinnakano
traceroute to shinnakano (10.254.2.5), 30 hops max, 60 byte packets
1 minamiasagaya (10.2.1.20) 0.018 ms 0.001 ms 0.001 ms
2 shinkoenji (10.2.2.20) 0.006 ms 0.002 ms 0.003 ms
3 higashikoenji (10.2.3.20) 0.008 ms 0.002 ms 0.002 ms
4 shinnakano (10.254.2.5) 0.007 ms 0.003 ms 0.002 ms
見た目がかなり違いますね。inetutils tracerouteはIPアドレスをそのまま出力しているのに対し、traceroute for linuxはIPアドレスをホスト名に名前解決しています。
inetutils tracerouteは--resolve-hostnamesを付けると名前解決するようになります。IPアドレス・ホスト名の順番になっていて、上のtraceroute for linuxのホスト名・IPアドレスと逆というすごく微妙な違いがありますね。
# ip netns exec ogikubo inetutils-traceroute --resolve-hostnames shinnakano
traceroute to shinnakano (10.254.2.5), 64 hops max
1 10.2.1.20 (minamiasagaya) 0.002ms 0.001ms 0.001ms
2 10.2.2.20 (shinkoenji) 0.001ms 0.001ms 0.001ms
3 10.2.3.20 (higashikoenji) 0.001ms 0.000ms 0.000ms
4 10.254.2.5 (shinnakano) 0.001ms 0.000ms 0.000ms
一方、traceroute for linuxは-nを付けることで名前解決しなくなります。
# ip netns exec ogikubo traceroute.db -n shinnakano
traceroute to shinnakano (10.254.2.5), 30 hops max, 60 byte packets
1 10.2.1.20 0.150 ms 0.006 ms 0.004 ms
2 10.2.2.20 0.107 ms 0.005 ms 0.003 ms
3 10.2.3.20 0.112 ms 0.007 ms 0.004 ms
4 10.254.2.5 0.106 ms 0.007 ms 0.005 ms
最大hop数
先のコマンド出力をみて気づいたかもしれないのですが、inetutils tracerouteの「30 hops max, 60 byte packets」に対して「64 hops max」という違いがあります。
これはデフォルトでは最大ホップ数が違うことを示しています。
最大ホップ数が違うとどうなるのかというと、以下で書いたような目的地まで56ホップというケースで違いが出ます。
inetutils tracerouteだとこうなります。目的地の56ホップ目まで経路が分かります。
# ip netns exec ogikubo inetutils-traceroute nishifunabashi
traceroute to nishifunabashi (10.254.4.23), 64 hops max
1 10.2.1.20 0.001ms 0.000ms 0.001ms
2 10.2.2.20 0.000ms 0.000ms 0.000ms
3 10.2.3.20 0.000ms 0.001ms 0.000ms
4 10.2.4.20 0.001ms 0.000ms 0.000ms
5 10.2.5.20 0.000ms 0.000ms 0.001ms
6 10.2.6.20 0.000ms 0.000ms 0.000ms
7 10.2.7.20 0.001ms 0.001ms 0.000ms
8 10.2.8.20 0.001ms 0.000ms 0.000ms
9 10.9.12.10 0.000ms 0.001ms 0.001ms
10 10.9.11.10 0.001ms 0.000ms 0.001ms
11 10.9.10.10 0.001ms 0.000ms 0.000ms
12 10.9.9.10 0.000ms 0.001ms 0.000ms
13 10.2.24.10 0.000ms 0.000ms 0.000ms
14 10.2.23.10 0.001ms 0.001ms 0.000ms
15 10.2.22.10 0.000ms 0.000ms 0.001ms
16 10.8.10.10 0.001ms 0.001ms 0.001ms
17 10.6.13.20 0.000ms 0.001ms 0.000ms
18 10.6.14.20 0.000ms 0.001ms 0.000ms
19 10.8.7.10 0.001ms 0.001ms 0.000ms
20 10.7.3.10 0.001ms 0.001ms 0.000ms
21 10.7.2.10 0.001ms 0.000ms 0.000ms
22 10.5.4.20 0.000ms 0.000ms 0.001ms
23 10.5.5.20 0.000ms 0.000ms 0.000ms
24 10.5.6.20 0.001ms 0.001ms 0.001ms
25 10.2.14.20 0.000ms 0.000ms 0.000ms
26 10.2.15.20 0.000ms 0.001ms 0.000ms
27 10.2.16.20 0.000ms 0.000ms 0.000ms
28 10.5.10.20 0.000ms 0.000ms 0.000ms
29 10.5.11.20 0.001ms 0.000ms 0.000ms
30 10.5.12.20 0.000ms 0.000ms 0.000ms
31 10.5.13.20 0.000ms 0.001ms 0.000ms
32 10.5.14.20 0.000ms 0.000ms 0.001ms
33 10.5.15.20 0.001ms 0.000ms 0.001ms
34 10.5.16.20 0.000ms 0.001ms 0.001ms
35 10.5.17.20 0.001ms 0.001ms 0.000ms
36 10.3.21.10 0.000ms 0.001ms 0.001ms
37 10.3.20.10 0.001ms 0.000ms 0.001ms
38 10.3.19.10 0.001ms 0.000ms 0.000ms
39 10.3.18.10 0.001ms 0.001ms 0.000ms
40 10.3.17.10 0.000ms 0.001ms 0.000ms
41 10.3.16.10 0.001ms 0.000ms 0.001ms
42 10.3.15.10 0.000ms 0.001ms 0.000ms
43 10.3.14.10 0.001ms 0.000ms 0.000ms
44 10.3.13.10 0.001ms 0.000ms 0.000ms
45 10.4.11.20 0.001ms 0.001ms 0.000ms
46 10.4.12.20 0.000ms 0.001ms 0.001ms
47 10.4.13.20 0.001ms 0.001ms 0.000ms
48 10.4.14.20 0.000ms 0.001ms 0.000ms
49 10.4.15.20 0.001ms 0.000ms 0.001ms
50 10.4.16.20 0.001ms 0.001ms 0.001ms
51 10.4.17.20 0.001ms 0.001ms 0.001ms
52 10.4.18.20 0.000ms 0.001ms 0.000ms
53 10.4.19.20 0.000ms 0.001ms 0.001ms
54 10.4.20.20 0.001ms 0.000ms 0.001ms
55 10.4.21.20 0.000ms 0.001ms 0.000ms
56 10.254.4.23 0.000ms 0.001ms 0.001ms
traceroute for linuxはデフォルトは以下の通りです。30ホップで終了で、それ以上は出てきません。
# ip netns exec ogikubo traceroute.db nishifunabashi
traceroute to nishifunabashi (10.254.4.23), 30 hops max, 60 byte packets
1 minamiasagaya (10.2.1.20) 0.117 ms 0.022 ms 0.011 ms
2 shinkoenji (10.2.2.20) 0.024 ms 0.012 ms 0.019 ms
3 higashikoenji (10.2.3.20) 0.023 ms 0.016 ms 0.014 ms
4 shinnakano (10.2.4.20) 0.036 ms 0.018 ms 0.019 ms
5 nakanosakaue (10.2.5.20) 0.029 ms 0.021 ms 0.021 ms
6 nishishinjuku (10.2.6.20) 0.035 ms 0.024 ms 0.010 ms
7 shinjuku (10.2.7.20) 0.011 ms 0.006 ms 0.073 ms
8 shinjukusanchome (10.2.8.20) 0.015 ms 0.008 ms 0.007 ms
9 higashishinjuku (10.9.12.10) 0.015 ms 0.013 ms 0.008 ms
10 nishiwaseda (10.9.11.10) 0.014 ms 0.010 ms 0.009 ms
11 zoshigaya (10.9.10.10) 0.015 ms 0.010 ms 0.020 ms
12 ikebukuro (10.9.9.10) 0.018 ms 0.011 ms 0.074 ms
13 shinotsuka (10.2.24.10) 0.020 ms 0.012 ms 0.012 ms
14 myogadani (10.2.23.10) 0.019 ms 0.012 ms 0.012 ms
15 korakuen (10.2.22.10) 0.019 ms 0.013 ms 0.013 ms
16 iidabashi (10.8.10.10) 0.021 ms 0.014 ms 0.015 ms
17 ichigaya (10.6.13.20) 0.035 ms 0.016 ms 0.014 ms
18 kojimachi (10.6.14.20) 0.022 ms 0.016 ms 0.016 ms
19 nagatacho (10.8.7.10) 0.090 ms 0.022 ms 0.017 ms
20 aoyamaicchome (10.7.3.10) 0.022 ms 0.017 ms 0.017 ms
21 omotesando (10.7.2.10) 0.043 ms 0.028 ms 0.028 ms
22 nogizaka (10.5.4.20) 0.026 ms 0.041 ms 0.088 ms
23 akasaka (10.5.5.20) 0.030 ms 0.021 ms 0.030 ms
24 kokkaigijidomae (10.5.6.20) 0.026 ms 0.021 ms 0.021 ms
25 kasumigaseki (10.2.14.20) 0.027 ms 0.021 ms 0.022 ms
26 ginza (10.2.15.20) 0.027 ms 0.022 ms 0.022 ms
27 tokyo (10.2.16.20) 0.028 ms 0.024 ms 0.115 ms
28 otemachi (10.5.10.20) 0.041 ms 0.024 ms 0.024 ms
29 shinochanomizu (10.5.11.20) 0.029 ms 0.026 ms 0.025 ms
30 yushima (10.5.12.20) 0.031 ms 0.039 ms 0.031 ms
目的地までのルータたちがtracerouteに応答してくれることが分かっていれば最大ホップ数は大きければ大きいほど正確に経路を表示してくれるはずです。IPプロトコルの仕様上、TTLの最大値は255なので、デフォルト値が255であってもいいのに… という気もしますね。[1]
なぜtracerouteは最大ホップ数を64とか30にしているのか?
おそらく経路中でICMPがフィルタされて経路が分からない場合に早めにあきらめるためだと思います。
実験してみましょう。
その前にまず、tracerouteの原理についてちょっとだけおさらいです。
tracerouteは最初にIPヘッダのTTL(Time To Live)を1にしてパケットを送出します。目的地に向かって出て行ったパケットは1個目のルータでTTLが1減って0になります。TTLが0になった場合はパケットを破棄するというのがIPプロトコルのルールなのでパケットは破棄され、「TTL切れで破棄したよ」というICMP Time Exceededメッセージが送信元に返されます。
次にIPヘッダのTTLを2にしてパケットを送出します。1個目のルータはTTLを1減らして次のルータに送出します。2個目のルータでTTLを1減らすと0になり、2個目のルータからICMP Time Exceededメッセージが送信元に返されます。
その次はIPヘッダのTTLを3にして… という具合にパケットを送っていくことで目的地までに経由するルータを知ることができます。
Time Exceededメッセージが戻ってこれない環境を意図的に作りましょう。
以下のコマンドで、ogikuboルータの次のルータであるmiyamiasagayaルータでICMPのフォワードをブロックします。[2]
update-alternativesはWSLで最新のiptablesが動作しないのでlegacy版に切り替えているだけなので、本物のLinuxを使っている場合は不要です。
# update-alternatives --config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/sbin/iptables-nft 20 auto mode
1 /usr/sbin/iptables-legacy 10 manual mode
2 /usr/sbin/iptables-nft 20 manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables (iptables) in manual mode
# ip netns exec minamiasagaya iptables -A FORWARD -p icmp -j DROP
# ip netns exec minamiasagaya iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 DROP icmp -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
これで2個目、3個目、4個目ルータ… から戻ってくるICMPがファイアウォールでブロックされるようになりました。
本題に戻り、inetutils tracerouteとtraceroute for linuxの最大ホップ数の違いがどのような差になってくるのかを確認します。
inetutils tracerouteを実行してみます。実行時間を測るためにtimeコマンドを付けています。
# time ip netns exec ogikubo inetutils-traceroute nishifunabashi
traceroute to nishifunabashi (10.254.4.23), 64 hops max
1 10.2.1.20 0.001ms 0.002ms 0.000ms
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
31 * * *
32 * * *
33 * * *
34 * * *
35 * * *
36 * * *
37 * * *
38 * * *
39 * * *
40 * * *
41 * * *
42 * * *
43 * * *
44 * * *
45 * * *
46 * * *
47 * * *
48 * * *
49 * * *
50 * * *
51 * * *
52 * * *
53 * * *
54 * * *
55 * * *
56 * * *
57 * * *
58 * * *
59 * * *
60 * * *
61 * * *
62 * * *
63 * * *
64 * * *
real 9m28.143s
user 0m0.000s
sys 0m0.091s
2ホップ目以降は*になっていて応答が戻ってこないことを示しています。
応答がまったくないのでtracerouteはホップ数を徐々に増やしてデフォルトの最大ホップ数である64ホップまでトライして、それでコマンドを終了しています。
応答がタイムアウトするのを待っているので、9分28秒(568秒)もかかっています。おそらく同じTTLで3つのパケットを投げていること、1つのパケットに対して3秒待っていること、63ホップ分の応答が返ってこないことで、3 × 3 × 63 = 567秒の待ち時間が生じてるものだと思われます。これが255ホップまでトライするとなるとおそらく4倍の時間がかかると思われます。
traceroute for linuxを実行してみます。
# time ip netns exec ogikubo traceroute.db nishifunabashi
traceroute to nishifunabashi (10.254.4.23), 30 hops max, 60 byte packets
1 minamiasagaya (10.2.1.20) 0.034 ms 0.003 ms 0.001 ms
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
real 0m30.033s
user 0m0.010s
sys 0m0.000
traceroute for linuxはデフォルトの最大ホップ数が30でした。そのため30ホップまでトライして終了していますね。かかった時間は30秒でした。
30秒?思ったより早いですね。inetutils tracerouteが64ホップで9分28秒だったので、30ホップだと4~5分かかるかなと思ったんですが…
マニュアルの-wオプションのところにいろいろ書いてありますね。なんか工夫して待ち時間が短くなるようにしているみたいです。
パケットの違い
inetutils tracerouteのパケットキャプチャです。
次の特徴があります。
- TTL 1のパケットは3つ全てUDP宛先ポート番号は33434
- TTL 2のパケットは3つ全てUDP宛先ポート番号は33435
- TTL 2のパケットは3つ全てUDP宛先ポート番号は33436
- UDP送信元ポート番号は56863で固定
- tracerouteコマンドを実行するたびに送信元ポート番号が変わったので、完全に固定ではなくて、1回のtracerouteコマンドでは同じ送信元ポート番号を使うようです。
- IPパケットサイズは37バイト(イーサネットフレームサイズはヘッダ14バイトを足して51バイト)
UDPのペイロードが「SUPERMAN」ですね。このコマンド作った人の遊び心ですかね。
TTLが同じパケットは宛先ポート番号が同じです。画面には写せていないですが、IDヘッダのidentificationフィールドには異なる値が入っているので全く同じパケットを再送しているわけではないです。
UDP宛先ポート番号が33434というのはマニュアルにも記載があるのですが、インクリメントして別のポート番号も使っていることは知りませんでした。
せめて宛先ポート番号が固定であればファイアウォールで許可ルールを簡単に書けるのですが、宛先ポート番号が広く、送信元ポート番号も不定なので、ファイアウォールとは相性が悪いプロトコルですね。
なんで宛先ポート番号が固定じゃないんでしょうね。理由が分かる人がいれば教えてください。
次に、traceroute for linuxのパケットキャプチャです。
次の特徴があります。
- TTL 1のパケットは1つ目のUDP宛先ポート番号は33434
- TTL 1のパケットは2つ目のUDP宛先ポート番号は33435
- TTL 1のパケットは3つ目のUDP宛先ポート番号は33436
- TTL 2のパケットは1つ目のUDP宛先ポート番号は33437
- TTL 2のパケットは2つ目のUDP宛先ポート番号は33438
- TTL 2のパケットは3つ目のUDP宛先ポート番号は33439
- IPパケットサイズは60バイト(イーサネットフレームサイズはヘッダ14バイトを足してイーサネットフレームサイズは74バイト)
- 今回は目的地ルータは4ホップ先なんですが、TTL 5、TTL 6のパケットも送っています。
こっちは同じTTLでも別の宛先ポート番号を使うんですね… なぜだろう?
traceroute for linuxのコマンド実行結果の最初に「30 hops max, 60 byte packets」と出てくるのはこのIPパケットのサイズですね。なぜわざわざパケットサイズを出力しているのかは謎です。コマンドの第二引数にpacket_lenを指定できるのと、Don't Fragmentフラグをセットするオプションもあるようなので、Path MTU Discovery関係ですかね。
目的地を超えるTTLを送っているのも謎ですね。コマンドを早く完了させるために先読みして多めにパケットを投げているとか?
TCP
inetutils tracerouteはUDPかICMPを使います。
traceroute for linuxはTCPも使えるようですね。
# ip netns exec ogikubo traceroute.db -T shinnakano
traceroute to shinnakano (10.254.2.5), 30 hops max, 60 byte packets
1 minamiasagaya (10.2.1.20) 0.027 ms 0.005 ms 0.004 ms
2 shinkoenji (10.2.2.20) 0.079 ms 0.020 ms 0.008 ms
3 higashikoenji (10.2.3.20) 0.025 ms 0.008 ms 0.007 ms
4 shinnakano (10.254.2.5) 0.011 ms 0.008 ms 0.005 ms
パケットキャプチャはこちらです。
TTLが0になることで発生するTime Exceedを利用するという原理には変わりはないのですが、SYNフラグをセットしたTCP(宛先ポートはデフォルト80)を使うことでファイアウォールを突破しやすくなっています。これは便利そう。
UDPではICMP Type 3(Destination Unreachable) Code 3(Port Unrechable)が返ってくることで終点を検知しています。この例では目的地のルータでTCP80番をListenしていないため、TCP Resetが返ってくることで終点を検知しているようです。マニュアルによると相手からSYN+ACKが返ってくるとこちら(tracerouteコマンドを実行したホスト)からTCP Resetを送るそうです。
IPv6
環境を作っていないので試していませんが、traceroute for linuxはIPv6の経路確認ができるようです。
(補足)alternativesについて
同じ名前のコマンドを複数インストールしたときにどちらを優先するのかはalternativesという仕組みがあります。これは明示的に自分が優先して使うコマンドを指定することもできるし(manualモード)、自動的にきめてもらうこともできます(autoモード)。autoモードがどのように優先コマンドを決めるかというと、各コマンドはPriorityを持っていて、このPriorityが高い方が優先されます。
ところが、Ubuntu22.04だと、inetutils-tracerouteパッケージのalternatives Priorityは100で、tracerouteパッケージ(traceroute for linux)のalternatives Priorityも100です。
どちらが優先させるのだろう?アルファベット順かな?先にインストールした方?後でインストールした方?と疑問に思って何度かインストール、アンインストールを繰り返してみたのですが、どうも「先にインストールした方が優先」のようです。
先にinetutils tracerouteをインストール
# apt install inetutils-traceroute
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
libffi7
Use 'apt autoremove' to remove it.
The following NEW packages will be installed:
inetutils-traceroute
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 43.0 kB of archives.
After this operation, 115 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 inetutils-traceroute amd64 2:2.2-2 [43.0 kB]
Fetched 43.0 kB in 1s (42.6 kB/s)
Selecting previously unselected package inetutils-traceroute.
(Reading database ... 34818 files and directories currently installed.)
Preparing to unpack .../inetutils-traceroute_2%3a2.2-2_amd64.deb ...
Unpacking inetutils-traceroute (2:2.2-2) ...
Setting up inetutils-traceroute (2:2.2-2) ...
update-alternatives: using /usr/bin/inetutils-traceroute to provide /usr/bin/traceroute (traceroute) in auto mode
Processing triggers for man-db (2.10.2-1) ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...
Failed to retrieve available kernel versions.
Failed to check for processor microcode upgrades.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
update-alternatives: using /usr/bin/inetutils-traceroute to provide /usr/bin/traceroute (traceroute) in auto modeという出力があります。
ここで/usr/bin/tracerouteを打つとinetutils版が使われることになります。
# apt install traceroute
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
libffi7
Use 'apt autoremove' to remove it.
The following NEW packages will be installed:
traceroute
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 45.4 kB of archives.
After this operation, 152 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 traceroute amd64 1:2.1.0-2 [45.4 kB]
Fetched 45.4 kB in 1s (43.7 kB/s)
Selecting previously unselected package traceroute.
(Reading database ... 34827 files and directories currently installed.)
Preparing to unpack .../traceroute_1%3a2.1.0-2_amd64.deb ...
Unpacking traceroute (1:2.1.0-2) ...
Setting up traceroute (1:2.1.0-2) ...
update-alternatives: using /usr/bin/traceroute6.db to provide /usr/bin/traceroute6 (traceroute6) in auto mode
update-alternatives: using /usr/bin/lft.db to provide /usr/bin/lft (lft) in auto mode
update-alternatives: using /usr/bin/traceproto.db to provide /usr/bin/traceproto (traceproto) in auto mode
update-alternatives: using /usr/sbin/tcptraceroute.db to provide /usr/sbin/tcptraceroute (tcptraceroute) in auto mode
Processing triggers for man-db (2.10.2-1) ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...
Failed to retrieve available kernel versions.
Failed to check for processor microcode upgrades.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
update-alternativesという出力行がいくつかありますが、/usr/bin/tracerouteについての出力はありません。
そのため、/usr/bin/tracerouteはinetutils版のまま変わりません。
# update-alternatives --query traceroute
Name: traceroute
Link: /usr/bin/traceroute
Slaves:
traceroute.1.gz /usr/share/man/man1/traceroute.1.gz
traceroute.sbin /usr/sbin/traceroute
Status: auto
Best: /usr/bin/inetutils-traceroute
Value: /usr/bin/inetutils-traceroute
Alternative: /usr/bin/inetutils-traceroute
Priority: 100
Slaves:
traceroute.1.gz /usr/share/man/man1/inetutils-traceroute.1.gz
Alternative: /usr/bin/traceroute.db
Priority: 100
Slaves:
traceroute.1.gz /usr/share/man/man1/traceroute.db.1.gz
traceroute.sbin /usr/bin/traceroute.db
alternativesのステータス確認コマンドを打つと、Valueのところが/usr/bin/inetutils-tracerouteになっていて、inetutilsのtracerouteが選択されていることが分かります。
ちなみに先ほど述べた通り、/usr/bin/inetutils-tracerouteも/usr/bin/traceroute.dbもPriorityが同じ(100)です。
# traceroute --version
traceroute (GNU inetutils) 2.2
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Elian Gidoni.
実際にtracerouteコマンドを打つと、GNU inetutils版であることが分かります。
先にtraceroute for linuxをインストール
inetutils-tracerouteとtracerouteをアンインストールして今度は先にtraceroute for linuxをインストールしてみます。
# apt install traceroute
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
libffi7
Use 'apt autoremove' to remove it.
The following NEW packages will be installed:
traceroute
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 45.4 kB of archives.
After this operation, 152 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 traceroute amd64 1:2.1.0-2 [45.4 kB]
Fetched 45.4 kB in 1s (56.1 kB/s)
Selecting previously unselected package traceroute.
(Reading database ... 34818 files and directories currently installed.)
Preparing to unpack .../traceroute_1%3a2.1.0-2_amd64.deb ...
Unpacking traceroute (1:2.1.0-2) ...
Setting up traceroute (1:2.1.0-2) ...
update-alternatives: using /usr/bin/traceroute.db to provide /usr/bin/traceroute (traceroute) in auto mode
update-alternatives: using /usr/bin/traceroute6.db to provide /usr/bin/traceroute6 (traceroute6) in auto mode
update-alternatives: using /usr/bin/lft.db to provide /usr/bin/lft (lft) in auto mode
update-alternatives: using /usr/bin/traceproto.db to provide /usr/bin/traceproto (traceproto) in auto mode
update-alternatives: using /usr/sbin/tcptraceroute.db to provide /usr/sbin/tcptraceroute (tcptraceroute) in auto mode
Processing triggers for man-db (2.10.2-1) ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...
Failed to retrieve available kernel versions.
Failed to check for processor microcode upgrades.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
前回はなかったupdate-alternatives: using /usr/bin/traceroute.db to provide /usr/bin/traceroute (traceroute) in auto modeという行があります。
# apt install inetutils-traceroute
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
libffi7
Use 'apt autoremove' to remove it.
The following NEW packages will be installed:
inetutils-traceroute
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 43.0 kB of archives.
After this operation, 115 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 inetutils-traceroute amd64 2:2.2-2 [43.0 kB]
Fetched 43.0 kB in 1s (56.6 kB/s)
Selecting previously unselected package inetutils-traceroute.
(Reading database ... 34838 files and directories currently installed.)
Preparing to unpack .../inetutils-traceroute_2%3a2.2-2_amd64.deb ...
Unpacking inetutils-traceroute (2:2.2-2) ...
Setting up inetutils-traceroute (2:2.2-2) ...
Processing triggers for man-db (2.10.2-1) ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...
Failed to retrieve available kernel versions.
Failed to check for processor microcode upgrades.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
こんどはupdate-alternativesの出力がありません。
# update-alternatives --query traceroute
Name: traceroute
Link: /usr/bin/traceroute
Slaves:
traceroute.1.gz /usr/share/man/man1/traceroute.1.gz
traceroute.sbin /usr/sbin/traceroute
Status: auto
Best: /usr/bin/traceroute.db
Value: /usr/bin/traceroute.db
Alternative: /usr/bin/inetutils-traceroute
Priority: 100
Slaves:
traceroute.1.gz /usr/share/man/man1/inetutils-traceroute.1.gz
Alternative: /usr/bin/traceroute.db
Priority: 100
Slaves:
traceroute.1.gz /usr/share/man/man1/traceroute.db.1.gz
traceroute.sbin /usr/bin/traceroute.db
Valueのところが/usr/bin/traceroute.dbになっていて、traceroute for linuxが選択されていることが分かります。
# traceroute --version
Modern traceroute for Linux, version 2.1.0
Copyright (c) 2016 Dmitry Butskoy, License: GPL v2 or any later
traceroute for linux版ですね。
「traceroute.db」の「db」ってなんだろう?データベース?とか疑問に思っていたのですが、作者のDmitry Butskoyさんのことなのかな。
まとめ
だいぶ長くなったのですが、まとめとしては
- tracerouteにはinetutils版とtraceroute for linuxがある
- traceroute for linuxの方が高機能そう
- traceroute --versionしてみて「traceroute (GNU inetutils)」と出てきたら、apt remove inetutils-traceroute; apt install tracerouteしてみよう
- 「*」ばっかり出てきてファイアウォールでフィルタされている気配があれば、-TオプションをつけてTCPでやってみよう
Discussion