0 はじめに

「traceroute/tracepathコマンドの使い方(工事中)」は、ここ(private)に移動しました。
あたらめて、「tracerouteコマンドの使い方」というタイトルで記事を作成しました。

1 traceroute コマンドとは?

あるホストから別のホストまでのネットワーク経路をリスト表示するコマンドです。

2 環境

VMware Workstation 14 Playerでゲストマシン(1台)を作成しました。

2.1 ゲストマシン

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

[root@centos74 ~]# uname -r
3.10.0-693.el7.x86_64

2.2 ネットワーク環境

tracerouteコマンドの使い方を確認するため、ネットワークネームスペースを使って、
ゲストマシン上に下記のネットワークを構築しました。
文末に示したシェルスクリプトを実行することで、下記ネットワークを構築することができます。
h1,h2はホスト、r1,r2はルータです。ネットワークは、下記のとおり3つあります。

 +-------------------------------- Guest Machine(CentOS7.4) ---------------------------------+
 |                                                                                           |
 |                                                                                           |
 |          192.168.100.0/24             192.168.110.0/24            192.168.120.0/24        |
 |                                                                                           |
 | +-- h1 --+             +----- r1 -----+            +----- r2 -----+            +-- h2 --+ |
 | |        |             |              |            |              |            |        | |
 | |   veth1-h1 -------- veth1-r1  veth2-r1 -------- veth1-r2  veth2-r2 -------- veth1-h2  | |
 | |        | .10     .20 |              | .10    .20 |              |.10     .20 |        | |
 | +--------+             +--------------+            +--------------+            +--------+ |
 |                                                                                           |
 |                                                                                           |
 +-------------------------------------------------------------------------------------------+

2.3 インタフェースの確認

環境構築後のインタフェースを以下に示します。

ホスト1(h1)
[root@centos74 ~]# ip netns exec h1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth1-h1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 92:a3:bd:f2:8e:9b brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 192.168.100.10/24 scope global veth1-h1
       valid_lft forever preferred_lft forever
    inet6 fe80::90a3:bdff:fef2:8e9b/64 scope link
       valid_lft forever preferred_lft forever
ルータ1(r1)
[root@centos74 ~]# ip netns exec r1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: veth1-r1@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether b6:94:7a:46:e8:71 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.100.20/24 scope global veth1-r1
       valid_lft forever preferred_lft forever
    inet6 fe80::b494:7aff:fe46:e871/64 scope link
       valid_lft forever preferred_lft forever
6: veth2-r1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP qlen 1000
    link/ether 26:84:4e:d2:6c:ce brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet 192.168.110.10/24 scope global veth2-r1
       valid_lft forever preferred_lft forever
    inet6 fe80::2484:4eff:fed2:6cce/64 scope link
       valid_lft forever preferred_lft forever
ルータ2(r2)
[root@centos74 ~]# ip netns exec r2 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1-r2@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP qlen 1000
    link/ether c6:61:5e:c4:d8:f7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.110.20/24 scope global veth1-r2
       valid_lft forever preferred_lft forever
    inet6 fe80::c461:5eff:fec4:d8f7/64 scope link
       valid_lft forever preferred_lft forever
8: veth2-r2@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 6a:d9:50:ac:d3:34 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet 192.168.120.10/24 scope global veth2-r2
       valid_lft forever preferred_lft forever
    inet6 fe80::68d9:50ff:feac:d334/64 scope link
       valid_lft forever preferred_lft forever
ホスト2(h2)
[root@centos74 ~]# ip netns exec h2 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
7: veth1-h2@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether c6:d7:b7:7a:31:bf brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.120.20/24 scope global veth1-h2
       valid_lft forever preferred_lft forever
    inet6 fe80::c4d7:b7ff:fe7a:31bf/64 scope link
       valid_lft forever preferred_lft forever

2.4 ルーティングテーブルの確認

環境構築後のルーティングテーブルを以下に示します。

