#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で作るファイアウォール