hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

tracerouteコマンドの使い方



1 tracerouteコマンドとは?

あるホストから別ホストまでに経由するルータのインタフェースのIPアドレスを表示するコマンドです。

具体的に説明すると次のようになります。
host1で宛先をhost2にしてtracerouteコマンドを実行すると、eth2,eth4,eth6のIPアドレスが表示されます。なお、router1,router2はルータです。ethX(X=1,..,6)はNICを表します。

host1(eth1) ------ (eth2)router1(eth3) ------ (eth4)router2(eth5) ------ (eth6)host2

2 検証環境

2.1 CentrOS版数

CentOS版数は次のとおりです。

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

2.2 カーネル版数

カーネル版数は次のとおりです。

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

2.3 ネットワーク構成

検証環境のネットワーク構成は以下のとおりです。ネットワークネームスペースを使って、仮想マシンに下記のネットワークを構築しました。h1,h2はホスト、r1,r2はルータです。ネットワークは、下記のとおり3つあります。ネットワークネームスペースの使い方は、ip netnsコマンドの使い方(ネットワークの実験の幅が広がるなぁ~) - hana_shinのLinux技術ブログを参照してください。

 +-------------------------------- Guest Machine(CentOS7.9) ---------------------------------+
 |                                                                                           |
 |                                                                                           |
 |          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.4 ホスト、ルータのインタフェース確認

ホスト1(h1)

ホスト1のインタフェースを確認します。

[root@server ~]# ip netns exec h1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: veth1-h1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 32:6c:4f:92:07:7e 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::306c:4fff:fe92:77e/64 scope link
       valid_lft forever preferred_lft forever
ルータ1(r1)

ルータ1のインタフェースを確認します。

[root@server ~]# ip netns exec r1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1-r1@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 46:c5:de:a4:ac:44 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::44c5:deff:fea4:ac44/64 scope link
       valid_lft forever preferred_lft forever
8: veth2-r1@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 5e:67:6b:ee:23:2c 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::5c67:6bff:feee:232c/64 scope link
       valid_lft forever preferred_lft forever
ルータ2(r2)

ルータ2のインタフェースを確認します。

[root@server ~]# ip netns exec r2 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
7: veth1-r2@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 16:2d:f8:47:7a:5a 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::142d:f8ff:fe47:7a5a/64 scope link
       valid_lft forever preferred_lft forever
10: veth2-r2@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether e6:3e:75:6f:4c:8e 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::e43e:75ff:fe6f:4c8e/64 scope link
       valid_lft forever preferred_lft forever
ホスト2(h2)

ホスト2のインタフェースを確認します。

[root@server ~]# ip netns exec h2 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
9: veth1-h2@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 4e:b3:e9:50:c8:f3 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::4cb3:e9ff:fe50:c8f3/64 scope link
       valid_lft forever preferred_lft forever

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

ルータのルーティングテーブルを確認してみます。

ルータ1(r1)
[root@server ~]# ip netns exec r1 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@server ~]# ip netns exec r2 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

3 インストール方法

tracerouteパッケージをインストールします。

[root@server ~]# yum -y install traceroute

tracerouteコマンドの版数を確認します。

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

4 オプション一覧

[root@server ~]# 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 検証環境における疎通確認

ホスト1からホスト2に対してpingを実行してみます。まず、ホストに1入ります。

[root@server ~]# ip netns exec h1 bash

ホスト1のインタフェースを確認します。

[root@server ~]# ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: veth1-h1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 32:6c:4f:92:07:7e 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::306c:4fff:fe92:77e/64 scope link
       valid_lft forever preferred_lft forever

ホスト2に対してpingを1回実行します。
なお、pingの使い方は、pingコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# ping -c 1 192.168.120.20
PING 192.168.120.20 (192.168.120.20) 56(84) bytes of data.
64 bytes from 192.168.120.20: icmp_seq=1 ttl=62 time=0.509 ms

--- 192.168.120.20 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.509/0.509/0.509/0.000 ms

