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 インタフェースの確認
環境構築後のインタフェースを以下に示します。
[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
[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
[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
[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 ルーティングテーブルの確認
環境構築後のルーティングテーブルを以下に示します。
[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
[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
[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
[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アドレスが表示されていることがわかります。
[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を以下に示します。
[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アドレスが表示されていることがわかります。
[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パケットが送信されていることもわかります。
[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)
[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に対して送信していることがわかります。
[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アドレスが表示されていることがわかります。
[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に対して送信していることがわかります。
[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に対する経路を調べてみます。
ip netnsコマンドの使い方は、
ip netnsコマンドの使い方(ネットワークの実験の幅が広がるなぁ~)
を参照ください。
[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オプションも同時に指定します。
なお、pingでもMTUを調べることができます。
使い方は、ここ(pingコマンドの使い方)を参照してください。
9.1 MTU変更前
「Y 環境構築用シェル」に示したシェルを使って、環境を構築します。
[root@centos74 ~]# ./net.sh
net.ipv4.ip_forward = 1
net.ipv4.ip_forward = 1
シェルを実行すると、下記4つのネームスペースが作成されます。
[root@centos74 ~]# ip netns list
r2
r1 (id: 1)
h2
h1
シェルを実行すると、下記環境ができます。
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(h1)でtracerouteコマンドを実行してみます。
宛先はホスト2(h2)です。
tracerouteを実行します。
ホスト1からホスト2への経路上のMTUが1500であることがわかります。
[root@centos74 ~]# ip netns exec h1 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に変更します。
ip netnsコマンドの使い方は、
ip netnsコマンドの使い方(ネットワークの実験の幅が広がるなぁ~)を参照ください。
MTUを確認します。MTUが1500(★印)であることがわかります。
[root@centos74 ~]# ip netns exec r1 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
MTUを1500->1000に変更します。
[root@centos74 ~]# ip netns exec r1 ip link set veth2-r1 mtu 1000
変更したMTUを確認します。
MTUが1000(★印)に変更されたことがわかります。
[root@centos74 ~]# ip netns exec r1 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
MTUを確認します。MTUが1500(★印)であることがわかります。
[root@centos74 ~]# ip netns exec r2 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
MTUを1500->1000に変更します。
[root@centos74 ~]# ip netns exec r2 ip link set veth1-r2 mtu 1000
変更したMTUを確認します。
MTUが1000(★印)に変更されたことがわかります。
[root@centos74 ~]# ip netns exec r2 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になっています。
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
tracerouteを実行してみます。
ホスト1からホスト2への経路上の最小のMTUが1000であることがわかる。
[root@centos74 ~]# ip netns exec h1 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に変更します。
[root@server ~]# ip netns exec r2 ip link set veth2-r2 mtu 500
[root@server ~]# ip netns exec r2 ip l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: veth1-r2@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1000 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 46:db:44:45:d9:63 brd ff:ff:ff:ff:ff:ff link-netnsid 0
9: veth2-r2@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether aa:77:4f:2c:80:f9 brd ff:ff:ff:ff:ff:ff link-netnsid 2
[root@server ~]# ip netns exec h2 ip link set veth1-h2 mtu 500
[root@server ~]# ip netns exec h2 ip l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
8: veth1-h2@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether c2:5e:25:56:da:53 brd ff:ff:ff:ff:ff:ff link-netnsid 0
MTU変更後の構成を以下に示します。r2,h2間のMTUが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
以下にtracerouteの実行結果を示します。
宛先ホストまでの経路上で、MTUの最小値が500であることがわかります。
[root@centos74 ~]# ip netns exec h1 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パケットのルーティングを禁止にします。
[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を使ってみます。
[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秒であることがわかります。
[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
[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パケットのルーティングを禁止にします。
[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秒を指定してみます。
[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秒であることがわかります。
[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
[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 ~]#