109.3 レッスン 2
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
109 ネットワークの基礎 |
Objective: |
109.3 基本的なネットワークのトラブルシューティング |
Lesson: |
2 of 2 |
はじめに
LinuxベースのOSには、ネットワークのトラブルシューティングツールが多数付属しています。このレッスンでは、その中でも一般的なツールを取り上げます。OSI参照モデルやTCP/IPモデルなどのネットワーク階層モデル、IPアドレス(IPv4、IPv6)、ルーティングとスイッチングの基礎を理解していることを前提として話を進めます。
ネットワーク接続が正常であるかを確認するには、(ウェブブラウザ等の)アプリケーションを使ってみるのが手っ取り早いです。正常に動作しなければ、これから紹介するいろいろなツールを使って問題を突き止めます。
ping
で接続確認
ping
と ping6
コマンドを使えば、それぞれIPv4アドレスとIPv6アドレスに、ICMPエコー要求のパケットを送信します。ICMPエコー要求では、宛先アドレスに少量のデータを送信します。宛先アドレスに到達すると、同じデータのICMPエコー応答が送り返されます。
$ ping -c 3 192.168.50.2 PING 192.168.50.2 (192.168.50.2) 56(84) bytes of data. 64 bytes from 192.168.50.2: icmp_seq=1 ttl=64 time=0.525 ms 64 bytes from 192.168.50.2: icmp_seq=2 ttl=64 time=0.419 ms 64 bytes from 192.168.50.2: icmp_seq=3 ttl=64 time=0.449 ms --- 192.168.50.2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2006ms rtt min/avg/max/mdev = 0.419/0.464/0.525/0.047 ms
$ ping6 -c 3 2001:db8::10 PING 2001:db8::10(2001:db8::10) 56 data bytes 64 bytes from 2001:db8::10: icmp_seq=1 ttl=64 time=0.425 ms 64 bytes from 2001:db8::10: icmp_seq=2 ttl=64 time=0.480 ms 64 bytes from 2001:db8::10: icmp_seq=3 ttl=64 time=0.725 ms --- 2001:db8::10 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 0.425/0.543/0.725/0.131 ms
-c
オプションではパケットを送信する回数を指定します。このオプションを省略すると、ping
と ping6
は、Ctrl+Cなどで停止されるまでパケットを送信し続けます。
pingで応答が返ってこないことが直ちに接続不能を意味するわけではありません。ファイアウォールやルーターのアクセスコントロールが必要最小限の接続しか許可していないことは多々あります。ICMPエコー要求と応答がブロックされていることも多いです。ICMPエコー要求のパケットには任意のデータを含めることができるので、攻撃者がこれを利用してデータを盗み取ろうとする可能性があるからです。(訳注:ICMP(Internet Control Message Protocol)は、その名前の通りネットワーク制御のための重要な機能を実装しています。自分が何をしているのか理解していない限り、(特にICMPv6では)ICMP全体をブロックしてはいけません。)
traceroute
で経路の追跡
traceroute
と traceroute6
コマンドを使えば、それぞれIPv4アドレスとIPv6アドレスについて、パケットが宛先に到着するまでの経路(ルート)がわかります。IPヘッダーのTTL(Time To Live)フィールドの値を1ずつ増やしながら、複数のパケットを宛先に送信するという仕組みになっています。TTLはルーターを通過する度に1ずつ減り、TTLが0になるとルーターはパケットを破棄してメッセージを送り返すので、経由しているルートがわかるというわけです。(訳注:ICMPエコー要求よりもブロックされていることが多いので、インターネットではほとんど使い物になりません)。
$ traceroute 192.168.1.20 traceroute to 192.168.1.20 (192.168.1.20), 30 hops max, 60 byte packets 1 10.0.2.2 (10.0.2.2) 0.396 ms 0.171 ms 0.132 ms 2 192.168.1.20 (192.168.1.20) 2.665 ms 2.573 ms 2.573 ms $ traceroute 192.168.50.2 traceroute to 192.168.50.2 (192.168.50.2), 30 hops max, 60 byte packets 1 192.168.50.2 (192.168.50.2) 0.433 ms 0.273 ms 0.171 ms $ traceroute6 2001:db8::11 traceroute to 2001:db8::11 (2001:db8::11), 30 hops max, 80 byte packets 1 2001:db8::11 (2001:db8::11) 0.716 ms 0.550 ms 0.641 ms $ traceroute 2001:db8::11 traceroute to 2001:db8::11 (2001:db8::11), 30 hops max, 80 byte packets 1 2001:db8::10 (2001:db8::11) 0.617 ms 0.461 ms 0.387 ms $ traceroute net2.example.net traceroute to net2.example.net (192.168.50.2), 30 hops max, 60 byte packets 1 net2.example.net (192.168.50.2) 0.533 ms 0.529 ms 0.504 ms $ traceroute6 net2.example.net traceroute to net2.example.net (2001:db8::11), 30 hops max, 80 byte packets 1 net2.example.net (2001:db8::11) 0.738 ms 0.607 ms 0.304 ms
traceroute
をオプションを指定せずに実行すると、TTLを増やしながら、意味を持たないデータで3回ずつのUDPパケットを、33434番ポートに送信します。このコマンドの出力行は、パケットが通過したルーターインターフェイスです。各行に表示される時間は、パケットが往復するのに要した時間です。当該ルーターインターフェイスのIPアドレスとともに示されます。名前解決ができれば、そのルーターインターフェイスのDNS名を表示します。時間の代わりに *
が表示されることがあります。これは、traceroute
がそのパケットのTTL超過メッセージを受け取っていないことを意味します。*
が表示されるということは、その直前の応答がそのルートでの最後のホップだったのかもしれません。(訳注:ほとんどの場合はブロックされたことを示します。)
root
権限で実行できるなら、-I
オプションを指定することで、traceroute
がUDPパケットではなくICMPエコー要求を送信するようになります。宛先のホストは、UDPパケットよりもICMPエコー要求に応答する可能性が高いので、このほうが多少は実効的です。
# traceroute -I learning.lpi.org traceroute to learning.lpi.org (208.94.166.201), 30 hops max, 60 byte packets 1 047-132-144-001.res.spectrum.com (47.132.144.1) 9.764 ms 9.702 ms 9.693 ms 2 096-034-094-106.biz.spectrum.com (96.34.94.106) 8.389 ms 8.481 ms 8.480 ms 3 dtr01hlrgnc-gbe-4-15.hlrg.nc.charter.com (96.34.64.172) 8.763 ms 8.775 ms 8.770 ms 4 acr01mgtnnc-vln-492.mgtn.nc.charter.com (96.34.67.202) 27.080 ms 27.154 ms 27.151 ms 5 bbr01gnvlsc-bue-3.gnvl.sc.charter.com (96.34.2.112) 31.339 ms 31.398 ms 31.395 ms 6 bbr01aldlmi-tge-0-0-0-13.aldl.mi.charter.com (96.34.0.161) 39.092 ms 38.794 ms 38.821 ms 7 prr01ashbva-bue-3.ashb.va.charter.com (96.34.3.51) 34.208 ms 36.474 ms 36.544 ms 8 bx2-ashburn.bell.ca (206.126.236.203) 53.973 ms 35.975 ms 38.250 ms 9 tcore4-ashburnbk_0-12-0-0.net.bell.ca (64.230.125.190) 66.315 ms 65.319 ms 65.345 ms 10 tcore4-toronto47_2-8-0-3.net.bell.ca (64.230.51.22) 67.427 ms 67.502 ms 67.498 ms 11 agg1-toronto47_xe-7-0-0_core.net.bell.ca (64.230.161.114) 61.270 ms 61.299 ms 61.291 ms 12 dis4-clarkson16_5-0.net.bell.ca (64.230.131.98) 61.101 ms 61.177 ms 61.168 ms 13 207.35.12.142 (207.35.12.142) 70.009 ms 70.069 ms 59.893 ms 14 unassigned-117.001.centrilogic.com (66.135.117.1) 61.778 ms 61.950 ms 63.041 ms 15 unassigned-116.122.akn.ca (66.135.116.122) 62.702 ms 62.759 ms 62.755 ms 16 208.94.166.201 (208.94.166.201) 62.936 ms 62.932 ms 62.921 ms
ICMPエコー要求と応答がブロックされていることもあります。そういう場合にはTCPが使えます。開いていることがわかっているTCPのポートを用いれば、宛先ホストが応答すること請け合いです。TCPを使うには、-T
オプションと -p
オプションにポート番号を指定します。ICMPエコー要求と同じように、TCPを使うためには root
権限で実行しなければなりません。
# traceroute -m 60 -T -p 80 learning.lpi.org traceroute to learning.lpi.org (208.94.166.201), 60 hops max, 60 byte packets 1 * * * 2 096-034-094-106.biz.spectrum.com (96.34.94.106) 12.178 ms 12.229 ms 12.175 ms 3 dtr01hlrgnc-gbe-4-15.hlrg.nc.charter.com (96.34.64.172) 12.134 ms 12.093 ms 12.062 ms 4 acr01mgtnnc-vln-492.mgtn.nc.charter.com (96.34.67.202) 31.146 ms 31.192 ms 31.828 ms 5 bbr01gnvlsc-bue-3.gnvl.sc.charter.com (96.34.2.112) 39.057 ms 46.706 ms 39.745 ms 6 bbr01aldlmi-tge-0-0-0-13.aldl.mi.charter.com (96.34.0.161) 50.590 ms 58.852 ms 58.841 ms 7 prr01ashbva-bue-3.ashb.va.charter.com (96.34.3.51) 34.556 ms 37.892 ms 38.274 ms 8 bx2-ashburn.bell.ca (206.126.236.203) 38.249 ms 36.991 ms 36.270 ms 9 tcore4-ashburnbk_0-12-0-0.net.bell.ca (64.230.125.190) 66.779 ms 63.218 ms tcore3-ashburnbk_100ge0-12-0-0.net.bell.ca (64.230.125.188) 60.441 ms 10 tcore4-toronto47_2-8-0-3.net.bell.ca (64.230.51.22) 63.932 ms 63.733 ms 68.847 ms 11 agg2-toronto47_xe-7-0-0_core.net.bell.ca (64.230.161.118) 60.144 ms 60.443 ms agg1-toronto47_xe-7-0-0_core.net.bell.ca (64.230.161.114) 60.851 ms 12 dis4-clarkson16_5-0.net.bell.ca (64.230.131.98) 67.246 ms dis4-clarkson16_7-0.net.bell.ca (64.230.131.102) 68.404 ms dis4-clarkson16_5-0.net.bell.ca (64.230.131.98) 67.403 ms 13 207.35.12.142 (207.35.12.142) 66.138 ms 60.608 ms 64.656 ms 14 unassigned-117.001.centrilogic.com (66.135.117.1) 70.690 ms 62.190 ms 61.787 ms 15 unassigned-116.122.akn.ca (66.135.116.122) 62.692 ms 69.470 ms 68.815 ms 16 208.94.166.201 (208.94.166.201) 61.433 ms 65.421 ms 65.247 ms 17 208.94.166.201 (208.94.166.201) 64.023 ms 62.181 ms 61.899 ms
ping
と同様、traceroute
には限界があります。ファイアウォールやルーターが、traceroute
により送受信されるパケットをブロックしている可能性があります。root
権限があれば、ICMPやTCPを使うことで、多少はマシな結果が得られることでしょう。(訳注:ホスト名を表示させるにはDNSの逆引きを行う必要があり、長い時間がかかるが普通です。-n
オプションを付けて、ホスト名ではなくIPアドレスを表示させるとよいでしょう。)
tracepath
でMTUを調査
tracepath
コマンドは traceroute
コマンドと似ています。経路とともに MTU(Maximum Transmission Unit、1回に送信できるデータサイズ)を追跡する点が異なります。MTUはネットワークインターフェイスの設定、あるいはハードウェアがそのプロトコルで送受信できる最大データ単位の上限によって決まります。tracepath
の仕組みは traceroute
と同じで、TTLを増やしながら複数のパケットを送ります。ただし、非常に大きなUDPデータグラムを送るという点が異なります。経路上でMTUの最も小さいデバイスが送信できるデータサイズを上回ることは必定です。そうなると、そのデバイスは、パケットを宛先に届けられなかったという応答を返します。そうして送り返されるICMP宛先到達不能パケットには、パケットを送信し切れなかったリンクのMTUを示すフィールドがあります。tracepath
は、以後、そのMTUのサイズのパケットを送信します。
$ tracepath 192.168.1.20 1?: [LOCALHOST] pmtu 1500 1: 10.0.2.2 0.321ms 1: 10.0.2.2 0.110ms 2: 192.168.1.20 2.714ms reached Resume: pmtu 1500 hops 2 back 64
IPv4とIPv6の両方に使える traceroute
とは異なり、IPv6には tracepath6
を使います。
$ tracepath 2001:db8::11 tracepath: 2001:db8::11: Address family for hostname not supported $ tracepath6 2001:db8::11 1?: [LOCALHOST] 0.027ms pmtu 1500 1: net2.example.net 0.917ms reached 1: net2.example.net 0.527ms reached Resume: pmtu 1500 hops 1 back 1
出力は traceroute
に似ています。tracepath
を使う利点は、最終行にリンク全体で最小のMTUが出力されることです。これは、フラグメントを処理できない接続をトラブルシューティングする際に役立ちます。
ping
や traceroute
と同様、ファイアウォールやルーターが、tracepath
により送受信されるパケットをブロックしている可能性があります。
任意の接続を作成
nc
プログラム(netcatと呼ばれることもあります)を使うと、TCP接続またはUDP接続で、任意のデータを送受信できます。以下の実例を通じて機能を説明します。
1234
番ポートで接続を待ち受けることにします。(訳注:このコマンドを実行するホストが net2.example.net
であると想定して以下の内容を読み進めてください。)
$ nc -l 1234 LPI Example
この nc -l 1234
コマンドは、TCPの1234番ポートで接続を待ち受けます。別のマシンで次のコマンド(nc net2.example.net 1234
)を実行して、LPI Example
と打ち込むと、待ち受けていた側のターミナルに打ち込んだ文字が表示されます。
$ nc net2.example.net 1234 LPI Example
受信側でも送信側でも、接続を中止するには、Ctrl+Cを押してください。
nc
(netcat)はIPv4とIPv6のどちらでも動作しますし、TCPでもUDPでも動作します。素のリモートシェルを立ち上げることさえできます。
Warning
|
(以下に示す素のリモートシェルを立ち上げる例では |
$ hostname net2 $ nc -u -e /bin/bash -l 1234
-u
オプションを指定するとUDP接続になります。-e
オプションを指定して接続を待ち受けると、受信したものをそのまますべて -e
オプションの次に指定した実行可能ファイル(上記の例では /bin/bash
)の標準入力に送ります。
$ hostname net1 $ nc -u net2.example.net 1234 hostname net2 pwd /home/emma
nc -u net2.example.net 1234
実行後の hostname
コマンドと pwd
コマンドの出力結果は、接続を待ち受けていたホストが出力しているものであることに注目してください。
現在の接続と待ち受けの確認
netstat
ないし ss
を使うと、現在の接続と待ち受けの状態を確認できます。netstat
は ifconfig
と同じように古いツールです。netstat
と ss
は出力とオプションが似ています。どちらのプログラムでも使えるオプションを紹介します。
-a
-
すべてのソケットを表示します。
-l
-
待ち受けているソケットを表示します。
-p
-
接続と関連するプロセスを表示します。
-n
-
ポートとアドレスについて、名前解決を行いません。
-t
-
TCP接続を表示します。
-u
-
UDP接続を表示します。
両方のプログラムについて、よく使うオプションの指定例とその出力結果を、以下に示します。
# netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 892/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1141/master tcp6 0 0 :::22 :::* LISTEN 892/sshd tcp6 0 0 ::1:25 :::* LISTEN 1141/master udp 0 0 0.0.0.0:68 0.0.0.0:* 692/dhclient # ss -tulnp Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 :68 *: users:(("dhclient",pid=693,fd=6)) tcp LISTEN 0 128 :22 *: users:(("sshd",pid=892,fd=3)) tcp LISTEN 0 100 127.0.0.1:25 : users:(("master",pid=1099,fd=13)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=892,fd=4)) tcp LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=1099,fd=14))
Recv-Q
列は、ソケットが受信したけれどもユーザープログラムに渡されなかったパケットの総バイト数です。Send-Q
列は、ソケットが送信したけれども受け入れられなかったパケットの総バイト数です。残りの列は、プロトコル(Proto
ないし Netid
)、ローカル側ソケットのアドレスとポート番号(Local Address
ないし Local Address:Port
)、リモート側ソケットのアドレスとポート番号(Foreign Address
ないし Peer Address:Port
)、状態(State
)、ソケットが属しているプログラム(PID/Program name
ないし Process
)です。
演習
-
ICMPエコーを
learning.lpi.org
に送信してください。 -
8.8.8.8
への経路を明らかにしてください。 -
TCPの80番ポートで待ち受けているプロセスが存在するかどうかを確かめてください。
-
22番ポートで接続を待ち受けているプロセス(PIDだけでなくプログラム名も)を特定してください。
-
somehost.example.com
に至る経路全体での最小のMTUを明らかにしてください。
発展演習
-
netcat(nc)でウェブサーバーにHTTPリクエストを送信することができます。
learning.lpi.org
の80番ポートに/index.html
の取得を要求するHTTPリクエストを送信してください。 -
pingが失敗する理由を思いつく限り挙げてください。
-
ネットワークインターフェイスを行き来するパケットを確認したり記録したりできるツールの名前を挙げてください。
-
traceroute
で使用するインターフェイスを指定するオプションは何ですか? -
traceroute
でMTUを出力することはできますか?
まとめ
ネットワークは、通常、システムの起動スクリプトか、NetworkManagerのようなヘルパーが構成します。多くのディストリビューションでは、起動スクリプトが使用する構成ファイルを編集するツールが付属しています。詳細についてはお使いのディストリビューションのドキュメントを参照してください。
手動でネットワークを構成できるようになれば、トラブルシューティングを効果的に行えます。また、バックアップからの復元や新しいハードウェアへの移行といった、起動スクリプトやヘルパーが存在しない最小限の環境での作業にも役立ちます。
このレッスンで取り上げたユーティリティには、ここで説明したよりも多くの機能があります。各ユーティリティのマニュアルページをめくり、オプションに習熟する価値があります。ss
と ip
は新しいコマンドで、その他のコマンドは、まだ広く用いられているものの、古いツールです。
このレッスンで紹介したツールに慣れるには練習あるのみです。それなりのメモリ(RAM)を搭載したコンピュータを使っているなら、仮想マシンで仮想ネットワークを構築して練習できます。仮想マシンが3台あれば、練習には充分です。
このレッスンでは、次のコマンドを取り上げました。
ping
、ping6
-
ICMPパケットを伝送します。ネットワークの疎通確認に使えます。
traceroute
、traceroute6
-
ネットワークの経路を追跡し、ネットワークの接続具合を明らかにします。
tracepath
、tracepath6
-
ネットワークの経路に加えてMTUを明らかにします。
nc
-
任意の接続を作成し、ネットワーク接続を確かめられます。利用できるサービスやデバイスの探索(ポートスキャン)にも使えます。
netstat
-
開いているネットワーク接続と統計情報を表示する古いツールです。
ss
-
開いているネットワーク接続と統計情報を表示する新しいツールです。
演習の解答
-
ICMPエコーを
learning.lpi.org
に送信してください。ping
ないしping6
を使います。$ ping learning.lpi.org
または
$ ping6 learning.lpi.org
-
8.8.8.8
への経路を明らかにしてください。tracepath
ないしtraceroute
コマンドを使います。$ tracepath 8.8.8.8
または
$ traceroute 8.8.8.8
-
TCPの80番ポートで待ち受けているプロセスが存在するかどうかを確かめてください。
ss
を使うなら次のコマンドを実行します。$ ss -ln | grep ":80"
netstat
を使うなら次のコマンドを実行します。$ netstat -ln | grep ":80"
試験範囲のこの単元では取り上げられてていませんが、
lsof
を使うなら次のコマンドを実行します。# lsof -Pi:80
-
22番ポートで接続を待ち受けているプロセス(PIDだけでなくプログラム名も)を特定してください。
複数の方法があります。前問の解答で示したのと同じやり方でポート番号を22にして
lsof
を使うのが一つの方法です。-p
オプションを指定してnetstat
ないしss
を実行する方法もあります。ただし、netstat
は古いツールです。# netstat -lnp | grep ":22"
netstat
とss
のオプションは同じです。# ss -lnp | grep ":22"
-
somehost.example.com
に至る経路全体での最小のMTUを明らかにしてください。tracepath
コマンドを実行します。$ tracepath somehost.example.com
発展演習の解答
-
netcat(nc)でウェブサーバーにHTTPリクエストを送信することができます。
learning.lpi.org
の80番ポートに/index.html
の取得を要求するHTTPリクエストを送信してください。nc
でlearning.lpi.org
の80番ポートに接続してから、HTTPリクエストラインとヘッダーと空行をターミナルに入力します。(訳注:以下の出力例と異なる出力になることがありますが、HTTPレスポンスが返ってきていれば、正常に実行できています。)$ nc learning.lpi.org 80 GET /index.html HTTP/1.1 HOST: learning.lpi.org HTTP/1.1 302 Found Location: https://learning.lpi.org:443/index.html Date: Wed, 27 May 2020 22:54:46 GMT Content-Length: 5 Content-Type: text/plain; charset=utf-8 Found
-
pingが失敗する理由を思いつく限り挙げてください。
いろいろな理由が考えられます。以下に列挙します。
-
リモートホストがダウンしている。
-
ルーターのアクセスコントロールがpingをブロックしている。
-
リモートホストのファイアウォールがpingをブロックしている。
-
ホスト名またはIPアドレスが間違っている。
-
名前解決が間違っている。
-
ローカルマシンのネットワーク構成に問題がある。
-
ローカルマシンのファイアウォールがpingをブロックしている。
-
リモートホストのネットワーク構成に問題がある。
-
ローカルマシンのネットワークインターフェイスが切れている。
-
リモートマシンのネットワークインターフェイスが切れている。
-
ローカルマシンとリモートマシンとの間にあるネットワークコンポーネント(スイッチ、ケーブル、ルーターなど)に問題がある。
-
-
ネットワークインターフェイスを行き来するパケットを確認したり記録したりできるツールの名前を挙げてください。
tcpdump
やwireshark
などです。 -
traceroute
で使用するインターフェイスを指定するオプションは何ですか?-i
オプションです。たとえば次のように実行します。$ traceroute -i eth2 learning.lpi.org traceroute -i eth2 learning.lpi.org traceroute to learning.lpi.org (208.94.166.201), 30 hops max, 60 byte packets ...
-
traceroute
でMTUを出力することはできますか?--mtu
オプションを指定するとMTUを出力します。# traceroute -I --mtu learning.lpi.org traceroute to learning.lpi.org (208.94.166.201), 30 hops max, 65000 byte packets 1 047-132-144-001.res.spectrum.com (47.132.144.1) 9.974 ms F=1500 10.476 ms 4.743 ms 2 096-034-094-106.biz.spectrum.com (96.34.94.106) 8.697 ms 9.963 ms 10.321 ms ...