このとき、ルータ2でtcpdumpを実行します。
以下のように、ホスト1からホスト2へのICMP echo requestパケット、ホスト2からホスト1へのICMP echo replyパケットが出力されていることがわかります。なお、tcpdumpの使い方は、tcpdumpの使い方(基本編) - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# tcpdump -i veth2-r2 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth2-r2, link-type EN10MB (Ethernet), capture size 262144 bytes
21:42:32.513620 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 2517, seq 1, length 64
21:42:32.513683 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 2517, seq 1, length 64

最後に、ホスト2でtcpdumpを実行します。
以下のように、ホスト1からホスト2へのICMP echo requestパケット、ホスト2からホスト1へのICMP echo replyパケットが出力されていることがわかります。

[root@server ~]# tcpdump -i veth1-h2 icmp -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h2, link-type EN10MB (Ethernet), capture size 262144 bytes
21:48:40.394730 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 2626, seq 1, length 64
21:48:40.394756 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 2626, seq 1, length 64

6 基本的な使い方

宛先IPアドレスを指定してコマンドを実行します。ルータ1、ルータ2を経由してホスト2に到達していることがわかります。

[root@server ~]# traceroute 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.075 ms  0.027 ms  0.017 ms
 2  192.168.110.20 (192.168.110.20)  0.040 ms  0.026 ms  0.026 ms
 3  192.168.120.20 (192.168.120.20)  0.048 ms  0.037 ms  0.037 ms

この時、tracerouteがどのようなパケットを使って経路を調べているのかを確認してみます。
ホスト2でtcpdumpコマンドを実行します。宛先に対してUDPパケットを送信していることがわかります。宛先ではUDPパケットの宛先で待ち受けるプロセスがいないので、ICMPのudp port unreachableメッセージが返信されていることがわかります。

[root@server ~]# tcpdump -i veth1-h2 -nn
22:02:42.520859 IP 192.168.100.10.49558 > 192.168.120.20.33440: UDP, length 32
22:02:42.520890 IP 192.168.120.20 > 192.168.100.10: ICMP 192.168.120.20 udp port 33440 unreachable, length 68
22:02:42.521056 IP 192.168.100.10.35204 > 192.168.120.20.33441: UDP, length 32
22:02:42.521092 IP 192.168.120.20 > 192.168.100.10: ICMP 192.168.120.20 udp port 33441 unreachable, length 68
22:02:42.521245 IP 192.168.100.10.47681 > 192.168.120.20.33442: UDP, length 32
22:02:42.521290 IP 192.168.120.20 > 192.168.100.10: ICMP 192.168.120.20 udp port 33442 unreachable, length 68
22:02:42.521338 IP 192.168.100.10.39878 > 192.168.120.20.33443: UDP, length 32
22:02:42.521348 IP 192.168.120.20 > 192.168.100.10: ICMP 192.168.120.20 udp port 33443 unreachable, length 68
22:02:42.521406 IP 192.168.100.10.44577 > 192.168.120.20.33444: UDP, length 32
22:02:42.521423 IP 192.168.120.20 > 192.168.100.10: ICMP 192.168.120.20 udp port 33444 unreachable, length 68
22:02:42.521483 IP 192.168.100.10.59295 > 192.168.120.20.33445: UDP, length 32
22:02:42.521494 IP 192.168.120.20 > 192.168.100.10: ICMP 192.168.120.20 udp port 33445 unreachable, length 68
22:02:42.521551 IP 192.168.100.10.56743 > 192.168.120.20.33446: UDP, length 32
22:02:42.521655 IP 192.168.100.10.37366 > 192.168.120.20.33447: UDP, length 32
22:02:42.521755 IP 192.168.100.10.35610 > 192.168.120.20.33448: UDP, length 32
22:02:42.521808 IP 192.168.100.10.59687 > 192.168.120.20.33449: UDP, length 32

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

