Lesson 11

ネットワークの管理をする

Lesson 11 Chapter 1
はじめに

このレッスンでは、ネットワークの設定や状態確認をするときに使用するLinuxコマンドについて学んでいきます。

具体的には以下のことが出来るようになります。

  • 自身のコンピュータの様々な通信ルールを設定
  • 通信相手を指定したデータの送受信
  • 自身のコンピュータに接続されているネットワーク機器の確認

実際に手を動かしながら、各コマンドの役割を学んでいきましょう。

Lesson 11 Chapter 2
ネットワーク構成の確認

このチャプターでは自身のコンピューターに接続されている機器の情報を参照したり、通信方式の設定を行うコマンドについて学習していきます。

ここで紹介するコマンドは以下の通りです。

  • ifconfig
  • iptables

それでは順番に学習していきましょう。

ifconfig(アイエフコンフィグ)

ifconfigコマンドは、自身のコンピューターに接続されているネットワークインターフェース(ネットに繋がる機器)の情報を一覧で表示することが出来ます。

$ ifconfig

上記コマンドを実行すると以下のような結果が表示されます。

$ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
	options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
	inet 127.0.0.1 netmask 0xff000000
	inet6 ::1 prefixlen 128
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
	nd6 options=201<PERFORMNUD,DAD>
stf0: flags=0 mtu 1280
en5: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether ac:de:48:00:11:22
	inet6 fe80::aede:48ff:fe00:1122%en5 prefixlen 64 scopeid 0x4
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect (100baseTX <full-duplex>)
	status: active

〜〜〜 以下省略 〜〜〜

出力結果を大まかに説明すると、lo0, stf0, en5などがネットワークインターフェース名となり、 :(セミコロン)で区切られた右側の情報が各インターフェースの概要や通信状態を表す情報となっています。 ネットワークインターフェースとは主に、有線,無線,Bluetooth(ブルートゥース)などで接続された機器を指します。 また、ネットワークインターフェースにはいくつか種類があり、インターフェース名の英字の部分(lo, enなど)で判断ができます。 代表的なネットワークインターフェース名は以下のものがあります。

インターフェース名 説明
lo 自身のコンピュータのIPアドレス(localhost)
en 無線LANや有線LAN機器(Ethernet)
gif IPv4とIPv6を繋ぐトンネルインターフェース(Generic tunnel interface)
stf IPv6からIPv4に変換(Six to Four)

実際に表示されている情報には、インターフェース名の横に数字も表示されていますが、これは各インターフェースごとの接続した順番で決定されます。 また、以下のようにifconfigコマンドにインターフェース名を直接指定することで、特定のインターフェースについての情報のみを表示することができます。

$ ifconfig [インターフェース名]

以下コマンドはen5というインターフェースの情報取得の例です。

$ ifconfig en5
en5: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether ac:de:48:00:11:22
	inet6 fe80::aede:48ff:fe00:1122%en5 prefixlen 64 scopeid 0x4
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect (100baseTX <full-duplex>)
	status: active

また、オプションコマンドを使用することで、指定したインターフェースの各種設定値を変更することが出来ます。

オプション名 説明 コマンド例
up インターフェースの起動(有効化) $ ifconfig en5 up
down インターフェースの停止(無効化) $ ifconfig en5 down
add [IPアドレス] IPv6の[IPアドレス]を追加 $ ifconfig en5 add 1111:ad8:0:0:3456::
del [IPアドレス] IPv6の[IPアドレス]を削除 $ ifconfig en5 del 1111:ad8:0:0:3456::

これらのコマンドを使用し、自身のコンピュータに接続されているネットワークインターフェース機器の確認と管理をすることが出来るようになります。

iptables(アイピーテーブルズ)

パケットフィルタリングとは、コンピュータネットワークで、とある通信方法を特定のルールに基づいて遮断するものです。これは、コンピュータがインターネットに接続されている場合に、不要なトラフィックや危険なパケットを防ぐことができるため、セキュリティー上の役割を持っています。

パケットとは

パケットとはネットワーク上でデータ送信をする際に使用されるデータの単位です。 基本的にデータ送信をする際はデータを細かく分割して送受信しますが、その分割されたデータをパケットといいます。 パケットが持つ情報には、「送信元のアドレス」「送信先のアドレス」「データ本体」などが含まれます。

