この記事は
Linuxのtraceroute
がオプションごとに
どんなパケットを投げているのか調べる
パケットの中身はtcpdump
コマンドでキャプチャし、WireSharkで閲覧する
Windowsのtracert
ではない
バージョン traceroute --version
tracerouteコマンドにもバージョンが存在し、今回使うバージョンはversion 2.1.0
らしい
Modern traceroute for Linux, version 2.1.0
Copyright (c) 2016 Dmitry Butskoy, License: GPL v2 or any later
オプションの種類 traceroute --help
tracerouteコマンドのヘルプを一部抜粋する
今回はオプション無しに加えて、下記3つのオプョンを試す
Options:
-I --icmp Use ICMP ECHO for tracerouting
-T --tcp Use TCP SYN for tracerouting (default port is 80)
-U --udp Use UDP to particular port for tracerouting
(instead of increasing the port per each probe),
default port is 53
次章からさっそくキャプチャの中身を見ていく
traceroute (オプション無し)
問い合わせ | 応答 |
---|---|
UDP | ICMP Port unreachable |
無茶苦茶なポーへのUDP問い合わせに対して、ポート到達不可の応答が返される
ICMP応答の詳細 Port unreachable
port unreachableはサーバーまで通信が出来ていますが、サーバーのポートが解放されていない時に使われます。この場合、サーバーまでパケットは届いている事が分かります。
ICMPヘッダーの構造
traceroute -U
問い合わせ | 応答 |
---|---|
UDP 53 | ICMP Port unreachable |
-
--help
にdefault port is 80
と記載があるとおりの問い合わせ - 応答の種類は、先ほどのオプション無しtracerouteと同じ
traceroute -T
問い合わせ | 応答 |
---|---|
TCP 80 | TCP ACK |
-
--help
にdefault port is 80
と記載があるとおりの問い合わせ - SYNに対するSYN/ACKまたはRST/ACKが応答として返される
相手がウェブサーバーの場合(ポート80が開いている場合)
ウェブサーバーの場合は80番ポートで実際に通信が可能であるため
通信を継続しようとする応答SYN/ACKが返ってくる
相手がウェブサーバーではない場合(ポート80が開いていない場合)
相手がウェブサーバーではない場合は、普通は80番ポートは閉まっている
そのため80番ポートとコネクションを拒否するためにリセット(RST/ACK)が返ってくる
traceroute -I
問い合わせ | 応答 |
---|---|
ICMP Request | ICMP Reply |
PINGによる疎通確認と同じ内容
まとめ
Linuxのtracerouteの様子をWireSharkでキャプチャした
WindowsマシンのファイアウォールではICMPに応答を返さない設定にされていることが多々ある
また、途中のファイアウォール機器によって特定ポート以外のパケットを拒否していたりすることもある
さらには、過去に自分もハマったTCPオフロードの機能のオン/オフによっては
チェックサムが無効であるとUDPのパケットが破棄されて
「Port unreachableの応答が返ってこないが、ICMPリプライとSYN/ACKは返ってくる」といったケースもある・・・その時の様子
「tracerouteから応答が返ってこない!!」など困ったときは
オプションを変更すると返ってくるかもしれない
以上
参考