[root@server ~]# traceroute -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.062 ms  0.013 ms  0.009 ms
 2  192.168.110.20 (192.168.110.20)  0.075 ms  0.021 ms  0.017 ms
 3  192.168.120.20 (192.168.120.20)  0.032 ms  0.020 ms  0.019 ms

ホスト2でtcpdumpコマンドを実行します。ICMPパケットを使っていることがわかります。

[root@server ~]# tcpdump -i veth1-h2 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h2, link-type EN10MB (Ethernet), capture size 262144 bytes
22:24:42.625108 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 7, length 40
22:24:42.625135 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 7, length 40
22:24:42.625173 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 8, length 40
22:24:42.625183 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 8, length 40
22:24:42.625218 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 9, length 40
22:24:42.625227 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 9, length 40
22:24:42.625260 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 10, length 40
22:24:42.625271 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 10, length 40
22:24:42.625300 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 11, length 40
22:24:42.625309 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 11, length 40
22:24:42.625342 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 12, length 40
22:24:42.625351 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 12, length 40
22:24:42.625387 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 13, length 40
22:24:42.625473 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 13, length 40
22:24:42.625534 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 14, length 40
22:24:42.625546 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 14, length 40
22:24:42.625580 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 15, length 40
22:24:42.625590 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 15, length 40
22:24:42.625626 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 16, length 40
22:24:42.625637 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 16, length 40
22:24:42.628560 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 17, length 40
22:24:42.628616 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 17, length 40
22:24:42.628695 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 18, length 40
22:24:42.628711 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 18, length 40
22:24:42.628763 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 19, length 40
22:24:42.628774 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 19, length 40
22:24:42.629134 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 20, length 40
22:24:42.629201 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 20, length 40
22:24:42.629273 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 21, length 40
22:24:42.629284 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 21, length 40
22:24:42.629334 IP 192.168.100.10 > 192.168.120.20: ICMP echo request, id 3097, seq 22, length 40
22:24:42.629351 IP 192.168.120.20 > 192.168.100.10: ICMP echo reply, id 3097, seq 22, length 40

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

8.1 デフォルトの場合

[root@server ~]# traceroute -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.067 ms  0.021 ms  0.017 ms
 2  192.168.110.20 (192.168.110.20)  0.037 ms  0.026 ms  0.025 ms
 3  192.168.120.20 (192.168.120.20)  0.060 ms  0.042 ms  0.041 ms

ホスト2でtcpdumpコマンドを実行します。TCPパケットを使っていることがわかります。宛先ポート番号は80番を使用していることがわかります。