コマンドの基本的な使い方としては、以下のような形で実行します。

$ iptables -A [チェイン] -p [プロトコル] --dport [ポート番号] -j [ターゲット]

各項目について説明していきます。

チェイン

チェインはパケットの経路を表すもので、主に以下の3つがあります。

  • INPUT(外部から入ってくるパケットを表す)
  • OUTPUT(自身から送るパケットを表す)
  • FORWARD(自身を経由するパケットを表す)

プロトコル

プロトコルは通信方式を表すもので、コンピュータでデータをやりとりするために定められた手順や規約などです。iptablesコマンドで使用されるプロトコルには以下のものがあります。

  • tcp(ティーシーピー)
    tcpはデータを送信する前に送信元と受信側のコネクション(接続)を確立します。その後データを分割して送信し、受信側で再構成することでデータの送信を保証します。 また、データを分割して送信するため、通信速度が少し遅くなるという欠点があります。
  • udp(ユーディーピー)
    udpはデータ送信前にコネクションを確立の必要がなく、データを分割せずにデータ送信を行うため通信速度が早い特徴があります。しかし、データの再送信などを 行わないためデータ送信の保証はありません。
  • icmp(アイシーエムピー)
    icmpは送信元と受信側の通信状態の制御や調査に関するデータをやりとりする際に使用されるものです。これにより受信側に障害が発生した際に、その状態を送信元で 知ることが出来ます。
  • all(オール)
    上記のプロトコル全てが対象になります。

ポート番号

ポート番号は複数ある通信の中で、各通信を識別するための番号です。 標準的なものを例に上げると、Webページのデータをやり取りする際に使用されるHTTPというプロトコルは80番ポートに割り振られています。 0番~65535番まで割り振る事が可能ですが、HTTPのように一般的に使用されるプロトコルなどには、既に標準のポート番号が割り振られていることがあります。

プロトコル プロトコル / ポート番号
HTTP TCP / 80
HTTPS(SSL) TCP / 443
POP3 TCP / 110
IMAP TCP / 143
SMTP TCP / 25
FTP TCP / 20, 21
SSH, SFTP TCP / 22

上記の図では、右列も左列もプロトコルという表記になっていて少し分かりづらいと思いますので、もう少し詳しく説明していきます。

HTTPを例に簡単に説明すると、HTTPという通信方式で内部的に実際に使用しているプロトコルが TCPであるという事です。 ユーザーに近い上層階で使用されている"表向きのプロトコル"はHTTPですが、もう一段下の階層(内部)では TCPを使用して通信が行われています。

ターゲット

ターゲットは、これまでに指定した「チェイン」「プロトコル」「ポート番号」で決めた通信方式を実際にどうするかを指定します。

  • ACCEPT(パケットを通す)
  • DROP(パケットを破棄する)
  • QUEUE(パケットをユーザ空間に渡す)
  • RETURN(指定したチェインを辿ることを中断し、呼び出し元のチェインの次のルールから再開する)

ここまでの説明を踏まえて、以下のコマンドを見てみましょう。

$ iptables -A INPUT -p tcp --dport 443 -j ACCEPT

このコマンドから次のようなルールが読み取れます。

-A INPUTは受信するパケットを指定し、-p tcpTCPというプロトコルを指定しています。また、ポート番号は --dport 443で 443番ポートを指定し、最終的にこれらの通信を -j ACCEPTで「許可」しています。 ちなみにTCPの443ポートというのは一般的にHTTPS(HTTPを暗号化した通信方式)のことを表します。 このようにiptablesコマンドを使用することで、自身のコンピュータに様々な通信ルールを設定出来るようになります。

Lesson 11 Chapter 3
ネットワーク通信と応答結果の出力

このチャプターでは実際にネットワーク通信を利用して、ネットワークの疎通を確認したり、通信相手の状態確認やデータの送受信を行うコマンドについて学習していきます。

ここで紹介するコマンドは以下の通りです。

  • ping
  • traceroute
  • nc
  • dig
  • nslookup
  • curl
  • tcpdump

それでは順番に学習していきましょう。

ping(ピング)

