Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

traceroute/tracepathコマンドの使い方(工事中)

Last updated at Posted at 2018-05-09

#1 環境
VMware Workstation 12 Player上のゲストマシンを使っています。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@server ~]# uname -r
3.10.0-514.el7.x86_64

#2 インストール方法

[root@server ~]# yum install traceroute
[root@server ~]# traceroute --version
Modern traceroute for Linux, version 2.0.22
Copyright (c) 2008  Dmitry Butskoy,   License: GPL v2 or any later

#3 tracerouteとtracepathの違い

       traceroute tracepath
経路探索に使うプロトコル ICMP,UDP,TCP UDP
オプションの数 たくさんある すこし(tracerouteのオプションに包含されている)

#4 tracerouteコマンドの使い方
##4.1 tracerouteコマンドの仕組み

###4.1.1 ICMPを使ったトレース(-I)
-Iオプションを使うと、ICMP echo requestパケットを送信します。
このとき、下記のようにTTLごとに、ICMP echo requestを3つずつ送信します。

[root@server ~]# traceroute -I 1 8.8.8.8

 送信元                                      ルータ1       ルータ2       宛先(IP=X)
   |                                            |             |              |
   |                                            |             |              |
   |---- ICMP echo request(IP dst=X,TTL=1) ---->| x3          |              |
   |<--- ICMP(Time-to-live exceeded) -----------|             |              |
   |                                            |             |              |
   |                                            |             |              |
   |---- ICMP echo request(IP dst=X,TTL=2) ------------------>| x3          |
   |<--- ICMP(Time-to-live exceeded) -------------------------|              |
   |                                            |             |              |
   |                                            |             |              |
   |---- ICMP echo request(IP dst=X,TTL=3) --------------------------------->| x3
   |<--- ICMP echo rely -----------------------------------------------------| x3
   |                                            |             |              |
   |                                            |             |              |

###4.1.1 送信するICMPパケット数を指定する方法(-q)

送信するICMPパケット数(-q)を1つにする。
[root@server ~]# traceroute -I -q 1 1 8.8.8.8

 送信元                                      ルータ1       ルータ2       宛先(IP=X)
   |                                            |             |              |
   |                                            |             |              |
   |---- ICMP echo request(IP dst=X,TTL=1) ---->| x1          |              |
   |<--- ICMP(Time-to-live exceeded) -----------|             |              |
   |                                            |             |              |
   |                                            |             |              |
   |---- ICMP echo request(IP dst=X,TTL=2) ------------------>| x1           |
   |<--- ICMP(Time-to-live exceeded) -------------------------|              |
   |                                            |             |              |
   |                                            |             |              |
   |---- ICMP echo request(IP dst=X,TTL=3) --------------------------------->| x1
   |<--- ICMP echo rely -----------------------------------------------------|
   |                                            |             |              |
   |                                            |             |              |

##4.1.2 UDPを使ったトレース

 送信元                                      ルータ1       ルータ2       宛先(IP=X)
   |                                            |             |              |
   |                                            |             |              |
   |------- UDP (IP dst=X,TTL=1) -------------->|             |              |
   |<------ ICMP(Time-to-live exceeded) --------|             |              |
   |                                            |             |              |
   |                                            |             |              |
   |------- UDP (IP dst=X,TTL=2) ---------------------------->|              |
   |<------ ICMP(Time-to-live exceeded) ----------------------|              |
   |                                            |             |              |
   |                                            |             |              |
   |------- UDP (IP dst=X,TTL=3) ------------------------------------------->|
   |<------ ICMP port unreachable -------------------------------------------|
   |                                            |             |              |
   |                                            |             |              |

##4.1.3 TCPを使ったトレース

 送信元                                      ルータ1       ルータ2       宛先(IP=X)
   |                                            |             |              |
   |                                            |             |              |
   |------- TCP SYN (IP dst=X,TTL=1) ---------->|             |              |
   |<------ ICMP(Time-to-live exceeded) --------|             |              |
   |                                            |             |              |
   |                                            |             |              |
   |------- TCP SYN (IP dst=X,TTL=2) ------------------------>|              |
   |<------ ICMP(Time-to-live exceeded) ----------------------|              |
   |                                            |             |              |
   |                                            |             |              |
   |------- TCP SYN (IP dst=X,TTL=3) --------------------------------------->|
   |<------ TCP SYN+ACK -----------------------------------------------------|
   |------- TCP RST -------------------------------------------------------->|
   |                                            |             |              |
   |                                            |             |              |