[root@server ~]# tcpdump -i veth1-h2 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h2, link-type EN10MB (Ethernet), capture size 262144 bytes
22:27:34.775300 IP 192.168.100.10.39005 > 192.168.120.20.80: Flags [S], seq 79980328, win 5840, options [mss 1460], length 0
22:27:34.775326 IP 192.168.120.20.80 > 192.168.100.10.39005: Flags [R.], seq 0, ack 79980329, win 0, length 0
22:27:34.775387 IP 192.168.100.10.47157 > 192.168.120.20.80: Flags [S], seq 232901152, win 5840, options [mss 1460], length 0
22:27:34.775398 IP 192.168.120.20.80 > 192.168.100.10.47157: Flags [R.], seq 0, ack 232901153, win 0, length 0
22:27:34.775453 IP 192.168.100.10.58819 > 192.168.120.20.80: Flags [S], seq 2903372801, win 5840, options [mss 1460], length 0
22:27:34.775463 IP 192.168.120.20.80 > 192.168.100.10.58819: Flags [R.], seq 0, ack 2903372802, win 0, length 0
22:27:34.775520 IP 192.168.100.10.47148 > 192.168.120.20.80: Flags [S], seq 2462323147, win 5840, options [mss 1460], length 0
22:27:34.775531 IP 192.168.120.20.80 > 192.168.100.10.47148: Flags [R.], seq 0, ack 2462323148, win 0, length 0
22:27:34.775669 IP 192.168.100.10.45926 > 192.168.120.20.80: Flags [S], seq 3788273711, win 5840, options [mss 1460], length 0
22:27:34.775684 IP 192.168.120.20.80 > 192.168.100.10.45926: Flags [R.], seq 0, ack 3788273712, win 0, length 0
22:27:34.775760 IP 192.168.100.10.55775 > 192.168.120.20.80: Flags [S], seq 398808910, win 5840, options [mss 1460], length 0
22:27:34.775771 IP 192.168.120.20.80 > 192.168.100.10.55775: Flags [R.], seq 0, ack 398808911, win 0, length 0
22:27:34.775828 IP 192.168.100.10.54707 > 192.168.120.20.80: Flags [S], seq 3821878488, win 5840, options [mss 1460], length 0
22:27:34.775839 IP 192.168.120.20.80 > 192.168.100.10.54707: Flags [R.], seq 0, ack 3821878489, win 0, length 0
22:27:34.775894 IP 192.168.100.10.46160 > 192.168.120.20.80: Flags [S], seq 3832007428, win 5840, options [mss 1460], length 0
22:27:34.775906 IP 192.168.120.20.80 > 192.168.100.10.46160: Flags [R.], seq 0, ack 3832007429, win 0, length 0
22:27:34.776049 IP 192.168.100.10.39278 > 192.168.120.20.80: Flags [S], seq 734754141, win 5840, options [mss 1460], length 0
22:27:34.776081 IP 192.168.120.20.80 > 192.168.100.10.39278: Flags [R.], seq 0, ack 734754142, win 0, length 0
22:27:34.776158 IP 192.168.100.10.50904 > 192.168.120.20.80: Flags [S], seq 806679065, win 5840, options [mss 1460], length 0
22:27:34.776169 IP 192.168.120.20.80 > 192.168.100.10.50904: Flags [R.], seq 0, ack 806679066, win 0, length 0
22:27:34.779034 IP 192.168.100.10.58833 > 192.168.120.20.80: Flags [S], seq 1474654073, win 5840, options [mss 1460], length 0
22:27:34.779102 IP 192.168.120.20.80 > 192.168.100.10.58833: Flags [R.], seq 0, ack 1474654074, win 0, length 0
22:27:34.779281 IP 192.168.100.10.45807 > 192.168.120.20.80: Flags [S], seq 3609982926, win 5840, options [mss 1460], length 0
22:27:34.779327 IP 192.168.120.20.80 > 192.168.100.10.45807: Flags [R.], seq 0, ack 3609982927, win 0, length 0
22:27:34.779434 IP 192.168.100.10.50206 > 192.168.120.20.80: Flags [S], seq 736826700, win 5840, options [mss 1460], length 0
22:27:34.779479 IP 192.168.120.20.80 > 192.168.100.10.50206: Flags [R.], seq 0, ack 736826701, win 0, length 0
22:27:34.779946 IP 192.168.100.10.44705 > 192.168.120.20.80: Flags [S], seq 247997692, win 5840, options [mss 1460], length 0
22:27:34.780008 IP 192.168.120.20.80 > 192.168.100.10.44705: Flags [R.], seq 0, ack 247997693, win 0, length 0
22:27:34.780120 IP 192.168.100.10.40346 > 192.168.120.20.80: Flags [S], seq 873151949, win 5840, options [mss 1460], length 0
22:27:34.780136 IP 192.168.120.20.80 > 192.168.100.10.40346: Flags [R.], seq 0, ack 873151950, win 0, length 0
22:27:34.780219 IP 192.168.100.10.38559 > 192.168.120.20.80: Flags [S], seq 2001132989, win 5840, options [mss 1460], length 0
22:27:34.780263 IP 192.168.120.20.80 > 192.168.100.10.38559: Flags [R.], seq 0, ack 2001132990, win 0, length 0

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

宛先ポート番号に11111番を指定してみます。

