- 1 tracerouteコマンドとは?
- 2 検証環境
- 3 インストール方法
- 4 オプション一覧
- 5 検証環境における疎通確認
- 6 基本的な使い方
- 7 ICMPパケットを使って経路を調べる方法(-I)
- 8 TCPパケットを使って経路を調べる方法(-T)
- 9 インタフェースを指定する方法(-i)
- 10 経路上の最小MTUを調べる方法(--mtu)
- Z 参考情報
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.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のNICのIPアドレス(192.168.110.20)、ホスト2のNICのIPアドレス(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のNICのIPアドレス(192.168.110.10)、ホスト1のNICのIPアドレス(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技術ブログ