109.3 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
109 ネットワークの基礎 |
Objective: |
109.3 基本的なネットワークのトラブルシューティング |
Lesson: |
1 of 2 |
はじめに
Linuxのネットワーク機能は非常に柔軟で強力です。事実、ネットワークデバイスは、高価な商業用装置も含め、LinuxベースのOSを搭載していることが多いです。Linuxネットワークは、それだけで一つの資格試験を作れるくらい膨大な領域です。このレッスンでは、基本構成とトラブルシューティングツールのごく一部を紹介するに過ぎないことをご承知おきください。
このレッスンより前にある、インターネットプロトコルとネットワーク構成についてのレッスンを復習するようにしてください。このレッスンでは、IPv4とIPv6のネットワーク構成とトラブルシューティングに使うツールを紹介します。
公式の試験範囲には含まれませんが、tcpdump
のような パケットスニファ は、トラブルシューティングにおいて有用なので、ここで少し触れることとします。パケットスニッファを使うと、ネットワークインターフェイスを行き来するパケットを確認したり記録したりできます。ヘックス(16進数)ビューア や プロトコルアナライザ のようなツールを併用すると、より詳細にパケットを分析するのに役立ちます。少なくともこのようなプログラムが存在するのだということを知っておいても損はないでしょう。
ip
コマンド
ip
コマンドは、ネットワーク構成に関するあらゆる確認と設定を行える、新しいユーティリティです。このレッスンでは、ip
コマンドのうち使用頻度の高いものを取り上げますが、それは ip
コマンドでできることのごく一部でしかありません。より詳しく知りたい場合には、ip
コマンドのマニュアルを読んでみてください。
ip
の操作対象ごとにマニュアルページがあります。ip
のマニュアルページの SEE ALSO
セクションに、そのリストが挙がっています。
$ man ip ... SEE ALSO ip-address(8), ip-addrlabel(8), ip-l2tp(8), ip-link(8), ip-maddress(8), ip-monitor(8), ip-mroute(8), ip-neighbour(8), ip-netns(8), ip- ntable(8), ip-route(8), ip-rule(8), ip-tcp_metrics(8), ip-token(8), ip- tunnel(8), ip-xfrm(8) IP Command reference ip-cref.ps ...
ip
コマンド自体のマニュアルページではなく、ip
と操作対象を -
でつなげた名前で、操作対象に応じたマニュアルページを読むことができます(例:man ip-route
)。
ヘルプ機能からも情報を得られます。操作対象のあとに help
と入力して実行すると、ヘルプを確認できます。
$ ip address help Usage: ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ] [ CONFFLAG-LIST ] ip address del IFADDR dev IFNAME [mngtmpaddr] ip address {save|flush} [ dev IFNAME ] [ scope SCOPE-ID ] [ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up] ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ master DEVICE ] [ type TYPE ] [ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up] [ vrf NAME ] ] ip address {showdump|restore} IFADDR := PREFIX | ADDR peer PREFIX ...
ネットマスクとルーティングの復習
IPv4とIPv6は、ネットワーク層のプロトコルです。ネットワークの設計者が、トラフィックの流れを制御できるように設計されています。イーサネットはリンク層のプロトコルで機器同士を接続するために使われますが、それだけでネットワークトラフィックの流れを制御することはほとんどできません。ネットワーク層のプロトコル、すなわちIPプロトコルが、トラフィックを制御する主役です。
IPプロトコルでは、ネットワークをいくつかのセグメントに分割した サブネット を作ることができます。これにより、1つのネットワークに接続するデバイス数を適切な規模に保ちながら、トラフィックが経由するルートを冗長化するなどの、トラフィック管理を行うことができます。
IPv4とIPv6のアドレスは、ネットワーク部とホスト部の2つに分けられます。上位ビットがネットワークを、下位ビットがホストを表します。ネットワークを表すビット数がいくつかであるかを、ネットマスク(サブネットマスク とも呼ばれます)で指定します。これを /20
のような プレフィックス長 と呼ばれる形で表すこともあります。呼び方はどうであれ、アドレスのうち、ネットワーク部として扱うビット数のことを指しています。IPv4では、(IPv4アドレス自体と同様の)ドットで区切った4つの10進数で表記すること(例えば 255.255.255.0)も多いです。
以下はIPv4の例です。ネットマスクによりネットワーク部とホスト部がどのように分割されたとしても、オクテット(8ビット)内の2進数の位取りは変わらないことに注意してください。
192.168.130.5/20 192 168 130 5 11000000 10101000 10000010 00000101 20ビット = 11111111 11111111 11110000 00000000 ネットワーク = 192.168.128.0 ホスト = 2.5
IPアドレスのネットワーク部は、IPv4ないしIPv6のマシンがパケットをどのネットワークインターフェイスに送り出すかを決定するために使用されます。それぞれのマシンは、それぞれのネットワークインターフェイスと、そこ接続されているネットワークアドレスの対応表(ルーティングテーブル)を持っています。ルーティングが有効となっているマシンが、自分宛ではないパケットを受け取ると、宛先のネットワークアドレスをルーティングテーブルから探します。マッチするエントリが見つかれば、パケットを対応するネットワークインターフェイスに送付します。マッチするエントリが見つからず、デフォルトルートが設定されていれば、デフォルトルートとして指定されたネットワークインターフェイス(ないしはリモートマシン)に宛てて送付します。マッチするエントリが見つからず、デフォルトルートが設定されていなければ、パケットは破棄されます。これが ルーティング の基本的な働きです。何台ものルーターが同じ働きでパケットを転送していくことで、パケットはインターネットの端から端まで届けられるのです。
ネットワークインターフェイスの構成
ネットワークインターフェイスの構成に使用するツールを2つ紹介します。ifconfig
と ip
です。ifconfig
はまだ広く使われていますが、古いツールと位置づけられており、新しいシステムでは使えないかもしれません。
Tip
|
新しいLinuxディストリビューションでは、 |
構成する前に、使用できるネットワークインターフェイスを確認しましょう。確認方法はいくつかあります。-a
オプションを指定して ifconfig
を実行するのが一つの方法です。
$ ifconfig -a
ip
を使う方法もあります。ip addr
、ip a
、ip address
のいずれかを実行すると、IPアドレスとともにネットワークインターフェイスを一覧表示します。この3つのコマンドの意味はどれも同じです。正式な操作対象の指定方法は ip address
です(訳注:先頭数文字を指定すれば有効です)。よって、マニュアルページを参照する際には、man ip-addr
ではなく man ip-address
を実行します。
ip
の操作対象として link
を指定すると、使用できるネットワークインターフェイスを一覧表示します。
$ ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:54:18:57 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:ab:11:3e brd ff:ff:ff:ff:ff:ff
sys
ファイルシステムがマウントされていれば、/sys/class/net
ディレクトリを一覧表示することでも、使用できるネットワークインターフェイスを確認できます。
$ ls /sys/class/net enp0s3 enp0s8 lo
ifconfig
や ip
でネットワークインターフェイスを構成する場合は、rootユーザーとしてログインするか、sudo
などのユーティリティを使ってroot権限で実行する必要があります。以下に例を載せます。
# ifconfig enp1s0 192.168.50.50/24
Linuxの ifconfig
は、以下に例を示すように、サブネットマスクをいろいろな形式で柔軟に指定できます。
# ifconfig eth2 192.168.50.50 netmask 255.255.255.0 # ifconfig eth2 192.168.50.50 netmask 0xffffff00 # ifconfig enp0s8 add 2001:db8::10/64
IPv6では add
という語を使っていることに気をつけてください。IPv6アドレスの前に add
がなければエラーになります。
ip
でネットワークインターフェイスを構成するなら、次のようなコマンドを実行します。
# ip addr add 192.168.5.5/24 dev enp0s8 # ip addr add 2001:db8::10/64 dev enp0s8
ip
は、同じ形のコマンドでIPv4とIPv6のどちらでも構成できます。
低水準の構成
ip link
コマンドを使うと、VLAN、ARP、MTUといったネットワークインターフェイスやプロトコルの低水準な機能を構成したり、ネットワークインターフェイスを無効にすることができます。
ip link
でのよくある作業は、ネットワークインターフェイスの無効化/有効化です。ifconfig
でも同じことができます。
# ip link set dev enp0s8 down # ip link show dev enp0s8 3: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 08:00:27:ab:11:3e brd ff:ff:ff:ff:ff:ff # ifconfig enp0s8 up # ip link show dev enp0s8 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:ab:11:3e brd ff:ff:ff:ff:ff:ff
ネットワークインターフェイスのMTU(Mximum Transmission Unit、1回に送信できるデータサイズ)を調整したいことがあります。これも ip link
ないし ifconfig
で調整できます。(訳注:MTUはメディアやプロトコルによって異なり、イーサネットでは1500バイト、光ファイバでは4352バイトなどと決められています。)
# ip link set enp0s8 mtu 2000 # ip link show dev enp0s3 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2000 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:54:53:59 brd ff:ff:ff:ff:ff:ff # ifconfig enp0s3 mtu 1500 # ip link show dev enp0s3 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:54:53:59 brd ff:ff:ff:ff:ff:ff
ルーティングテーブル
ルーティングテーブルを確認するには、route
、netstat -r
、ip route
のいずれかを実行します。ルーティングテーブルを変更するには、route
ないし ip route
を使います。3通りの方法でルーティングテーブルを確認してみます。
$ netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default 10.0.2.2 0.0.0.0 UG 0 0 0 enp0s3 10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s3 192.168.150.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s8 $ ip route default via 10.0.2.2 dev enp0s3 proto dhcp metric 100 10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100 192.168.150.0/24 dev enp0s8 proto kernel scope link src 192.168.150.200 $ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 10.0.2.2 0.0.0.0 UG 100 0 0 enp0s3 10.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3 192.168.150.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s8
IPv6に関する出力はありませんでした。IPv6のルーティングテーブルを確認するには、route -6
、netstat -6r
、ip -6 route
のいずれかを実行します。
$ route -6 Kernel IPv6 routing table Destination Next Hop Flag Met Ref Use If 2001:db8::/64 [::] U 256 0 0 enp0s8 fe80::/64 [::] U 100 0 0 enp0s3 2002:a00::/24 [::] !n 1024 0 0 lo [::]/0 2001:db8::1 UG 1 0 0 enp0s8 localhost/128 [::] Un 0 2 84 lo 2001:db8::10/128 [::] Un 0 1 0 lo fe80::a00:27ff:fe54:5359/128 [::] Un 0 1 0 lo ff00::/8 [::] U 256 1 3 enp0s3 ff00::/8 [::] U 256 1 6 enp0s8
netstat -r6
の出力例は、route -6
の出力とまったく同じであるため、割愛しています。上記の route
ないし route -6
コマンドを実行した出力のうち、Destination
列は宛先のネットワークアドレス、Gateway
列ならびに Next Hop
列はゲートウェイルーターのホストアドレス、Genmask
列はサブネットマスクを、それぞれ示しています。Flag
列はルートについての情報を示し、U
は有効、!
は使用されない、n
はキャッシュされていない、G
はゲートウェイという意味です。カーネルは、探索速度向上のため、既知のルートを個別にキャッシュします。Metric
ないし Met
列は、カーネルが利用するものではなく、ルーティングプロトコル(訳注:ルーター同士がルート情報を自動的に交換し合うためのプロトコル)が動的にルートを決めるために使うAD(administrative distance)値です。Ref
列は参照数、すなわちルートが使われた回数のことです。Metric
と同様に、Linuxカーネルが利用するものではありません。Use
列はルートの探索数を示します。Iface
ないし If
列は、ネットワークインターフェイスを示しています。
netstat -r
の出力の説明に移ります。MSS
列はそのルートでのTCPパケットの最大サイズを示します。Window
列はTCPのデフォルトウィンドウサイズを示します。irtt
はパケットの往復時間を示します。
ip route
と ip -6 route
の出力は、次のように読み解きます。
-
宛先ネットワーク
-
使用するネットワークインターフェイス(アドレスがある場合にはネットワークインターフェイスの前に表示される)
-
文字
proto
とルートを追加したルーティングプロトコル -
文字
scope
とそのルートのスコープ。この部分が省略されていたら、グローバルスコープ、すなわちゲートウェイです。 -
文字
Metric
と、そのルートのコストを示す値。動的ルーティングプロトコルで使用されます。 -
(IPv6の場合のみ)RFC4191によるルータ優先度
2つほど例を見てみましょう。
- IPv4の例
-
default via 10.0.2.2 dev enp0s3 proto dhcp metric 100
-
宛先はデフォルトルートです。
-
ネットワークインターフェイス
enp0s3
を使用します(ゲートウェイアドレス10.0.2.2
に送付します)。 -
DHCPがこのルートを追加しました。
-
スコープは省略されているのでグローバルです。
-
コスト値は
100
です。 -
IPv6ルータ優先度はありません。
-
- IPv6の例
-
fc0::/64 dev enp0s8 proto kernel metric 256 pref medium
-
宛先は
fc0::/64
です。 -
ネットワークインターフェイス
enp0s8
を使用します。 -
カーネルが自動的にこのルートを追加しました。
-
スコープは省略されているのでグローバルです。
-
コスト値は
256
です。 -
IPv6ルータ優先度は
medium
です。
-
ルーティングテーブルの管理
ルーティングテーブルは、route
ないし ip route
を使って管理できます。route
コマンドを使い、ルートを追加して、削除する例を以下に示します。IPv6については -6
オプションを指定します。
# ping6 -c 2 2001:db8:1::20 connect: Network is unreachable # route -6 add 2001:db8:1::/64 gw 2001:db8::3 # ping6 -c 2 2001:db8:1::20 PING 2001:db8:1::20(2001:db8:1::20) 56 data bytes 64 bytes from 2001:db8:1::20: icmp_seq=1 ttl=64 time=0.451 ms 64 bytes from 2001:db8:1::20: icmp_seq=2 ttl=64 time=0.438 ms # route -6 del 2001:db8:1::/64 gw 2001:db8::3 # ping6 -c 2 2001:db8:1::20 connect: Network is unreachable
同じことを ip route
コマンドで行う例を以下に示します。
# ping6 -c 2 2001:db8:1:20 connect: Network is unreachable # ip route add 2001:db8:1::/64 via 2001:db8::3 # ping6 -c 2 2001:db8:1:20 PING 2001:db8:1::20(2001:db8:1::20) 56 data bytes 64 bytes from 2001:db8:1::20: icmp_seq=2 ttl=64 time=0.529 ms 64 bytes from 2001:db8:1::20: icmp_seq=2 ttl=64 time=0.438 ms # ip route del 2001:db8:1::/64 via 2001:db8::3 # ping6 -c 2 2001:db8:1::20 connect: Network is unreachable
演習
-
ネットワークインターフェイスを一覧表示するコマンドは何ですか?
-
ネットワークインターフェイス
wlan1
を一時的に無効にし、再び有効にしてください。 -
以下の選択肢のうち、IPv4のサブネットマスクとして適切なものをすべて選んでください。
0.0.0.255
255.0.255.0
255.252.0.0
/24
-
デフォルトルートを確認するコマンドは何ですか?
-
ネットワークインターフェイス
enp0s9
に172.16.15.16/16
という2つ目のIPアドレスを追加してください。
発展演習
-
ip
コマンドで、ネットワークインターフェイスenp0s9
に idが20
のタグVLANを構成してください。 -
デフォルトルートとして、IPアドレス
192.168.1.1
を設定してください。 -
ip neighbour
コマンドのマニュアルページを読み、そのコマンドを実行するとどうなるかを答えてください。 -
ルーティングテーブルのバックアップと復元を行うコマンドは、それぞれ何ですか?
-
ip
コマンドで、ネットワークインターフェイスenp0s9
に優先度が50
のスパニングツリーを構成してください。
まとめ
ネットワークは、通常、システムの起動スクリプトか、NetworkManagerのようなヘルパーが構成します。多くのディストリビューションでは、起動スクリプトが使用する構成ファイルを編集するツールが付属しています。詳細についてはお使いのディストリビューションのドキュメントを参照してください。
手動でネットワークを構成できるようになれば、トラブルシューティングを効果的に行えます。また、バックアップからの復元や新しいハードウェアへの移行といった、起動スクリプトやヘルパーが存在しない最小限の環境での作業にも役立ちます。
このレッスンで取り上げたユーティリティには、ここで説明したよりも多くの機能があります。各ユーティリティのマニュアルページをめくり、オプションに習熟する価値があります。ss
と ip
は新しいコマンドで、その他のコマンドは、まだ広く用いられているものの、古いツールです。
このレッスンで紹介したツールに慣れるには練習あるのみです。それなりのメモリ(RAM)を搭載したコンピュータを使っているなら、仮想マシンで仮想ネットワークを構築して練習できます。仮想マシンが3台あれば、練習には充分です。
このレッスンでは、次のコマンドを取り上げました。
ifconfig
-
ネットワークインターフェイスの構成と確認を行う古いユーティリティです。
ip
-
ネットワークインターフェイスの構成や確認などを行う、新しい多機能なユーティリティです。
netstat
-
ネットワーク接続とルーティング情報を確認する古いコマンドです。
route
-
ルーティングテーブルの確認と変更を行う古いコマンドです。
演習の解答
-
ネットワークインターフェイスを一覧表示するコマンドは何ですか?
ip link
、ifconfig -a
、ls /sys/class/net
のいずれかです。 -
ネットワークインターフェイス
wlan1
を一時的に無効にし、再び有効にしてください。ifconfig
ないしip link
を使います。ifconfig
を使うなら次のコマンドを実行します。$ ifconfig wlan1 down $ ifconfig wlan1 up
ip link
を使うなら次のコマンドを実行します。$ ip link set wlan1 down $ ip link set wlan1 up
-
以下の選択肢のうち、IPv4のサブネットマスクとして適切なものをすべて選んでください。
-
255.252.0.0
-
/24
この2つ以外の選択肢は、アドレスをネットワーク部とホスト部の2つに分割していないので、適切ではありません。左側のネットワーク部のビットはすべて1で、右側のホスト部のビットはすべて0でなければなりません。
-
-
デフォルトルートを確認するコマンドは何ですか?
route
、netstat -r
、ip route
のいずれかです。$ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default server 0.0.0.0 UG 600 0 0 wlan1 192.168.1.0 0.0.0.0 255.255.255.0 U 600 0 0 wlan1 $ netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default server 0.0.0.0 UG 0 0 0 wlan1 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan1 $ ip route default via 192.168.1.20 dev wlan1 proto static metric 600 192.168.1.0/24 dev wlan1 proto kernel scope link src 192.168.1.24 metric 600
-
ネットワークインターフェイス
enp0s9
に172.16.15.16/16
という2つ目のIPアドレスを追加してください。ip address
ないしifconfig
を使います。ifconfig
を使うのは古いやり方です。$ ip addr add 172.16.15.16/16 dev enp0s9 label enp0s9:sub1
上記コマンド中の
label enp0s9:sub1
という部分は、enp0s9
にエイリアスを追加しています。ifconfig
を使わないのであれば、この部分は省略可能です。ifconfig
を使うのであれば、この部分を省略すると、正常に動作はしますが、追加したアドレスがifconfig
で出力されません。ifconfig
を使ってIPアドレスを追加するなら、次のコマンドを実行します。$ ifconfig enp0s9:sub1 172.16.15.16/16
発展演習の解答
-
ip
コマンドで、ネットワークインターフェイスenp0s9
に idが20
のタグVLANを構成してください。ip link
にはvlan
オプションがあり、これを使います。次のコマンドを実行します。(訳注:VLANはLPIC-1の範囲外です。)# ip link add link enp0s9 name enp0s9.20 type vlan id 20
-
デフォルトルートとして、IPアドレス
192.168.1.1
を設定してください。route
ないしip route
を使います。次のコマンドのいずれかを実行します。# route add default gw 192.168.1.1 # ip route add default via 192.168.1.1
-
ip neighbour
コマンドのマニュアルページを読み、そのコマンドを実行するとどうなるかを答えてください。次のコマンドを実行してマニュアルページを読みます。
$ man ip-neigbour
ip neighbour
コマンドは、ARPキャッシュを表示します。(訳注:ARPはLPIC-1の範囲外です。)$ ip neighbour 10.0.2.2 dev enp0s3 lladdr 52:54:00:12:35:02 REACHABLE
-
ルーティングテーブルのバックアップと復元を行うコマンドは、それぞれ何ですか?
次のコマンドを実行すると、ルーティングテーブルのバックアップと復元を行います。
# ip route save > /root/routes/route_backup # ip route restore < /root/routes/route_backup
-
ip
コマンドで、ネットワークインターフェイスenp0s9
に優先度が50
のスパニングツリーを構成してください。VLANを構成するのと似たようなやり方で
ip link
コマンドを実行し、bridge
タイプを使うことで、スパニングツリーを設定できます。次のコマンドを実行します。(訳注:スパニングツリーはLPIC-1の範囲外です。)# ip link add link enp0s9 name enp0s9.50 type bridge priority 50