参考資料:Linux研修【ハンズオン】ネットワークの基礎を学ぼう! / ネットワークインターフェイスとDNSの設定

2021年7月15日開催のLPI-Japan主催の技術解説セミナー「Linux研修【ハンズオン】ネットワークの基礎を学ぼう! / ネットワークインターフェイスとDNSの設定」の参考資料になります。

このハンズオンを通じて、ネットワーク関連知識や、ネットワーク関連コマンドを実行し、理解を深めていただければ幸いです。

セミナー終了後、後日YouTubeのLPI-Japanチャンネルにセミナー動画が公開されますので、そちらの資料としてもご活用いただけます。

KatacodaのLinux Playgroundを実行

今回のハンズオンでは途中まで、KatacodaのLinux Playgroundを2つ使用します。以下のサイトにアクセスして「Ubuntu 20.04 Playground」と「CentOS Playground」を実行してください。

https://www.katacoda.com/courses/ubuntu/playground2004

https://www.katacoda.com/courses/centos/playground

実行するとしばらくしてBashターミナルが表示されます。左メニューに「Hello World」が表示されていればOKです。

「Hello World」表示が邪魔なので、右のコンソール画面との境目をクリックしたまま左にドラッグしておきます。最も縮小された場合はStepsという表示のみになります。

右上角にある設定アイコンをクリックすると、テキストを拡大できるPresentation Modeやバックグラウンドカラーを変更するLight Color Schemeが利用可能です。

プレイグラウンドの状態確認Ÿ

KatacodaのUbuntu Playgroundでは特権ユーザ(root)も一般ユーザもプロンプトが$(ダラーマーク)表示のままなのでご注意ください。今回は情報を把握しやすいようにexportコマンドでターミナルの表示を変更しておきます。

export PS1="[\u@$HOSTNAME \w]$"

以降、特権ユーザ(root)権限で実行する必要があるコマンドの場合は便宜上$マークでは無く、#マークで表記します。

unameコマンドなどで、2つのプレイグラウンドのシステム情報を確認しておきましょう。

uname –a
cat /etc/os-release

以降、2つのプレイグランドでそれぞれコマンドを実行してみてください。

1.07.2 基本的なネットワーク構成

ホスト名の確認

/etc/hostnameファイル

­ホスト名が格納されているファイルです。catやviで内容を確認できます。

cat /etc/hostname

hostnameコマンド­

ホスト名を設定・変更するコマンドです。引数をホスト名として設定します。再起動すると元に戻ります。引数無しで現在のホスト名を表示します。引数無しは一般ユーザでも実行可能です。

$ hostname
# hostname xxx.yyy.zzz

/etc/hostファイル

­ホスト名とIPアドレスの対応が記述されているファイルです。catやviで内容を確認できます。RedHat系とDebian系で表示内容が異なります。

cat /etc/hosts

元々、名前解決はこの/etc/hostsの記述に則って行われていました。インターネットが普及しホスト名が加速度的に増大し埒があかなくなりDNSが開発された経緯があります。小規模な検証環境などではホストを/etc/hostsで設定すれば手軽に名前解決が行えます。参考:Linux豆知識 176「/etc/hosts」ファイル

getentコマンド

­ネームサービスのデータベースを表示するコマンドです。/etc/hostsファイルの内容を表示します。

getent hosts

参考までに、getent passwdで/etc/passwdの内容を表示します。

/etc/nsswitch.confファイル

­ホスト名の名前解決の順番を指定する設定が記述されているファイルです。catやviで内容を確認できます。

cat /etc/nsswitch.conf

hostsの項目が以下のような内容であった場合は、/etc/hostsの内容を検索して、見つからなかった場合にDNSサービスを受けることになります。RedHat系とDebian系で表示内容が異なりますが、ほとんどのディストリビューションではDNSよりも/etc/hostsを優先して名前解決を行います。

grep hosts /etc/nsswitch.conf
(Debian系)
hosts: files dns
(RedHat系)
hosts: files dns myhostname

hostnamectlコマンド(試験範囲外)

hostnamectlコマンドは引数なしで実行するとホスト名と関連情報を表示できます。 Virtualizationの項目がkvmになっているはずです。KVMはLinuxの代表的な仮想化ソリューションです。

hostnamectl

ネットワークの設定