ホスト1(h1)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# ip r
192.168.100.0/24 dev veth1-h1 proto kernel scope link src 192.168.100.10
192.168.110.0/24 via 192.168.100.20 dev veth1-h1
192.168.120.0/24 via 192.168.100.20 dev veth1-h1
ルータ1(r1)
[root@centos74 ~]# ip netns exec r1 bash
[root@centos74 ~]# ip r
192.168.100.0/24 dev veth1-r1 proto kernel scope link src 192.168.100.20
192.168.110.0/24 dev veth2-r1 proto kernel scope link src 192.168.110.10
192.168.120.0/24 via 192.168.110.20 dev veth2-r1
ルータ2(r2)
[root@centos74 ~]# ip netns exec r2 bash
[root@centos74 ~]# ip r
192.168.100.0/24 via 192.168.110.10 dev veth1-r2
192.168.110.0/24 dev veth1-r2 proto kernel scope link src 192.168.110.20
192.168.120.0/24 dev veth2-r2 proto kernel scope link src 192.168.120.10
ホスト2(h2)
[root@centos74 ~]# ip netns exec h2 bash
[root@centos74 ~]# ip r
192.168.100.0/24 via 192.168.120.10 dev veth1-h2
192.168.110.0/24 via 192.168.120.10 dev veth1-h2
192.168.120.0/24 dev veth1-h2 proto kernel scope link src 192.168.120.20

3 インストール方法

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

4 オプション一覧

ここでは、IPv4のみの確認をします。
また、-qオプション、-Nオプションともに1を指定して確認を行います。
理由は、tcpdumpでパケットを確認するさい、確認するパケットの数を減らすためです。

[root@centos74 ~]# traceroute --help
Usage:
  traceroute [ -46dFITnreAUDV ] [ -f first_ttl ] [ -g gate,... ] [ -i device ] [ -m max_ttl ] [ -N squeries ] [ -p port ] [ -t tos ] [ -l flow_label ] [ -w waittime ] [ -q nqueries ] [ -s src_addr ] [ -z sendwait ] [ --fwmark=num ] host [ packetlen ]
