Linux リテラシ - 第5回 ネットワーク

だっつ

今回はネットワーク全般についての基本的な事を取り上げます。今回の内容は Linux だけでなく、Windows や他の OS にも共通した内容もあるのでぜひ理解しておいてください。

ネットワークの基本概念

プロトコル

プロトコル とは、HTTP や FTP などのように、ネットワークを介して通信する上でお互いに決められた約束事です。日本語しか使えない人と英語しか使えない人がうまく会話できないのと同じように、対応しているプロトコルが違うと正しく通信することができません。
また、HTTP や FTP は TCP (Transmission Control Protocol) という別のプロトコルの上に成り立っていて、さらに TCP 自体も IP (Internet Protocol) というプロトコルの上に成り立っています。このようにいくつものプロトコルが積み重なっている構造を プロトコルスタック と呼びます。

IP アドレス

コンピューターをインターネットに接続すると、そのコンピューターを識別するために IP アドレス が割り当てられます。これは、住所や電話番号に相当するもので、以下のように表現される 32ビットのデータです。

133.25.90.36
66.102.7.99

これに加え、同時に複数のコンピューターと通信するために ポート と呼ばれる補助的な識別子が用いられます。これは、1 ~ 65535 までの数字であらわされるので ポート番号 とも呼ばれます。電話にたとえると、ひとつの番号に 外線1外線2 があるようなものです。

TCP/IP の主要なプロトコルが慣例的に使用するポートを ウェル ノウン (Well-Known) ポート と呼び、次のようなものが有名です。

ポート番号 プロトコル サービス
20 FTP データ送受信
21 FTP コマンド送受信
22 SSH リモートシェル
25 SMTP Eメール送信
110 POP Eメール受信
80 HTTP World Wide Web

IP アドレスの種類

IP アドレスには、 グローバル アドレスローカル (プライベート) アドレス があります。

グローバル アドレス
インターネット全体で一意のアドレス。公的な機関にあらかじめ申請する必要がある。
ローカル アドレス
LAN など、同一のネットワーク内で有効なアドレス。自由に割り当てることができる。

グローバルアドレスを管理する機関は各国にあり、日本の場合は JPNIC に申請可能です。また、ローカルアドレスは慣例的に 192.168.0.1 ~ 192.168.0.255 や 192.168.1.1 ~ 192.168.1.255 などが良く用いられます。

サブネット

インターネットのようなネットワークは大規模すぎて一元的に管理するのは不可能です。そこで用いられるのが サブネットです。
サブネットは、大きなネットワークを分割管理する際の管理単位となる小さなネットワークです。コンピューターがどのサブネットに属しているかは、割り当てられた IP アドレスを調べることでわかります。その際に必要なのが ネットマスク です。また、IP アドレスは 2 つの部分で構成されていて、それぞれを ネットワーク アドレスホスト アドレス と呼びます。

ネットワーク アドレス
IP アドレスの上位のビットで表現される。コンピューターが所属するサブネットを識別するアドレス。
ホスト アドレス
IP アドレスからネットワークアドレスを除いた残りの部分。サブネット内でコンピューターを識別するアドレス。
ネットマスク
IP アドレスのどこまでがネットワークアドレスで、どこからがホストアドレスかをあらわす。

たとえば、IP アドレスが 「192.168.1.54」で、ネットマスクが「255.255.255.0」だとします。それぞれを 32 ビットの2進数であらわすと、それぞれ「11000000101010000000000100110110」「11111111111111111111111100000000」となります。これらのビットごとの論理積をとると「11000000101010000000000100000000」となり、ネットワークアドレスが「192.168.1.0」、ホストアドレスが「54」であることがわかります。
ネットワークアドレスの表現として、「192.168.1.0/24」のようなものがあります。これは、「ネットワークアドレスが 192.168.1.0 で、IP アドレスの上位 24 ビットがネットワークアドレスである」ネットワークを表すので、あわせて覚えておいてください。

特殊な IP アドレス

上記のほかに ループバック アドレスブロードキャスト アドレス と呼ばれる特殊な IP アドレスが存在します。

ループバック アドレス

ループバックアドレスとは どのネットワークに所属しているかにかかわらずコンピューター自身を表すアドレス で、一般に「127.0.0.1」が用いられます。このアドレスは、ネットワークに接続していない状態でも有効なため、ネットワークプログラムのデバッグに使用したりもします。

ブロードキャスト アドレス