一般的にはNetworkManagerサービスで提供されるnmcli/nmtuiツールを使用します。

なお、KatacodaのLinuxインスタンスでは、Ubuntu 20.04を含む一部のPlayground上でnmcli/nmtuiツールが利用できますが、CentOSを含むその他のPlaygroundでは利用できない場合があります。

nmcliコマンド

コマンドラインベースでネットワーク設定を管理するツールがnmcliです。nmtuiと比べてより詳細な設定が行えます。

$ nmcli

引数無しで実行すると、現在のネットワークデバイスの基本情報を表示します。

また、nmcliと入力した状態でTabキーを押すと扱えるオブジェクトが表示されるので、内容に応じて使い分けます。

$ nmcli
agent device help networking
connection general monitor radio
$ nmcli general
help logging reload
hostname permissions status
$nmcli general status
STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN
connected unknown enabled enabled enabled enabled 

以下、一例。

# nmcli general {status|hostname|hostname ホスト名}
# nmcli networking {on|off|connectivity [check]}
# nmcli radio {wifi [on|of]|wwan [on|off]|all [on|off]}
# nmcli connection {show [-active]|modify インターフェース パラメータ|{up|down} ID}
# nmcli device {status|show インターフェース|modify インターフェース パラメータ|{connect|disconnect} インターフェース|delete インターフェース|monitor インターフェース|wifi list|wifi connect SSID など}
# nmcli general hostname hogehoge01

nmtuiコマンド

­ターミナル上でネットワークの設定をGUIで直感的に行えるコマンドです。GUI画面が特徴的で、カーソルキーやTabキーででメニューを移動して、Enterキーで入力内容を決定したりできます。一般ユーザでも使えますが設定の変更はできません。

nmtui

コマンドを実行し、Edit a connectionを選択後、Enterキーで内容を色々確認してみましょう。また、Set System hostnameでホスト名を変更できるか試してみましょう。

なお、CentOS7以降であれば、実機またはVirtualBoxやVMwareなどの仮想環境で問題無くNetworkManagerが使えますので、環境が揃えられる場合は是非試してみてください。


Katacodaのインスタンスを変更

ここからKatacodaのインスタンスを変更します。Networkingコースの「Deploying WeaveNet」を実行してください。

このインスタンスを使うと、ホストを2つ同時に操作できます。画面上でもターミナルが上下2つに分割されます。以降は、2つのターミナルを状況に合わせて操作していきます。念のため、hostnameコマンドでホスト名を確認してきます。

hostname

ターミナルが$マークだけで区別しにくいので、両方のホストで登録済みの一般ユーザ(packer)に特権ユーザ(root)からスイッチします。

su - packer

一般ユーザにスイッチするとホスト名が表示され認識しやすくなります。

ネットワークの状況確認

ネットワークの状態を把握するには、ipコマンドを含むiprouteパッケージ(iproute2ユーティリティ)や、routeやifconfigコマンドなどが含まれるnet-toolsパッケージなどを利用します。昨今はnet-toolsよりもiprouteパッケージの利用が推奨されています。

(Debian)
dpkg -s iproute2
dpkg -s net-tools
(RedHat)
rpm -qi iproute
rpm -qi net-tools

dpkgコマンドやrpmコマンドで両パッケージに含まれるコマンドの内容が確認できます。

(Debian)
dpkg -L iproute2 | grep bin
dpkg -L net-tools | grep bin
(Red-hat)
rpm -ql iproute | grep bin
rpm -ql net-tools | grep bin

ipコマンド(iproute)

ネットワークインターフェースやルーティングテーブルを管理するコマンドです。操作対象は省略形が使えます。

­ip 操作対象 [サブコマンド]

IPアドレスの確認

ip addr show
ip addr
ip a

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

ip route show
ip route
ip r

2つのホストのIPアドレスとルーティングテーブルを確認しておきましょう。

ip a
ip r

ip aとip rの結果から、2つのホストが同じネットワークに属していることが確認できるはずです。

データリンク層の確認

ハードウェアアドレス(MACアドレス)など、ネットワークインターフェースの状態が確認できます。

ip link show
ip link
ip l

KatacodaのUbuntuインスタンスのネットワークインターフェースはens3なのでその情報を表示します。

ip l sh ens3

IPアドレスの設定例

# ip addr add 172.17.0.xxx/16 dev ens3