[root@server ~]# traceroute -T -p 11111 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.066 ms  0.020 ms  0.017 ms
 2  192.168.110.20 (192.168.110.20)  0.037 ms  0.027 ms  0.027 ms
 3  192.168.120.20 (192.168.120.20)  0.196 ms  0.079 ms  0.120 ms

ホスト2でtcpdumpコマンドを実行します。TCPパケットを使っていることがわかります。宛先ポート番号は11111番を使用していることがわかります。

[root@server ~]# tcpdump -i veth1-h2 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1-h2, link-type EN10MB (Ethernet), capture size 262144 bytes
22:33:40.187374 IP 192.168.100.10.44234 > 192.168.120.20.11111: Flags [S], seq 2213272040, win 5840, options [mss 1460], length 0
22:33:40.187452 IP 192.168.120.20.11111 > 192.168.100.10.44234: Flags [R.], seq 0, ack 2213272041, win 0, length 0
22:33:40.187586 IP 192.168.100.10.40588 > 192.168.120.20.11111: Flags [S], seq 3008821159, win 5840, options [mss 1460], length 0
22:33:40.187604 IP 192.168.120.20.11111 > 192.168.100.10.40588: Flags [R.], seq 0, ack 3008821160, win 0, length 0
22:33:40.187697 IP 192.168.100.10.45995 > 192.168.120.20.11111: Flags [S], seq 2403028551, win 5840, options [mss 1460], length 0
22:33:40.187759 IP 192.168.120.20.11111 > 192.168.100.10.45995: Flags [R.], seq 0, ack 2403028552, win 0, length 0
22:33:40.187875 IP 192.168.100.10.49749 > 192.168.120.20.11111: Flags [S], seq 613838244, win 5840, options [mss 1460], length 0
22:33:40.187894 IP 192.168.120.20.11111 > 192.168.100.10.49749: Flags [R.], seq 0, ack 613838245, win 0, length 0
22:33:40.187997 IP 192.168.100.10.60200 > 192.168.120.20.11111: Flags [S], seq 1531172490, win 5840, options [mss 1460], length 0
22:33:40.188015 IP 192.168.120.20.11111 > 192.168.100.10.60200: Flags [R.], seq 0, ack 1531172491, win 0, length 0
22:33:40.188112 IP 192.168.100.10.44440 > 192.168.120.20.11111: Flags [S], seq 3837802404, win 5840, options [mss 1460], length 0
22:33:40.188135 IP 192.168.120.20.11111 > 192.168.100.10.44440: Flags [R.], seq 0, ack 3837802405, win 0, length 0
22:33:40.188240 IP 192.168.100.10.43531 > 192.168.120.20.11111: Flags [S], seq 3355752251, win 5840, options [mss 1460], length 0
22:33:40.188262 IP 192.168.120.20.11111 > 192.168.100.10.43531: Flags [R.], seq 0, ack 3355752252, win 0, length 0
22:33:40.188431 IP 192.168.100.10.50479 > 192.168.120.20.11111: Flags [S], seq 2990302939, win 5840, options [mss 1460], length 0
22:33:40.188489 IP 192.168.120.20.11111 > 192.168.100.10.50479: Flags [R.], seq 0, ack 2990302940, win 0, length 0
22:33:40.188610 IP 192.168.100.10.47772 > 192.168.120.20.11111: Flags [S], seq 3782716177, win 5840, options [mss 1460], length 0
22:33:40.188631 IP 192.168.120.20.11111 > 192.168.100.10.47772: Flags [R.], seq 0, ack 3782716178, win 0, length 0
22:33:40.188742 IP 192.168.100.10.38857 > 192.168.120.20.11111: Flags [S], seq 4241160201, win 5840, options [mss 1460], length 0
22:33:40.188762 IP 192.168.120.20.11111 > 192.168.100.10.38857: Flags [R.], seq 0, ack 4241160202, win 0, length 0
22:33:40.191775 IP 192.168.100.10.33212 > 192.168.120.20.11111: Flags [S], seq 1696655026, win 5840, options [mss 1460], length 0
22:33:40.191830 IP 192.168.120.20.11111 > 192.168.100.10.33212: Flags [R.], seq 0, ack 1696655027, win 0, length 0
22:33:40.191948 IP 192.168.100.10.49816 > 192.168.120.20.11111: Flags [S], seq 2405122711, win 5840, options [mss 1460], length 0
22:33:40.191960 IP 192.168.120.20.11111 > 192.168.100.10.49816: Flags [R.], seq 0, ack 2405122712, win 0, length 0
22:33:40.192051 IP 192.168.100.10.41431 > 192.168.120.20.11111: Flags [S], seq 4036894686, win 5840, options [mss 1460], length 0
22:33:40.192063 IP 192.168.120.20.11111 > 192.168.100.10.41431: Flags [R.], seq 0, ack 4036894687, win 0, length 0
22:33:40.192742 IP 192.168.100.10.51965 > 192.168.120.20.11111: Flags [S], seq 2179451662, win 5840, options [mss 1460], length 0
22:33:40.192790 IP 192.168.120.20.11111 > 192.168.100.10.51965: Flags [R.], seq 0, ack 2179451663, win 0, length 0
22:33:40.192899 IP 192.168.100.10.45209 > 192.168.120.20.11111: Flags [S], seq 47755688, win 5840, options [mss 1460], length 0
22:33:40.192910 IP 192.168.120.20.11111 > 192.168.100.10.45209: Flags [R.], seq 0, ack 47755689, win 0, length 0
22:33:40.192991 IP 192.168.100.10.43143 > 192.168.120.20.11111: Flags [S], seq 792286855, win 5840, options [mss 1460], length 0
22:33:40.193002 IP 192.168.120.20.11111 > 192.168.100.10.43143: Flags [R.], seq 0, ack 792286856, win 0, length 0

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

