【Linux】traceroute の結果(!X, !H, *アスタリスク)の原因/理由,利用ポートについて~ | SEの道標
Linux基礎

【Linux】traceroute の結果(!X, !H, *アスタリスク)の原因/理由,利用ポートについて~

traceroute の成功例のサンプル

[root@localhost ~]# traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 gateway (192.168.100.1) 1.110 ms 0.920 ms 0.854 ms
2 118.23.9.239 (118.23.9.239) 4.274 ms 4.997 ms 4.958 ms
3 118.23.9.117 (118.23.9.117) 4.892 ms 4.834 ms 4.782 ms
4 118.23.30.209 (118.23.30.209) 8.694 ms 8.635 ms 8.544 ms
5 153.149.203.29 (153.149.203.29) 7.666 ms 8.418 ms 8.347 ms
6 153.149.218.65 (153.149.218.65) 12.719 ms 11.020 ms 10.782 ms
7 153.149.218.106 (153.149.218.106) 10.617 ms 9.957 ms 23.765 ms
8 122.1.245.70 (122.1.245.70) 10.533 ms 9.748 ms 10.366 ms
9 211.0.193.14 (211.0.193.14) 13.566 ms 13.492 ms 13.365 ms
10 * * *
11 64.233.175.160 (64.233.175.160) 12.147 ms 108.170.233.16 (108.170.233.16) 10.420 ms 209.85.242.44 (209.85.242.44) 11.088 ms
12 108.170.238.71 (108.170.238.71) 9.409 ms 209.85.253.167 (209.85.253.167) 13.389 ms 209.85.247.161 (209.85.247.161) 10.780 ms
13 google-public-dns-a.google.com (8.8.8.8) 10.633 ms 10.581 ms 9.614 ms
[root@localhost ~]#

上記の例において、PC からは以下のような IP パケットが NW に流れます。

1パケット目=[宛先IP]=8.8.8.8 [IP TTL]=1 [宛先UDPポート]=33434
2パケット目=[宛先IP]=8.8.8.8 [IP TTL]=1 [宛先UDPポート]=33435
3パケット目=[宛先IP]=8.8.8.8 [IP TTL]=1 [宛先UDPポート]=33436
4パケット目=[宛先IP]=8.8.8.8 [IP TTL]=2 [宛先UDPポート]=33437
5パケット目=[宛先IP]=8.8.8.8 [IP TTL]=2 [宛先UDPポート]=33438
6パケット目=[宛先IP]=8.8.8.8 [IP TTL]=2 [宛先UDPポート]=33439
・・・・・

つまり、traceroute の仕組みとして、TTL=1 のパケットを 3 回、TTL を 1 増やしてまた 3 回、、、というのを宛先に辿り着くまで繰り返します。UDP ポートは 33434 から始まり、1 パケット毎に 1 ずつ増やしていきます。

TTL=1 の場合は 192.168.100.1 で TTL=0 となるので、ICMP の仕組みとして送信元 IP に対して ICMP Time Exceeded (type=11:一般的には TTL expired と呼ばれる)が返されます

TTL=2 の場合はその次の NW 機器 (118.23.9.239) までルーティングされますが、やはりそこで TTL=0 となり、送信元 IP に対して Time Exceeded が返されます。

表示された結果の 12 行目までは途中経路であり、表示されているのは、UDP に対する Time Exceeded の送信元IPと、それが戻ってくるまでの時間(3回分)です。

また、最後の13行目は宛先そのものであり、この場合は ICMP Destination Unreachable (type=3) のうちの Port Unreachable(code=3)が返されます

このあたりまでを読んでよく分からない人は、traceroute の仕組みについては、下記ページにて図解していますので参考にして下さい。

図解 tracert の見方 ~WindowsとLinuxの違い(icmp/udp),経路途中のIPが表示されない理由~
traceroute (tracert)とは tracert (Linux 系の...

*(アスタリスク) の意味

先の例で、10 行目がアスタリスクになっています。アスタリスクは traceroute の timeout (デフォルト 5 秒) の間、送信した UDP に対して何も返って来なかったことを意味します

もう 1 つの例として、Windows Firewall を有効にしている PC 宛の traceroute は、最後の Port Unreachable も返しません。traceroute としては宛先に着いたかどうかが分かりませんので、TTL を 30 まで増やし、そこで諦めます。以下は、1 hop 目から宛先に着くはずが、最初からWindows Firewall に弾かれているケースの例です。

[root@localhost ~]# traceroute 192.168.100.59
traceroute to 192.168.100.59 (192.168.100.59), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
~~~途中省略~~~
30  * * *

Windows Firewall を無効にすると以下のようになります。

[root@localhost ~]# traceroute 192.168.100.59
traceroute to 192.168.100.59 (192.168.100.59), 30 hops max, 60 byte packets
1 192.168.100.59 (192.168.100.59) 0.208 ms * *

最初の 1 回だけ成功し、2 回目以降はアスタリスクになります。これは Windows の DoS 攻撃への対策のようで、開放していない (Listen していない) ポート宛の TCP/UDP パケットを受信した場合は、一定秒間同じパケットを受け取ってもそれに対していちいち Port Unreachable を返さないようになっています。

!H の意味

! は [ICMP Type=3] Destination Unreachable であることを意味しています。その中でも !H は [Type=3/Code=1] Host Unreachable が返ってきたことを意味します。これは、宛先IPの1つ手前の NW 機器が宛先 IP の ARP を解決しようとしたが (ホストダウン等が原因で) ARP 解決できなかった場合に返されます。

!X の意味

!X は [Type=3/Code=13] Communication Administratively Prohibited が返ってきたことを意味します。これは主に、途中の NW 機器が ACL によりその通信を拒否していることが多いです。!X が表示されている行の IP がアサインされている NW 機器の設定を調べましょう。

!N の意味

!N は [Type=3/Code=0] Net Unreachable が返ってきたことを意味します。宛先の 2 つ以上手前のNW機器において、NextHop の ARP が応答しないときなどに返されます。

!P の意味

!P は [Type=3/Code=2] Protocol Unreachable が返ってきたことを意味します。そもそもそのホストの OS 等で UDP 自体をサポートしていない場合に返されます。

!F の意味

!F は [Type=3/Code=4] Fragmentation Needed and DF set が返ってきたことを意味します。途中経路でパケットサイズを下回る MTU サイズのインタフェースがあるはずです。

!S の意味

!S は [Type=3/Code=5] Source route failed が返ってきたことを意味します。最近の NW 機器はセキュリティ上よろしくない Source route オプションの付いた IP パケットなんぞは drop すると思いますので、その際にこの ICMP が返されることがあります。

!V の意味

!V は [Type=3/Code=14] Host Precedence Violation が返ってきたことを意味します。これは NW 機器で許可されていない IP Precedence (ToS) 値が使われた場合、その NW 機器が送信元に対してこの ICMP を返します。(主に RSVP を想定した使い方)

その他 !# が表示される場合の意味

それ以外の Code が返ってきた場合は ! のあとに Code 番号が付いたものが表示されます。

ICMP の Type や Code の種類や意味については以下を参考にして下さい。

【一覧】ICMP ポート番号, Type/Code ~種類とメッセージの意味について~
ICMPのポート番号 TCP/UDP とは異なり、ICMP にはポート番号という...

pingが通るのにtracerouteが通らない原因と対処

ping は icmp を使うのに対し、Linux の traceroute はデフォルトでは udp を使います。

もし ping が通ったのに traceroute が通らないときは、-Iオプションをつけましょう。これで Windows の tracert と同様、icmp を使った traceroute が出来ます。

コメント

タイトルとURLをコピーしました