Katacodaでは設定するipアドレスによってはインスタンスが動かなくなるのでハンズオン当日は実行しません。興味のある方は別途時間を作って試してみてください。

デフォルトゲートウェイの設定例

# ip route add default via 172.17.0.xxx

Katacodaでは設定するipアドレスによってはインスタンスが動かなくなるのでハンズオン当日は実行しません。興味のある方は別途時間を作って試してみてください。

ifconfigコマンド(net-tools)

ネットワークインターフェースの設定や管理ができるコマンドです。引数無しでネットワーク情報を表示します。

­ifconfig [ネットワークインターフェース] [パラメータ]

引数無しのifconfigを実行してみましょう。オプション-aは全てのインターフェースを表示、-sは短い形式で表示です。また、特に使わないDocker用の仮想インターフェースを入り切りして状態を確認してみます。

ifconfig
ifconfig -a -s
ifconfig docker0 down
ifconfig
ifconfig docker up
ifconfig

以下はIPアドレスとサブネットマスクの設定をする場合の例です。Katacodaでは設定するipアドレスによってはインスタンスが動かなくなるのでハンズオン当日は実行しません。興味のある方は別途時間を作って試してみてください。

# ­ifconfig eth0 172.17.0.xxx netmask 255.255.0.0

ifup/ifdownコマンド

ネットワークインターフェースの設定や管理ができるコマンドです。

# ifup [ネットワークインターフェース]
# ifdown [ネットワークインターフェース]

試しにループバック用インターフェース(lo)を入り切りして状態を確認してみます。

ifdown lo
ifconfig
ifup lo
ifconfig

注:Katacodaでは設定するipアドレスによってはインスタンスが動かなくなる可能性がありますのでご注意ください。

routeコマンド(net-tools)

ルーティングテーブルを確認するコマンドです。後述のnetstat -r と同じ結果が表示されます。

route
netstat -r

ルーティングテーブルの編集にも使えます。以下は一例です。

# route {add|del|他} –net 192.168.xxx.xxx netmask 255.255.255.0 dev xxx

注:Katacodaでは設定するipアドレスによってはインスタンスが動かなくなる可能性がありますのでご注意ください。

pingコマンド

­ネットワークの疎通を確認するコマンドです。プロトコルはICMPです。-cオプションで回数を指定できます。

­ping [オプション] ホスト名またはIPアドレス

試しに、LPI-Japanのサーバの疎通確認をしてみましょう。

ping -c 3 lpi.or.jp
ping -c 3 linuc.org

次に2つのホスト間でpingを実行してみましょう。

(host01側)
ip a
ping -c 3 [host02のIPアドレス]
ping -c 3 host02
(host02側)
ip a
ping -c 3 [host01のIPアドレス]
ping -c 3 host01

host01やhost02といったホスト名でもpingが通るのはetc/hostsで名前解決できているからです。

1.07.3 基本的なネットワークの問題解決

ネットワークの状況を表示

netstatコマンド

­TCP/UDPのポート、ソケットの状態、ルーティング情報などを表示するコマンドです。

netstat [オプション]
オプション内容
-a全てのソケット情報
-iネットワークインターフェースの状態
-l待ち受けているポート
-nアドレスやポートを数値で表示
-pPIDとプロセス名
-rルーティングテーブルを表示
-ttcpポートを表示
-uudpポートを表示
-4ipv4を表示
-6ipv6を表示

TCPのソケット状態を全て表示。

netstat -ant

開いているTCPポートを表示。

netstat -lt

ルーティングテーブルを表示。

netstat -r

ssコマンド(iproute)

ss [オプション]
オプション内容
-a全てのソケット情報
-l待ち受けているポート
-nアドレスやポートを数値で表示
-pPIDとプロセス名
-ttcpポートを表示
-uudpポートを表示
-4ipv4を表示
-6ipv6を表示

以下、netstatと同じオプションを指定して実行してみましょう。(-rは結果が異なりますので実行しません)

ss -ant
ss -lt
net-toolsパッケージとiprouteパッケージの比較

昨今はnet-toolsよりもiprouteパッケージの利用が推奨されていますが、試験ではどちらも出題され同じ設定内容を選択する問題などが多いようです。