#5 tracepathコマンドの使い方
##5.1 tracepathの仕組み
送信元から宛先に対してUDPパケットを送信する。
その時のIPヘッダのTTLは1,宛先UDPポート番号はYとして送信する。
TTLはルータを通過する度に1減算される。
TTLが0になるとIPパケットが廃棄され、送信元にICMPが返信される。

 送信元                              ルータ1       ルータ2          宛先
   |                                    |             |       (宛先IP=X, 宛先UDPポート=Y)
   |                                    |             |              |
   |                                    |             |              |
   |---- IP(IP=X,TTL=1) + UDP(Y) ------>|             |              |
   |<--- ICMP(Time-to-live exceeded) ---|             |              |
   |                                    |             |              |
   |                                    |             |              |
   |---- IP(IP=X,TTL=2) + UDP(Y) -------------------->|              |
   |<--- ICMP(Time-to-live exceeded) -----------------|              |
   |                                    |             |              |
   |                                    |             |              |
   |---- IP(IP=X,TTL=3) + UDP(Y) ----------------------------------->|
   |<--- ICMP(Destination unreachable:Port unreachable) -------------|
   |                                    |             |              |
   |                                    |             |              |
   |                                    |             |              |

宛先まで到着するとICMPパケット(Port unreachable)が送信元に返信される。
Port unreachableを受信すると、トレースを終了して、宛先までのルータのアドレスを表示する。

##5.2 コマンドの使い方
###5.2.1 実験環境

コンテナを起動する。ゲストマシン,コンテナのOSはCentOS7.2です。
[root@master ~]# docker run -it centos:centos7 bash
[root@9f89aef9bdf5 /]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)


   +-------- ゲストマシン --------+
   |                             |
   |   +------ コンテナ ------+   |
   |   |                     |   |
   |   |                     |<======== ここでtracepathを実行する。
   |   |                     |   |      # tracepath 192.168.3.1 -n
   |   |     172.17.0.2      |   |
   |   +------- eth0 --------+   |
   |              |              |
   |              |              |
   |   +------ docker0 ------+   |
   |   |      172.17.0.1     |<========= ここでtcpdumpを採取する。
   |   +---------------------+   |       # tcpdump -i docker0 icmp or udp -nn
   |              |              |
   |        192.168.0.10         |
   +------------ eth0 -----------+
                  |
                  |                             無線ルータ
                  |                       +--------------------+
                  |                       |                    |             ISPのルータ
                  +----------------- 192.168.0.1(GW)      192.168.3.2 ------ 192.168.3.1
                                          |                    |
                                          +--------------------+

###5.2.2 実行結果
コンテナからISPのルータに対してtracepathコマンドを実行した。
宛先まで、2つのルータ(docker0,無線ルータ)を経由することがわかった。
実行結果として宛先が同じ行が2行ある(★印)。これは、宛先UDPポート番号を変化させながら送信した結果です。
なお、docker0もルータのようにTTLを1減算することがわかった。

[root@9f89aef9bdf5 /]# tracepath 192.168.3.1 -n
 1?: [LOCALHOST]                                         pmtu 1500
 1:  172.17.0.1 ★                                        13.243ms
 1:  172.17.0.1 ★                                       258.992ms
 2:  192.168.0.1                                         133.312ms
 3:  192.168.3.1                                           4.548ms reached
     Resume: pmtu 1500 hops 3 back 103
[root@9f89aef9bdf5 /]#



 コンテナ(送信元)                        docker0           無線ルータ         ISPのルータ
 172.17.0.2                              172.17.0.1       192.168.0.1      192.168.3.1(=X)
    |                                        |                 |                |
    |                                        |                 |                |
    |                                        |                 |                |
    |---- IP(IP=X,TTL=1) + UDP(44444) ------>|UDP port=44444   |                |
    |<--- ICMP(Time-to-live exceeded) -------|                 |                |
    |                                        |                 |                |
    |                                        |                 |                |
    |---- IP(IP=X,TTL=1) + UDP(44445) ------>|UDP port=44445   |                |
    |<--- ICMP(Time-to-live exceeded) -------|                 |                |
    |                                        |                 |                |
    |                                        |                 |                |
    |---- IP(IP=X,TTL=2) + UDP(44446) ------------------------>|UDP port=44446  |
    |<--- ICMP(Time-to-live exceeded) -------------------------|                |
    |                                        |                 |                |
    |                                        |                 |                |
    |---- IP(IP=X,TTL=3) + UDP(44447) ----------------------------------------->| UDP port=44447
    |<--- ICMP(Destination unreachable:Port unreachable) -----------------------|
    |                                        |                 |                |
    |                                        |                 |                |
    |                                        |                 |                |

   +-------- ゲストマシン --------+
   |                             |
   |                             |
   |                             |
   |        192.168.0.100        |
   +------------ eth0 -----------+
                  |
                  |                             無線ルータ
                  |                       +--------------------+
                  |                       |                    |             ISPのルータ
                  +----------------- 192.168.0.1(GW)      192.168.3.2 ------ 192.168.3.1
                                          |                    |
                                          +--------------------+

#X 参考情報
Linuxで作るファイアウォール

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?