pingコマンドは指定した送信先とのネットワークが接続されているかどうかを確認するコマンドです。送信先の指定方法としては、IPアドレスやドメイン名を指定して確認ができます。 ドメインとは、英数字などで表記されるIPアドレスを分かりやすくするために付けた名前のようなものです。 インターネット上に存在するWebサイトのURLを見てみると、そのWebサイトで使用しているドメインを確認することが出来ます。(例: GoogleホームページのURLはhttps://google.comであり、ドメインはgoogle.comとなる)

それでは実際にpingコマンドの使い方を説明します。コマンドは以下の通りです。

$ ping [対象のIPアドレス]
$ ping [対象のドメイン]

試しにGoogleのドメインを指定して疎通確認をしてみると、以下のようにレスポンス(応答結果)が表示されます。

$ ping google.com
PING google.com (142.250.207.46): 56 data bytes
64 bytes from 142.250.207.46: icmp_seq=0 ttl=116 time=5.768 ms
64 bytes from 142.250.207.46: icmp_seq=1 ttl=116 time=13.649 ms
64 bytes from 142.250.207.46: icmp_seq=2 ttl=116 time=8.985 ms
〜 以下省略 〜

出力結果に記載されている項目には以下のものがあります。

項目名 説明
time 指定したアドレスにICMPエコーリクエストを送信し、応答を受け取るまでの時間
bytes 送信されるデータの容量(バイト数)
icmp_seq 応答のあった通信の連番
ttl そのパケットが経由できるルーターの最大数

ttl(Time To Live)とはパケットのライフポイントの様なもので、ルーターを経由するごとに1ずつ減少する値です。つまり、そのパケットが経由できる最大のルーターの数を示しています。 これは、パケットがループ(ネットワーク上を永遠に移動)しないようにするために使用されます。もしも、送信したパケットが返ってくるまでにttlの値が0になった場合は、送信元にエラーメッセージとしてttlが0になったことが知らされます。
以上がpingコマンドを使用した、ネットワーク接続確認方法になります。

traceroute(トレースルート)

tracerouteコマンドは、指定した送信先への通信経路を調査するコマンドで、pingと同様に送信先をIPアドレスかドメイン名にて指定します。

$ traceroute [対象のIPアドレス]
$ traceroute [対象のドメイン]

実際の通信の中で送信先へ行くまでに経由するルーターやサーバーで応答があったIPアドレスを順番に表示します。 こちらも試しにgoogle.comドメインを指定して通信経路を見ていきます。実際のコマンドと実行結果は以下の通りです。

$ traceroute google.com
traceroute to google.com (142.251.42.174), 64 hops max, 52 byte packets
 1  172.20.10.1 (172.20.10.1)  3.840 ms  3.995 ms  2.641 ms
 2  * * *
 3  10.60.84.121 (10.60.84.121)  59.509 ms  49.115 ms  43.133 ms

〜 途中省略 〜

16  64.233.175.11 (64.233.175.11)  46.181 ms  67.585 ms
    nrt12s46-in-f14.1e100.net (142.251.42.174)  29.833 ms

パケットのデータサイズ(byte)や応答時間(ms)など、google.comとの通信の際に経由した機器のIPアドレスなどが順番に表示されています。 1番が自分のルーターを示すIPアドレスとなっており、一番最後の行に表示されているIPアドレスが、送信先として指定したgoogle.comのIPアドレスとなります。
このようにしてネットワーク通信の際に、送信先に到達するまでに経由するルーターの情報を確認することが出来ます。

nc(ネットキャット)

ncコマンドはコンピューターやネットワークを利用して、TCPやUDPを使ったデータ通信を行うためのコマンドです。 通常、Webサーバーにアクセスする際にはHTTPプロトコルを使用しますが、ncコマンドを使用することでHTTPプロトコルを使わずに、Webサーバーにアクセスすることもできます。また、他のコンピューターやデバイス(機器)との通信を監視することもできます。 このコマンドは、データの送信側と受信側の両方がncコマンドを実行する必要があり、リクエスト受信側は-lオプションと、通信を受け付けるポート番号を指定して実行することで、待機モードになります。

$ nc -l -p [ポート番号]

リクエスト送信側は接続先のIPアドレスとポート番号を指定します。

$ nc [対象のIPアドレス] [対象のポート番号]

これらのコマンドを送信側と受信側で実行することで、双方データ通信が可能になります。 まずは送信側が受信側に用意されているファイルを取得する流れを記述します。

【受信側】
$ nc -l [ポート番号] > [ファイルの保存先パス]

【送信側】
$ nc [対象のIPアドレス] [ポート番号] 

これらのコマンドを使用して、どのような結果が得られるか確認してみましょう。
以下の条件で実際にncコマンドを使って通信をします。

  • 受信側のIPアドレスはlocalhost(localhostの説明は後述します)
  • 受信側が開放するポート番号は1234
  • 送信するファイルは"Hello!"という文字が記述されたhello.txtファイル
  • 受信した内容はoutput.txtファイルに出力(中身は空)

localhostについて

本来、2つの異なるコンピュータ間で使用されるncコマンドですが、今回のようなテストをする場合、ターミナルを複数立ち上げることで、自身のコンピュータのみで送信側と受信側を担うことが出来ます。
この場合、IPアドレスは自分自身を示すlocalhostを使用することが出来ます。ここではテストのため、IPアドレスの箇所をlocalhostと指定します。

1. 【受信側】ポートの開放と出力先を指定する。

$ nc -l 1234 > output.txt

2. 【送信側】hello.txtファイルを送信する。

$ nc localhost 1234 

3. 【受信側】catコマンドを使用してoutput.txtの内容を出力する。

$ cat output.txt
Hello!

Hello!というテキストが受け取れている事が確認できます。
このようにncコマンドを使用することで、手軽にデータ通信を行うことが出来るようになります。

dig(ドメインインフォメーショングロッパー)

digコマンドは、インターネット上に存在するドメイン名やIPアドレスを調べることができるコマンドです。 インターネット上には多くのドメイン名やIPアドレスが存在しており、それらの情報を管理するのがDNS(ドメインネームシステム)と呼ばれるものです。DNSはドメイン名とIPアドレスとドメイン名を紐付けるもので、その情報がDNSレコードに保持されています。

digコマンドは以下のように実行します。

$ dig [対象のドメイン名]

このコマンドを実行することで、対象のドメイン名に関連するDNSレコードを取得することができます。 google.comを対象にIPアドレスを調べる場合は、以下のように実行します。

$ dig google.com

; > DiG 9.10.6 > google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER

digコマンドの結果は、 OPT PSEUDOSECTION,QUESTION SECTION, ANSWER SECTIONなど各セクションごとの応答結果が以降に表示されています。 出力結果を確認すると、google.com のIPアドレスは ANSWER SECTIONに表示されている 172.217.175.110ということが確認できます。

nslookup(エヌエスルックアップ)

nslookupコマンドは対象アドレスのDNSの構成やドメイン名、IPアドレスに関する情報をDNSサーバーから取得することができます。 digコマンドと同じようにDNSサーバーに問い合わせを行いますが、出力結果をより人間にとって理解しやすい形で表示することが出来るといった特徴があります。

nslookupコマンドは以下のように実行します。

$ nslookup [対象のドメインなど]

こちらもgoogle.comに向けてコマンドを実行してみます。

$ nslookup google.com
Server:		240d:1a:cd7:7d00:4a3e:5eff:feed:8090
Address:	240d:1a:cd7:7d00:4a3e:5eff:feed:8090#53

Non-authoritative answer:
Name:	google.com
Address: 142.250.207.46

このように「google.com」というドメイン名は「142.250.207.46」というIPv4アドレスに紐付いているということが分かります。 また、 nslookupコマンドはインタラクティブモードというものがあります。インタラクティブモードでは、コマンドプロンプト上で nslookupコマンドを追加のコマンドを入力しながら実行することで、情報を取得することができます。

試しに、インタラクティブモードを使用してgoogle.comのAレコードを取得していきます。まずは nslookupのみで実行します。

$ nslookup
> 

すると>が表示され、入力待ち状態になっている事が確認できます。この状態で、取得する情報のタイプを入力・実行します。

$ nslookup
> set type=A
> 

主なレコードタイプには以下のものがあります。

タイプ 説明
A(Address Record) ドメイン名に対応するIPアドレスを示す
PTR(Pointer Record) IPアドレスに対応するドメイン名を示す
MX(Mail Exchange Record) メールの配信先となるサーバーのドメイン名やIPアドレスを示す
CNAME(Canonical Name Record) 他のドメイン名へのエイリアスを示します

では、次の>が表示されるので対象のドメインを入力・実行します。

$ nslookup
> set type=A
> google.com

Server:		2408:210:9728:7800:225:36ff:fec5:5ee4
Address:	2408:210:9728:7800:225:36ff:fec5:5ee4#53

Non-authoritative answer:
Name:	google.com
Address: 172.217.161.78

このように必要な入力が実行されると、DNSサーバーから情報が返されます。 このチャプターでnslookupコマンドを初めて学び、これから使用する際には是非、インタラクティブモードを使用して各入力値の意味などを理解しながら学習を進めてみましょう。

curl(カール)

curlコマンドは、WebサイトやAPIなどのURLからデータを取得するために使用されるコマンドとして頻繁に使用されます。また、HTTPやHTTPSなどのプロトコルを使用してデータを転送することができます。

curlコマンドは以下のように実行します。

$ curl [対象のURL]

こちらも試しにGoogleホームページのURLへリクエストを送ってみます。

$ curl https://www.google.com
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja">
<head><meta content="
〜 以下省略 〜 

とても長い文字列がレスポンスとして返ってきましたが、これは実際にリクエストしたGoogleホームページのHTMLになります。 APIにリクエストを送った場合、そのAPIが持つ処理結果や特定のデータをレスポンスとして受け取ることが出来ます。 API(Application Programming Interface)とは、プログラムから別のプログラムやサービスにアクセスするためのインターフェイスのことです。APIを使用することで、第三者が提供している複数のプログラムやサービスを利用することができます。

例えば、Google MapsのAPIでは地図や位置情報を取得したり、YoutubeのAPIでは動画情報を取得したりすることができます。 また、HTTPリクエストにはメソッドと呼ばれる通信タイプが存在しますが、-Xオプションでメソッドを指定することが出来ます。各メソッドの役割は以下の通りです。

メソッド 説明
GET サーバーからデータを取得する
POST サーバーにデータを送信する
PUT サーバーにデータを更新する
DELETE サーバーからデータを削除する

先程のGoogleへの問い合わせでは、GETメソッドによってページのHTMLを取得しているため、-Xオプションを使用して厳密にメソッドを定義すると以下のようになります。

curl -X GET https://www.google.com

このコマンドでも、変わらずHTMLがレスポンスとして返っていることが確認できます。 このようにcurlコマンドを使用することで、サーバーから特定のデータを取得したり、データ更新の要求などをすることが出来るようになります。

tcpdump(ティーシーピーダンプ)

tcpdumpコマンドはコンピューターやネットワークを利用して、ネットワークトラフィックを監視するためのコマンドです。 ネットワーク上で送信されているパケットを取得し、内容を表示することができます。

$ tcpdump [オプション]

主なオプションとしては以下のものがあります。

オプション 説明
-A パケットの内容をASCIIコードで表示
-nn ホスト名やポート番号を変換せずに表示
-w 取得した結果をファイルに保存
-r -wで出力したキャプチャ結果を読み込んで表示
-i ネットワークインターフェースを指定してパケットを取得する

以下コマンドはeth0というインターフェースを対象に「22番ポート」を指定してパケットを監視をしています。

$ tcpdump -i eth0 port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
23:10:50.112177 IP example.jp.ssh > hoge.com.62934: Flags [P.], seq 32718:72830, ack 3277,
 win 2641, options [nop,nop,TS val 109623997 ecr 553388297], length 112

eht0というネットワーク・インターフェースが22番ポート上で行っている、ネットワーク通信の情報(通信相手や時間など)を確認することが出来ます。

ここまでお疲れさまでした。以上がLinuxコマンドを使用した、ネットワーク構成の設定や確認、ネットワーク通信を利用した応答結果の確認やデータ送信の方法でした。 このレッスンで学んだ内容は主に、インフラ(サーバーの構成管理)などに使用されることが多いので、そちらに興味がある方はさらに知識を深めていきましょう。