💡

traceroute再入門

2022/06/12に公開

はじめに

tracerouteのことってどのくらい知っていますか?

  • 目的のホストまでの経路が分かる
  • ファイアウォール設定によっては経路が分からないことがある
  • WindowsはICMP、LinuxはデフォルトはUDPで-IをつけるとICMPを使う

なんとなくこのくらいは知ってる、という方が多いと思います。
以下のネットワーク網を異なる環境で作って試していた時にtracerouteの挙動が違うな、と気づいたので改めて調べてみました。

https://zenn.dev/takai404/articles/8e267cbcf12923

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

https://www.gnu.org/software/inetutils/

manual

https://www.gnu.org/software/inetutils/manual/html_node/traceroute-invocation.html#traceroute-invocation

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

http://traceroute.sourceforge.net/

manual

https://man7.org/linux/man-pages/man8/traceroute.8.html

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ホップというケースで違いが出ます。

https://zenn.dev/takai404/articles/8e267cbcf12923

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でやってみよう
脚注
  1. inetutils tracerouteもtraceroute for linuxも-mオプションで最大ホップ数を指定できます。 ↩︎

  2. ここで投入したDROPルールはサーバを再起動するか、「ip netns exec minamiasagaya iptables -D FORWARD 1」コマンドで消えます。 ↩︎

Discussion