Options:
  -4                          Use IPv4
  -6                          Use IPv6
  -d  --debug                 Enable socket level debugging
  -F  --dont-fragment         Do not fragment packets
  -f first_ttl  --first=first_ttl
                              Start from the first_ttl hop (instead from 1)
  -g gate,...  --gateway=gate,...
                              Route packets through the specified gateway
                              (maximum 8 for IPv4 and 127 for IPv6)
  -I  --icmp                  Use ICMP ECHO for tracerouting
  -T  --tcp                   Use TCP SYN for tracerouting (default port is 80)
  -i device  --interface=device
                              Specify a network interface to operate with
  -m max_ttl  --max-hops=max_ttl
                              Set the max number of hops (max TTL to be
                              reached). Default is 30
  -N squeries  --sim-queries=squeries
                              Set the number of probes to be tried
                              simultaneously (default is 16)
  -n                          Do not resolve IP addresses to their domain names
  -p port  --port=port        Set the destination port to use. It is either
                              initial udp port value for "default" method
                              (incremented by each probe, default is 33434), or
                              initial seq for "icmp" (incremented as well,
                              default from 1), or some constant destination
                              port for other methods (with default of 80 for
                              "tcp", 53 for "udp", etc.)
  -t tos  --tos=tos           Set the TOS (IPv4 type of service) or TC (IPv6
                              traffic class) value for outgoing packets
  -l flow_label  --flowlabel=flow_label
                              Use specified flow_label for IPv6 packets
  -w waittime  --wait=waittime
                              Set the number of seconds to wait for response to
                              a probe (default is 5.0). Non-integer (float
                              point) values allowed too
  -q nqueries  --queries=nqueries
                              Set the number of probes per each hop. Default is
                              3
  -r                          Bypass the normal routing and send directly to a
                              host on an attached network
  -s src_addr  --source=src_addr
                              Use source src_addr for outgoing packets
  -z sendwait  --sendwait=sendwait
                              Minimal time interval between probes (default 0).
                              If the value is more than 10, then it specifies a
                              number in milliseconds, else it is a number of
                              seconds (float point values allowed too)
  -e  --extensions            Show ICMP extensions (if present), including MPLS
  -A  --as-path-lookups       Perform AS path lookups in routing registries and
                              print results directly after the corresponding
                              addresses
  -M name  --module=name      Use specified module (either builtin or external)
                              for traceroute operations. Most methods have
                              their shortcuts (`-I' means `-M icmp' etc.)
  -O OPTS,...  --options=OPTS,...
                              Use module-specific option OPTS for the
                              traceroute module. Several OPTS allowed,
                              separated by comma. If OPTS is "help", print info
                              about available options
  --sport=num                 Use source port num for outgoing packets. Implies
                              `-N 1'
  --fwmark=num                Set firewall mark for outgoing packets
  -U  --udp                   Use UDP to particular port for tracerouting
                              (instead of increasing the port per each probe),
                              default port is 53
  -UL                         Use UDPLITE for tracerouting (default dest port
                              is 53)
  -D  --dccp                  Use DCCP Request for tracerouting (default port
                              is 33434)
  -P prot  --protocol=prot    Use raw packet of protocol prot for tracerouting
  --mtu                       Discover MTU along the path being traced. Implies
                              `-F -N 1'
  --back                      Guess the number of hops in the backward path and
                              print if it differs
  -V  --version               Print version info and exit
  --help                      Read this help and exit

Arguments:
+     host          The host to traceroute to
      packetlen     The full packet length (default is the length of an IP
                    header plus 40). Can be ignored or increased to a minimal
                    allowed value

5 ICMPパケットを使って経路を調べる方法(-I)

ホスト1からホスト2(veth1-h2)への経路を調べてみます。
ルータ1,ルータ2,ホスト2のインタフェースのIPアドレスが表示されていることがわかります。

ターミナル1(ホスト1からホスト2への経路情報)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# traceroute -N 1 -q 1 -I 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 60 byte packets
 1  192.168.100.20 (192.168.100.20)  0.060 ms
 2  192.168.110.20 (192.168.110.20)  0.049 ms
 3  192.168.120.20 (192.168.120.20)  0.039 ms

tracerouteコマンド実行時、ホスト1で採取したtcpdumpを以下に示します。

ターミナル2(ホスト1で採取したtcpdump)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# tcpdump -i veth1-h1 icmp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h1, link-type EN10MB (Ethernet), capture size 262144 bytes
19:10:43.479425 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1505, seq 1, length 40
19:10:43.479536 IP 192.168.100.20 > 192.168.100.10: ICMP time exceeded in-transit, length 68
19:10:43.483949 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1505, seq 2, length 40
19:10:43.484302 IP 192.168.110.20 > 192.168.100.10: ICMP time exceeded in-transit, length 68
19:10:43.485150 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1505, seq 3, length 40
19:10:43.485327 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 1505, seq 3, length 40

6 TCPパケットを使って経路を調べる方法(-T)

6.1 デフォルトのポート番号(80)を使う方法

ホスト1からホスト2(veth1-h2)への経路を調べてみます。
ルータ1,ルータ2,ホスト2のインタフェースのIPアドレスが表示されていることがわかります。

ターミナル1(ホスト1からホスト2への経路情報)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# traceroute -N 1 -q 1 -T 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 44 byte packets
 1  192.168.100.20 (192.168.100.20)  0.147 ms
 2  192.168.110.20 (192.168.110.20)  0.268 ms
 3  192.168.120.20 (192.168.120.20)  0.225 ms

tracerouteコマンド実行時、ホスト1で採取したtcpdumpを以下に示します。
TCP SYNパケットをポート番号80に対して送信していることがわかります。
ホスト2で80番ポートをListenしているプロセスがいないため、ホスト2からホスト1に対して、
TCP RSTパケットが送信されていることもわかります。

ターミナル2(ホスト1で採取したtcpdump)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# tcpdump -i veth1-h1 tcp or icmp -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h1, link-type EN10MB (Ethernet), capture size 262144 bytes
19:24:36.935351 IP 192.168.100.10.41618 > 192.168.120.20.80: Flags [S], seq 940770829, win 5840, options [mss 1460], length 0
19:24:36.935450 IP 192.168.100.20 > 192.168.100.10: ICMP time exceeded in-transit, length 52
19:24:36.938860 IP 192.168.100.10.59934 > 192.168.120.20.80: Flags [S], seq 4290686973, win 5840, options [mss 1460], length 0
19:24:36.939081 IP 192.168.110.20 > 192.168.100.10: ICMP time exceeded in-transit, length 52
19:24:36.940216 IP 192.168.100.10.44787 > 192.168.120.20.80: Flags [S], seq 3853841102, win 5840, options [mss 1460], length 0
19:24:36.940360 IP 192.168.120.20.80 > 192.168.100.10.44787: Flags [R.], seq 0, ack 3853841103, win 0, length 0

6.2 ポート番号を指定する方法(-p)

ターミナル1(ホスト1からホスト2への経路情報)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# traceroute -N 1 -q 1 -p 11111 -T 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 44 byte packets
 1  192.168.100.20 (192.168.100.20)  0.139 ms
 2  192.168.110.20 (192.168.110.20)  0.276 ms
 3  192.168.120.20 (192.168.120.20)  0.262 ms

tracerouteコマンド実行時、ホスト1で採取したtcpdumpを以下に示します。
TCP SYNパケットをポート番号11111に対して送信していることがわかります。

ターミナル2(ホスト1で採取したtcpdump)
[root@centos74 ~]# tcpdump -i veth1-h1 udp or tcp or icmp -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h1, link-type EN10MB (Ethernet), capture size 262144 bytes
22:05:53.471339 IP 192.168.100.10.56260 > 192.168.120.20.11111: Flags [S], seq 1586934308, win 5840, options [mss 1460], length 0
22:05:53.471435 IP 192.168.100.20 > 192.168.100.10: ICMP time exceeded in-transit, length 52
22:05:53.475273 IP 192.168.100.10.41961 > 192.168.120.20.11111: Flags [S], seq 3797844709, win 5840, options [mss 1460], length 0
22:05:53.475389 IP 192.168.110.20 > 192.168.100.10: ICMP time exceeded in-transit, length 52
22:05:53.475976 IP 192.168.100.10.57420 > 192.168.120.20.11111: Flags [S], seq 1162074057, win 5840, options [mss 1460], length 0
22:05:53.476163 IP 192.168.120.20.11111 > 192.168.100.10.57420: Flags [R.], seq 0, ack 1162074058, win 0, length 0

7 UDPパケットを使って経路を調べる方法(-U)

ホスト1からホスト2(veth1-h2)への経路を調べてみます。
ルータ1,ルータ2,ホスト2のインタフェースのIPアドレスが表示されていることがわかります。

ターミナル1(ホスト1からホスト2への経路情報)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# traceroute -N 1 -q 1 -U 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 60 byte packets
 1  192.168.100.20 (192.168.100.20)  0.155 ms
 2  192.168.110.20 (192.168.110.20)  0.134 ms
 3  192.168.120.20 (192.168.120.20)  0.267 ms

tracerouteコマンド実行時、ホスト1で採取したtcpdumpを以下に示します。
UDPパケットをポート番号53に対して送信していることがわかります。

ターミナル2(ホスト1で採取したtcpdump)
[root@centos74 ~]# tcpdump -i veth1-h1 udp or icmp -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h1, link-type EN10MB (Ethernet), capture size 262144 bytes
19:59:40.677547 IP 192.168.100.10.44803 > 192.168.120.20.53: 16449 op8 [b2&3=0x4243] [17991a] [17477q] [18505n] [19019au][|domain]
19:59:40.677576 IP 192.168.100.20 > 192.168.100.10: ICMP time exceeded in-transit, length 68
19:59:40.679280 IP 192.168.100.10.53659 > 192.168.120.20.53: 16449 op8 [b2&3=0x4243] [17991a] [17477q] [18505n] [19019au][|domain]
19:59:40.679344 IP 192.168.110.20 > 192.168.100.10: ICMP time exceeded in-transit, length 68
19:59:40.679582 IP 192.168.100.10.46213 > 192.168.120.20.53: 16449 op8 [b2&3=0x4243] [17991a] [17477q] [18505n] [19019au][|domain]
19:59:40.679663 IP 192.168.120.20 > 192.168.100.10: ICMP 192.168.120.20 udp port 53 unreachable, length 68

8 インタフェースを指定する方法(-i)

ここでは、ルータ1からホスト2に対する経路を調べてみます。

ルータ1からホスト2への経路情報
[root@centos74 ~]# ip netns exec r1 bash
[root@centos74 ~]# traceroute -N 1 -q 1 -i veth2-r1 -I 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 60 byte packets
 1  192.168.110.20 (192.168.110.20)  0.086 ms
 2  192.168.120.20 (192.168.120.20)  0.086 ms

9 経路上のMTUを調べる方法(--mtu)

mtuオプションを使うと、宛先までの経路上で最小のMTUを調べることができます。
なお、mtuオプションを使う場合、-F,-Nオプションも同時に指定します。

9.1 MTU変更前

MTU変更前の構成
全てのリンクでMTUが1500になっています。
        MTU=1500         MTU=1500          MTU=1500
   h1 ------------- r1 ------------- r2 ------------- h2
実行結果
tracerouteを実行する。ホスト1からホスト2への経路上のMTUが1500であることがわかる。
[root@centos74 ~]# traceroute -N 1 -q 1 -F --mtu -I 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 65000 byte packets
 1  192.168.100.20 (192.168.100.20)  0.172 ms F=1500
 2  192.168.110.20 (192.168.110.20)  0.141 ms
 3  192.168.120.20 (192.168.120.20)  0.270 ms

9.2 MTU変更後(その1)

ルータ1とルータ2の間のMTUを1500から1000に変更します。

ルータ1のMTU変更方法
[root@centos74 ~]# ip netns exec r1 bash
[root@centos74 ~]# ip l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: veth1-r1@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether b6:94:7a:46:e8:71 brd ff:ff:ff:ff:ff:ff link-netnsid 0
6: veth2-r1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu ★1500 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether 26:84:4e:d2:6c:ce brd ff:ff:ff:ff:ff:ff link-netnsid 2

[root@centos74 ~]# ip link set veth2-r1 mtu 1000
[root@centos74 ~]# ip l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: veth1-r1@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether b6:94:7a:46:e8:71 brd ff:ff:ff:ff:ff:ff link-netnsid 0
6: veth2-r1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu ★1000 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether 26:84:4e:d2:6c:ce brd ff:ff:ff:ff:ff:ff link-netnsid 2
ルータ2のMTU変更方法
[root@centos74 ~]# ip netns exec r2 bash
[root@centos74 ~]# ip l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1-r2@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu ★1500 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether c6:61:5e:c4:d8:f7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
8: veth2-r2@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether 6a:d9:50:ac:d3:34 brd ff:ff:ff:ff:ff:ff link-netnsid 2

[root@centos74 ~]# ip link set veth1-r2 mtu 1000
[root@centos74 ~]# ip l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1-r2@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu ★1000 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether c6:61:5e:c4:d8:f7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
8: veth2-r2@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether 6a:d9:50:ac:d3:34 brd ff:ff:ff:ff:ff:ff link-netnsid 2

MTU変更後の構成を以下に示します。r1,r2間のMTUが1000になっています。

MTU変更後の構成
        MTU=1500         MTU=1000          MTU=1500
   h1 ------------- r1 ------------- r2 ------------- h2
実行結果
tracerouteを実行する。ホスト1からホスト2への経路上の最小のMTUが1000であることがわかる。
[root@centos74 ~]# traceroute -N 1 -q 1 -F --mtu -I 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 65000 byte packets
 1  192.168.100.20 (192.168.100.20)  0.105 ms F=1500
 2  192.168.110.20 (192.168.110.20)  0.053 ms F=1000
 3  192.168.120.20 (192.168.120.20)  0.157 ms

9.3 MTU変更後(その2)

さらに、ルータ2とホスト2の間のMTUを1500から500に変更します。
MTU変更後の構成を以下に示します。r2,h2間のMTUが500になっています。

MTU変更後の構成
        MTU=1500         MTU=1000          MTU=500
   h1 ------------- r1 ------------- r2 ------------- h2

以下にtracerouteの実行結果を示します。宛先ホストまでの経路上で、MTUの最小値が500であることがわかります。

実行結果
[root@centos74 ~]# traceroute -N 1 -q 1 -I -F --mtu 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 65000 byte packets
 1  192.168.100.20 (192.168.100.20)  0.208 ms F=1500
 2  192.168.110.20 (192.168.110.20)  0.080 ms F=1000
 3  192.168.120.20 (192.168.120.20)  0.058 ms F=500

10 パケットの送信間隔を指定する方法(-w)

「パケットの送信間隔」とは、ICMP time exceededパケットを受信できなかった場合(*)
次の探査用パケットを送信するまでの待ち時間を表します。デフォルトは5秒です。
(*) たとえば、途中のルータがICMPパケットのルーティングを禁止にしているような場合

10.1 デフォルト時の挙動

ルータ1でICMPパケットのルーティングを禁止にします。

ターミナル1(事前準備)
[root@centos74 ~]# ip netns exec r1 bash
[root@centos74 ~]# iptables -A FORWARD -p icmp -j DROP
[root@centos74 ~]# iptables -nvL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0

ホスト1からホスト2に対してtracerouteを実行します。ICMPを使ってみます。

ターミナル2(traceroute実行結果)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# traceroute -N 1 -q 1 -I 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 60 byte packets
 1  192.168.100.20 (192.168.100.20)  0.110 ms
 2  *
 3  *
 4  *
 5  *^C

以下にtcpdumpの実行結果を示します。
ICMP echo requestパケットの送信間隔が5秒であることがわかります。

ターミナル3(tcpdump実行結果)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# tcpdump -i veth1-h1 icmp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h1, link-type EN10MB (Ethernet), capture size 262144 bytes
17:08:23.865624 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1563, seq 1, length 40
17:08:23.865707 IP 192.168.100.20 > 192.168.100.10: ICMP time exceeded in-transit, length 68
17:08:23.867909 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1563, seq 2, length 40
17:08:28.876759 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1563, seq 3, length 40
17:08:33.883364 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1563, seq 4, length 40
17:08:38.890258 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1563, seq 5, length 40
17:08:43.897061 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1563, seq 6, length 40
ターミナル1(iptables実行結果)
[root@centos74 ~]# iptables -nvL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    5   300 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0

10.2 オプション指定時の挙動

ルータ1でICMPパケットのルーティングを禁止にします。

ターミナル1(事前準備)
[root@centos74 ~]# ip netns exec r1 bash
[root@centos74 ~]# iptables -A FORWARD -p icmp -j DROP
[root@centos74 ~]# iptables -nvL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0

ホスト1からホスト2に対してtracerouteを実行します。送信間隔(-w)は1秒を指定してみます。

ターミナル2(traceroute実行結果)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# traceroute -N 1 -q 1 -w 1 -I 192.168.120.20
traceroute to 192.168.120.20 (192.168.120.20), 30 hops max, 60 byte packets
 1  192.168.100.20 (192.168.100.20)  0.160 ms
 2  *
 3  *
 4  *
 5  *^C

以下にtcpdumpの実行結果を示します。
ICMP echo requestパケットの送信間隔が1秒であることがわかります。

ターミナル3(tcpdump実行結果)
[root@centos74 ~]# ip netns exec h1 bash
[root@centos74 ~]# tcpdump -i veth1-h1 icmp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h1, link-type EN10MB (Ethernet), capture size 262144 bytes
17:36:09.320104 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1626, seq 1, length 40
17:36:09.320232 IP 192.168.100.20 > 192.168.100.10: ICMP time exceeded in-transit, length 68
17:36:09.321947 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1626, seq 2, length 40
17:36:10.325672 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1626, seq 3, length 40
17:36:11.328355 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1626, seq 4, length 40
17:36:12.331095 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1626, seq 5, length 40
17:36:13.334003 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 1626, seq 6, length 40
ターミナル1(iptables実行結果)
[root@centos74 ~]# iptables -nvL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    5   300 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0

Y 環境構築用シェル

シェルの内容
[root@centos74 ~]# cat net.sh
#!/usr/bin/bash
ip netns add h1
ip netns add h2
ip netns add r1
ip netns add r2

ip link add name veth1-h1 type veth peer name veth1-r1
ip link add name veth2-r1 type veth peer name veth1-r2
ip link add name veth2-r2 type veth peer name veth1-h2

ip link set veth1-h1 netns h1
ip link set veth1-r1 netns r1
ip link set veth2-r1 netns r1
ip link set veth1-r2 netns r2
ip link set veth2-r2 netns r2
ip link set veth1-h2 netns h2

ip netns exec h1 ip addr add 192.168.100.10/24 dev veth1-h1
ip netns exec r1 ip addr add 192.168.100.20/24 dev veth1-r1
ip netns exec r1 ip addr add 192.168.110.10/24 dev veth2-r1
ip netns exec r2 ip addr add 192.168.110.20/24 dev veth1-r2
ip netns exec r2 ip addr add 192.168.120.10/24 dev veth2-r2
ip netns exec h2 ip addr add 192.168.120.20/24 dev veth1-h2

ip netns exec h1 ip link set veth1-h1 up
ip netns exec r1 ip link set veth1-r1 up
ip netns exec r1 ip link set veth2-r1 up
ip netns exec r2 ip link set veth1-r2 up
ip netns exec r2 ip link set veth2-r2 up
ip netns exec h2 ip link set veth1-h2 up


ip netns exec h1 ip route add 192.168.110.0/24 via 192.168.100.20 dev veth1-h1
ip netns exec h1 ip route add 192.168.120.0/24 via 192.168.100.20 dev veth1-h1
ip netns exec r1 ip route add 192.168.120.0/24 via 192.168.110.20 dev veth2-r1
ip netns exec r2 ip route add 192.168.100.0/24 via 192.168.110.10 dev veth1-r2
ip netns exec h2 ip route add 192.168.100.0/24 via 192.168.120.10 dev veth1-h2
ip netns exec h2 ip route add 192.168.110.0/24 via 192.168.120.10 dev veth1-h2

ip netns exec r1 sysctl -w net.ipv4.ip_forward=1
ip netns exec r2 sysctl -w net.ipv4.ip_forward=1
環境構築方法
[root@centos74 ~]# chmod 744 net.sh
[root@centos74 ~]# ./net.sh

ネームスペースを確認する。シェルを実行すると、下記4つのネームスペースができます。
[root@centos74 ~]# ip netns list
r2
r1 (id: 1)
h2
h1
環境削除方法
[root@centos74 ~]# ip -all netns del
[root@centos74 ~]# ip netns list
[root@centos74 ~]#

Z 参考情報

ip netnsコマンドの使い方
traceroute(tracert)~ネットワークの経路を調査する

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.