インタフェースが複数あるホストの場合、どのインタフェースからtracerouteコマンドのパケットを送信するかを決める必要があります。このようなときに使用するオプションです。

9.1 ルータ1の実行結果

ルータ1でtracerouteコマンドを実行します。このとき、宛先をホスト2、インタフェースをveth2-r1としてみます。

[root@server ~]# ip netns exec r1 bash

ルータ2のNICIPアドレス(192.168.110.20)、ホスト2のNICIPアドレス(192.168.120.20)が出力されていることがわかります。

[root@server ~]# traceroute -i veth2-r1 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.066 ms  0.020 ms  0.017 ms
 2  192.168.120.20 (192.168.120.20)  0.039 ms  0.029 ms  0.027 ms

9.2 ルータ2の実行結果

ルータ2でtracerouteコマンドを実行します。このとき、宛先をホスト1、インタフェースをveth1-r2としてみます。

[root@server ~]# ip netns exec r2 bash

ルータ1のNICIPアドレス(192.168.110.10)、ホスト1のNICIPアドレス(192.168.100.10)が出力されていることがわかります。

setsockopt SO_BINDTODEVICE: そのようなデバイスはありません
[root@server ~]# traceroute -i veth1-r2 192.168.100.10
traceroute to 192.168.100.10 (192.168.100.10), 30 hops max, 60 byte packets
 1  192.168.110.10 (192.168.110.10)  0.061 ms  0.021 ms  0.018 ms
 2  192.168.100.10 (192.168.100.10)  0.065 ms  0.030 ms  0.029 ms

10 経路上の最小MTUを調べる方法(--mtu)

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

10.1 MTUが1500の場合

ネットワーク構成は以下のとおりです。全てのNICでMTUが1500です。

          192.168.100.0/24             192.168.110.0/24           192.168.120.0/24
            MTU=1500                       MTU=1500                    MTU=1500
   h1 ------------------------ r1 ------------------------ r2 ------------------------ h2
   (veth1-h1)        (veth1-r1)  (veth2-r1)      (veth1-r2)   (veth2-r2)     (veth1-h2)
     .10                    .20   .10                   .20   .10                   .20

ホスト1でtracerouteコマンドを実行します。