ブロードキャスト アドレス とは、ネットワーク内のすべての端末にデータを送信するために使われるアドレスで、「255.255.255.255」か IP アドレスのホスト部のビットをすべて 1 にしたアドレスが用いられます。IP アドレスが 「192.168.1.54」で、ネットマスクが「255.255.255.0」だった場合、ブロードキャストアドレスは「192.168.1.255」となります。

ドメイン名

たとえば、「http://66.102.7.99/」にアクセスすると何があるのでしょうか?このように、意味のない数字の羅列のままでは、覚えにくくて扱いにくいです。そこで考え出されたのが ドメイン名 です。ドメイン名は DNS (Domain Name System) サーバー により管理され、意味のある文字列と IP アドレスを対応付けます。
Web ブラウザーで「http://www.google.co.jp/」にアクセスする場合を例にとると、ブラウザーは DNS サーバーに「www.google.co.jp」に関連付けられた IP アドレスを問い合わせ、サーバーから返ってきた「66.102.7.99」という IP アドレスを持つコンピューターに接続します。

IP アドレスを手動で割り当てる

一般家庭用のルーターなどでは、IP アドレスは DHCP サーバー によって自動的に割り当てられますが、DHCP サーバーがない場合などは手動で割り当てなければなりません。そのための設定ファイルは、Red Hat 系ディストリビューションの場合 /etc/sysconfig/network-scripts/ にある、ifcfg-デバイス名 というファイルです。

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.1.255
HWADDR=00:D0:B7:2A:40:5D
IPADDR=192.168.1.54
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
TYPE=Ethernet
項目 内容
DEVICE デバイス名
BOOTPROTO ブート時などに使用するプロトコル
BROADCAST ブロードキャストアドレス
HWADDR MAC アドレス
IPADDR IP アドレス
NETMASK ネットマスク
NETWORK ネットワークアドレス
ONBOOT ブート時に有効にするか否か
TYPE インターフェイスの種類

このファイルを直接編集するのはいささか面倒なため、わかりやすい設定プログラムが用意されています。それが netconfig です。

netconfig [-d デバイス名]

デフォルトゲートウェイとは、外部のネットワークにアクセスする際に最初に通るネットワーク機器のことです。一番近いルーターなどのアドレスになります。また、ネームサーバーは DNS サーバーを表します。この項目を指定しないとドメイン名によるアクセスができなくなってしまいます。

どちらの方法でも設定を適用するためには network デーモンを再起動する必要があるので忘れないでください。

[root@Alixia root]# /etc/init.d/network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Setting network parameters:                                [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:                                [  OK  ]

ファイアーウォール

ファイアーウォールとは、アタックなどの不正なアクセスからコンピューターを守る "防火壁" のようなものです。ファイアーウォールには、ソフトウェアによる実装とハードウェアによる実装がありますが、ここで紹介するのはソフトウェアによる実装です。

iptables

Kernel 2.4 以降を搭載した Linux では iptables というプログラムを用いてファイアーウォールを設定します。 "特定のポートに対して特定のアクセス元のみ接続を許可/不許可する" といった設定を組み合わせて構成していきます。一般的には、最初にすべてのポートをふさいで必要最小限だけを開放するように構成されることが多いです。設定ファイルは /etc/sysconfig/iptables です。

/etc/sysconfig/iptables

以下は実際の設定例です。

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type any -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

それぞれの行は次のような意味を表します。(細かい用語は各自で調べてください)

*filter
テーブル名
:INPUT DROP [0:0]
INPUT チェインの宣言 (すべての入力パケットを破棄する)
:FORWARD DROP [0:0]
FORWARD チェインの宣言 (すべての転送パケットを破棄する)
:OUTPUT ACCEPT [0:0]
OUTPUT チェインの宣言 (すべての出力パケットを許可する)
-A INPUT -i lo -j ACCEPT
ループバック インターフェースへの入力パケットを許可する
-A INPUT -p icmp --icmp-type any -j ACCEPT
すべての ICMP パケットを許可する
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
すでに確立しているセッションや、それらに関係する入力パケットを許可する
-A INPUT -j REJECT --reject-with icmp-host-prohibited
拒否された ICMP パケットの応答としてエラーパケットを返す
COMMIT
テーブル宣言の終わり
ICMP はプロトコルの一種で、接続されたコンピューターやネットワーク機器の間で
お互いの状態を確認するために用いられます。後述する ping コマンドなどで使用し、
ネットワーク障害などの調査に用います。
ICMP パケットを許可することで、ネットワークのより正確な診断が可能になります。

ここで表示した例は最小構成で、外部からの接続をすべて拒否してしまいます。これでは SSH サーバーや Web サーバーのデーモンが動作していてもサービスを行うことができません。では、ポートを開放する設定を追加してみましょう。

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