net-toolsiproute2
ifconfig -aip addr show
ifconfig インターフェース {down|up}ip link set インターフェース {down|up}
ifconfig インターフェース IPアドレス netmask ネットマスク値ip addr add IPアドレス(/CIDR値) dev インターフェース
ifconfig インターフェース  mtu mtu値ip link set インターフェース mtu mtu値
netstat –rip route show
routeip route show
route {add|del} default gw ゲートウェイアドレスip route {add|del} default via ゲートウェイアドレス
route {add|del} {–net|-host} 宛先 netmask gw ゲートウェイアドレス インターフェースip route {add|del} 宛先 via ゲートウェイアドレス
arp -aip neigh
netstat [-a,-n,-t,-u,-n]ss [-a,-n,-t,-u,-n]

tracerouteコマンド ­

ネットワークの経路を表示するコマンドです 。ネットワーク障害の発生が考えられる場合、経路上のルータの応答の有無を確認することでトラブルの原因を切り分けなどに使います。

traceroute ホスト名またはIPアドレス

Ubuntuインスタンスではインストールが必要です。以下、実行例。

sudo apt install traceroute
traceroute lpi.or.jp
traceroute to lpi.or.jp (219.94.215.12), 30 hops max, 60 byte packets 1 gateway (192.168.0.1) 0.465 ms 0.483 ms 0.464 ms 2 (中略) 6 tkort3-as2518.bb.sakura.ad.jp (157.17.131.105) 11.431 ms 11.639 ms 11.553 ms 7 tkort4-ort3.bb.sakura.ad.jp (157.17.130.122) 15.805 ms 11.936 ms 11.803 ms 8 oshrt1-tkort4.bb.sakura.ad.jp (157.17.131.102) 17.983 ms 18.370 ms 18.338 ms 9 osnrt1s-hrt1.bb.sakura.ad.jp (157.17.146.30) 21.398 ms osnrt201s-hrt1-3.bb.sakura.ad.jp (157.17.146.90) 18.213 ms 18.102 ms
10 osnrt204b-nrt201s.bb.sakura.ad.jp (157.17.146.129) 19.036 ms osnrt203b-nrt201s.bb.sakura.ad.jp (157.17.146.37) 18.985 ms osnrt203b-nrt1s.bb.sakura.ad.jp (157.17.146.33) 18.258 ms
11 osnrt123e-nrt204b.bb.sakura.ad.jp (157.17.150.78) 27.170 ms osnrt123e-nrt203b.bb.sakura.ad.jp (157.17.149.78) 27.168 ms 28.728 ms
12 12.215.94.219.static.www232b.sakura.ne.jp (219.94.215.12) 17.760 ms 17.724 ms 19.017 ms

注:Katacodaのインスタンスではパケットが通過するルーターは一切表示されないようです。

tracepathコマンド

­ネットワークの経路を表示するコマンドです。ネットワーク障害の発生が考えられる場合、経路上のルータの応答の有無を確認することでトラブルの原因を切り分けなどに使います。

tracepath ホスト名またはIPアドレス[/ポート番号]

以下、実行例。

tracepath lpi.or.jp
1?: [LOCALHOST] pmtu 1500 1: gateway 0.487ms 1: gateway 0.467ms 2: gateway 0.480ms pmtu 1454
(中略) 6: tkort3-as2518.bb.sakura.ad.jp 12.412ms 7: tkort4-ort3.bb.sakura.ad.jp 12.545ms 8: oshrt1-tkort4.bb.sakura.ad.jp 20.595ms asymm 9 9: osnrt201s-hrt1-1.bb.sakura.ad.jp 19.378ms
10: osnrt203b-nrt201s.bb.sakura.ad.jp 19.792ms
11: osnrt123e-nrt203b.bb.sakura.ad.jp 20.051ms
12: 12.215.94.219.static.www232b.sakura.ne.jp 21.852ms reached Resume: pmtu 1454 hops 12 back 12 

注:Katacodaのインスタンスではパケットが通過するルーターは一切表示されないようです。

hostnameコマンド

­既出ですが、ホスト名の設定・変更ができるコマンドです。

hostname ホスト名

nmapコマンド

オープンしているポートの状況を表示するコマンドです。

nmap ホスト名

Ubuntuインスタンスではインストールが必要です。インストールができない場合はapt updateを実行後に再度試してみましょう。

sudo apt update
sudo apt install nmap
nmap localhost
nmap host01
nmap host02