[root@server ~]# ip netns exec h1 bash
[root@server ~]# 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.236 ms F=1500
 2  192.168.110.20 (192.168.110.20)  0.082 ms
 3  192.168.120.20 (192.168.120.20)  0.127 ms

10.2 MTUが1000の場合

ルータ1で下記コマンドを実行して、veth2-r1のMTUを1000に変更します。

[root@server ~]# ip netns exec r1 bash
[root@server ~]# ip link set veth2-r1 mtu 1000
[root@server ~]# ip l show dev veth2-r1
8: veth2-r1@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1000 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 82:0f:63:07:a7:1f brd ff:ff:ff:ff:ff:ff link-netnsid 2

ルータ2で下記コマンドを実行して、 veth1-r2のMTUを1000に変更します。

[root@server ~]# ip netns exec r2 bash
[root@server ~]# ip link set veth1-r2 mtu 1000
[root@server ~]# ip l show dev veth1-r2
7: veth1-r2@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1000 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether de:82:ab:03:1d:9c brd ff:ff:ff:ff:ff:ff link-netnsid 0

設定変更後のネットワーク構成は以下のようになります。ルータ1とルータ2の間のMTUが1500から500になります。

          192.168.100.0/24             192.168.110.0/24           192.168.120.0/24
            MTU=1500                       MTU=1000                    MTU=1500
   h1 ------------------------ r1 ------------------------ r2 ------------------------ h2
   (veth1-h1)        (veth1-r1)  (veth2-r1)      (veth1-r2)   (veth2-r2)     (veth1-h2)
     .10                    .20   .10                   .20   .10                   .20

ホスト1でtracerouteコマンドを実行します。ルータ2のveth1-r2のMTUが1000であることがわかります。

[root@server ~]# ip netns exec h1 bash
[root@server ~]# 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.065 ms F=1500
 2  192.168.110.20 (192.168.110.20)  0.044 ms F=1000
 3  192.168.120.20 (192.168.120.20)  0.058 ms

10.3 MTUが500の場合

さらに、ルータ2とホスト2の間のMTUを1500から500に変更してみます。
ルータ2で下記コマンドを実行して、veth2-r2のMTUを500に変更します。

[root@server ~]# ip netns exec r2 bash
[root@server ~]# ip link set veth2-r2 mtu 500
[root@server ~]# ip l show dev veth2-r2
10: veth2-r2@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether ba:3d:19:b3:2d:62 brd ff:ff:ff:ff:ff:ff link-netnsid 2

ホスト2で下記コマンドを実行して、 veth1-h2のMTUを500に変更します。

[root@server ~]# ip netns exec h2 bash
[root@server ~]# ip link set veth1-h2 mtu 500
[root@server ~]# ip l show dev veth1-h2
9: veth1-h2@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether ee:0e:80:15:4d:2e brd ff:ff:ff:ff:ff:ff link-netnsid 0

設定変更後のネットワーク構成は以下のようになります。ルータ2とホスト2の間のMTUが1500から500になります

          192.168.100.0/24             192.168.110.0/24           192.168.120.0/24
            MTU=1500                       MTU=1000                    MTU=500
   h1 ------------------------ r1 ------------------------ r2 ------------------------ h2
   (veth1-h1)        (veth1-r1)  (veth2-r1)      (veth1-r2)   (veth2-r2)     (veth1-h2)
     .10                    .20   .10                   .20   .10                   .20

ホスト1でtracerouteコマンドを実行します。ルータ1のveth1-r1のMTUが1500、ルータ2のveth1-r2のMTUが1000、ホスト2のveth1-h2のMTUが500であることがわかります。

[root@server ~]# ip netns exec h1 bash
[root@server ~]# 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.055 ms F=1500
 2  192.168.110.20 (192.168.110.20)  0.056 ms F=1000
 3  192.168.120.20 (192.168.120.20)  0.070 ms F=500

なお、pingコマンドでも、同様に経路上の最小MTUを求めることができます。
pingコマンドの使い方は、pingコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