これは「TCP の ポート 22 へのアクセスを許可する」という意味の設定で、SSH サーバーに外部からアクセスできるようにする例です。iptables の設定はファイルの後ろに書いてある設定が前の設定を上書きするので、この場合は 6 行目と 7 行目の間に追加して行くのがよいでしょう。
設定を変更したら iptables デーモンを再起動して変更を適用します。 OK の表示が出れば成功です。

[root@Alixia root]# /etc/init.d/iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]

iptables は、「特定のアクセス元のみ許可する」や「特定のネットワークからのアクセスのみ拒否する」といった指定の仕方もあります。これには -s オプションを使います。次の例は「ポート 139 への入力パケットは 192.168.1.0/24 からのみ許可する」という例です。

-A INPUT -p tcp -m tcp --dport 139 -s 192.168.1.0/24 -j ACCEPT

ほかのオプションや詳しい説明は iptables のマニュアルを参照してください。

ネットワーク関連コマンド

telnet

このコマンドは、本来 リモートシェルの一種である TELNET のクライアントですが、任意のホストの任意のポートに接続して通信することができるため、サーバーからのメッセージを直接見たいときなどに重宝します。

[root@Alixia root]# telnet 192.168.1.54 80
Trying 192.168.1.54...
Connected to 192.168.1.54.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 403 Forbidden
Date: Tue, 14 Jun 2005 01:53:55 GMT
Server: Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7g PHP/4.3.11 mod_jk2/2.0.4
Connection: close
Content-Type: text/html; charset=iso-8859-1

Connection closed by foreign host.

このコマンドは、接続が切れると自動的に終了しますが、Ctrl+ ] でコマンドモードにして quit コマンドを実行することでも終了できます。

ping

このコマンドは、指定されたアドレスにエコーパケットを送り返信があるか否かを表示します。これによって目的のアドレスに接続できるかどうかを調べることができます。返信がなかった場合、相手のネットワークがダウンしていたり、エコーパケットを無視している可能性があります。

[root@Alixia root]# ping www.google.co.jp
PING www.l.google.com (64.233.179.104) 56(84) bytes of data.
64 bytes from 64.233.179.104: icmp_seq=0 ttl=237 time=158 ms
64 bytes from 64.233.179.104: icmp_seq=1 ttl=237 time=157 ms
64 bytes from 64.233.179.104: icmp_seq=2 ttl=237 time=158 ms
64 bytes from 64.233.179.104: icmp_seq=3 ttl=237 time=158 ms

--- www.l.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 157.865/158.094/158.388/0.339 ms, pipe 2

traceroute

このコマンドは、指定されたアドレスへ接続するための経路を調べることができます。ping で目的のアドレスから反応がなかった場合など、ネットワーク構成が正しいかどうかを確認するために用います。

[root@Alixia root]# traceroute www.google.co.jp
traceroute: Warning: www.google.co.jp has multiple addresses; using 64.233.179.104
traceroute to www.l.google.com (64.233.179.104), 30 hops max, 38 byte packets
 1  gw-in.klab.k.hosei.ac.jp (133.25.236.65)  0.705 ms  0.419 ms  0.226 ms
 2  133.25.82.2 (133.25.82.2)  0.401 ms  0.363 ms  0.325 ms
 3  133.25.112.242 (133.25.112.242)  1.280 ms  1.076 ms  1.403 ms
 4  133.25.112.225 (133.25.112.225)  2.681 ms  1.509 ms  1.459 ms
 5  noukou-FE4-0-0.sinet.ad.jp (150.99.139.1)  2.608 ms  2.201 ms  1.177 ms

nslookup

このコマンドは、指定されたホストやドメインの情報を実際に DNS サーバーに問い合わせ、結果を表示します。IP アドレスからドメイン名を調べたり、ドメイン名から IP アドレスを調べることができます。

[root@Alixia root]# nslookup www.google.co.jp
Server:         133.25.236.65
Address:        133.25.236.65#53

Non-authoritative answer:
www.google.co.jp        canonical name = www.google.com.
www.google.com  canonical name = www.l.google.com.
Name:   www.l.google.com
Address: 64.233.179.99
Name:   www.l.google.com
Address: 64.233.179.104

ifconfig

このコマンドは、ネットワークインターフェイスの情報を表示したり、変更したりすることができます。少々煩雑ではありますが、このコマンドでIP アドレスを変更することもできます。

[root@Alixia root]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:D0:B7:2A:40:5D
          inet addr:192.168.1.54  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)