nc(netcat)コマンド

TCP/UDPを使ったネットワーク通信を行うコマンドです。オープンしているポートの状況も表示できます。

nc [オプション] [ホスト名/IPアドレス] [ポート番号]
オプション内容
-4IPv4アドレスのみを利用
-6IPv6アドレスのみを利用
-p ポート番号接続元のポート番号を指定
-uudpポートを表示
-v詳細に出力する
-zポートスキャンする

host01側からhost02の1番ポートから128番ポートまでをTCPポートスキャンしてみましょう。-vと-zオプションで実行します。先述のnmapコマンドの結果と見比べてみましょう。

(host01)
nc -vz host02 1-128

-lオプションでクライアントサーバモデルを体験できます。

以下の例では、host01の65432ポートを空けてデータ通信を待ち、host02側でhost01の65432ポート宛てにHello Worldというメッセージを送信しています。

(host01)
nc -l 65432
(host02)
echo "Hello World" | nc host01 65432

ホスト間でSSH接続を実行

LinuCレベル1バージョン10では、主題1.01:Linuxのインストールと仮想マシン・コンテナの利用の副題1.01.1 Linuxのインストール、起動、接続、切断と停止において、Linuxシステムに鍵を使ってSSH接続し正常に切断できるスキルが求められることになりました。

Katacodaの今回のインスタンスはホスト2台が同じネットワークにあり、互いの通信のやりとりがわかりやすいのでssh接続を実行してみましょう。

元々インスタンスではSSH自体は使えますが、鍵が無いので鍵の生成と登録が必要になります。

以下、host01で鍵を生成し、host02に公開鍵を登録後、host02にSSH接続した上でhost02側の鍵の生成とhost01への公開鍵登録を行います。

(host01)
ls -a
ssh-keygen
ls -a
ls .ssh
ssh-copy-id host02
ssh host02
[host02のターミナルに切り替わる]
tty
w
ls .ssh
cat .ssh/authorized_keys
ssh-keygen
ssh-copy-id host01
exit
[host01のターミナルに戻る]
(host02)
tty
ssh host01
netstat -ant
w

1.07.4クライアント側のDNS設定

hostコマンド

リモートDNSサーバーに問い合わせするコマンドです。

­host [オプション] ホスト名/ドメイン名/IPアドレス[DNSサーバ] 

オプション
-t : タイプ:検索タイプを指定
-C : SOAレコードを表示

検索タイプ
a : Aレコード →IPv4アドレス
ns : NSレコード →ネームサーバ
mx : MXレコード →メールサーバ
soa : SOAレコード →ゾーンの権威情報

host -t a lpi.or.jp
host -t ns lpi.or.jp
host -t mx lpi.or.jp
host -t soa lpi.or.jp
host -C lpi.or.jp

digコマンド

リモートDNSサーバーに問い合わせするコマンドです。

­dig [オプション] [@DNSサーバ] ホスト名/ドメイン名/IPアドレス [検索タイプ]

オプション
-x : 逆引きで問い合わせ

検索タイプ
a : Aレコード →IPv4アドレス
ns : NSレコード →ネームサーバ
mx : MXレコード →メールサーバ
soa : SOAレコード →ゾーンの権威情報

dig lpi.or.jp a
dig lpi.or.jp ns
dig lpi.or.jp mx
dig lpi.or.jp soa
dig -x 219.94.215.12

/etc/resolv.confファイル

問い合わせるDNSサーバーを指定するファイルです。catやviで内容を確認、編集できます。

cat /etc/resolv.conf

­domain:自分が所属するドメイン名を指定(ドットがない)
­search:所属ドメイン名に付加するドメイン名を指定
nameserver:問合せするDNSサーバのIPアドレスを指定(最大3つ)

Katacodaのインスタンスでは標準でGoogleのDNSサーバを設定しています。digコマンドで他のネームサーバを指定して結果を見比べてみましょう。

dig @1.1.1.1 lpi.or.jp ns
dig @01.dnsv.jp lpi.or.jp ns

/etc/nsswitch.confファイル

既出ですが、名前解決の実行順序を確認したり変更するためのファイルです。catやviで内容を確認、編集できます。

cat /etc/nsswitch.conf
grep hosts /etc/nsswitch.conf

以上でセミナーのハンズオンパートは終了です。