次のページ 前のページ 目次へ

5. ネットワークに関する一般的な設定に関する情報

以下の節では実際にネットワークを設定する前に知っておいた方がよいことに ついてまとめておきます。これらは、どのようなネットワーク機能を使う場合に も基本となることです。

5.1 何から始めるか?

ネットワークを構築したり、ネットワークを設定する前に用意しておくべき必 要なものがいくつかあります。以下にもっとも重要なものを説明します。

最新のカーネルソース

多分、現在お使いのカーネルにはネットワークに必要な機能やネットワークカー ド用のドライバが組みこまれていないでしょうから、カーネルのソースを入手 して、適切なオプションを指定し、カーネルを再構築する必要があるでしょう。

最新のカーネルソースは ftp.funet.fi から入手できます。

通常、カーネルのソースは /usr/src/linux ディレクトリに展開し ます。パッチのあて方やカーネルの構築の仕方については Kernel-HOWTO を読んでください。カーネ ルモジュールについては Module-HOWTO を御覧ください。

特別に言及しない限り、安定版のカーネルを使うことをお勧めします(バージョ ンナンバーの 2 つめの数字が偶数のバージョンです)。開発版のカーネル(2 つめの数字が奇数のバージョン)は内部構造が大きく変っていたり、その他さ まざまな変更が行なわれているため、今まで動いていたソフトウェアがうまく 動かないかも知れません。自分でそれらの問題を解決したり、それらのソフト ウェアに潜む問題を解決できない限り、開発版のカーネルは使わないほうがい いでしょう。

最新のネットワークツール

ネットワークツールとは、Linux のネットワークデバイスを設定するためのプ ログラムです。これらのプログラムを用いてネットワークデバイスにアドレス を割り当てたり、経路情報を設定したりします。

最近の Linux の配布パッケージ(Slackware や Red Hat といったディストリ ビューション)には、たいてい、ネットワークツールも含まれています。しか し、それらの配布パッケージを使っていてもネットワークツールをインストー ルしていない場合、まずそれらをインストールするところから始めましょう。

Slackware や Red Hat といった配布パッケージを使わずに構築したシステム の場合、ネットワークツールはソースコードを入手してコンパイルする必要が ありますが、これはそう難しい作業ではありません。

ネットワークツールは Bernd Eckenfels がメンテナンスしており、 ftp.inka.de から入手可能です。ここは ftp.linux.uk.org にミラーされています。

お使いのカーネルのバージョンにあったバージョンを入手して、インストール の際は付属の文書の指示に従ってください。

この文書を執筆している時点での最新版のネットワークツールを、コンパイル してインストールするには以下のようにします。

#
# cd /usr/src
# tar xvfz net-tools-1.32-alpha.tar.gz
# cd net-tools-1.32-alpha
# make config
# make
# make install
#

加えて、ファイアウォールを設定したり、IP masquerade 機能を使いたい場合 は、ipfwadm コマンドも必要です。ipfwadm の最新版は ftp.xos.nl から入 手できます。このコマンドにもいくつかのバージョンがあり、カーネルのバー ジョンに合ったものを入手してください。

この文書の執筆時点での最新版をインストールするには以下のようにします。

#
# cd /usr/src
# tar xvfz ipfwadm-2.3.0.tar.gz
# cd ipfwadm-2.3.0
# make
# make install
#

各種ネットワーク用アプリケーションプログラム

ネットワークアプリケーションプログラムとは、telnetftp などと、それらのサーバプログラムのことです。これらの大部 分は David Holland <dholland@hcs.harvard.edu> がメンテナンスし ており、 ftp.uk.linux.org から入手可能です。

執筆時点での最新版をインストールするには以下のようにします。

#
# cd /usr/src
# tar xvfz /pub/net/NetKit-B-0.08.tar.gz
# cd NetKit-B-0.08
# more README
# vi MCONFIG
# make
# make install
#

IP アドレス

インターネットプロトコル用のアドレスは 4 バイトから構成されています。 アドレスは「ドット区切りの 10 進表記」で表示するのが普通です。この書き 方では、それぞれのバイトを 10 進数(0-255)に変換し、頭の 0 は省略し、各 バイトを `.' で区切って示します。通常、ホストやルータの持つそれぞれの ネットワークインターフェイスには 1 つの IP アドレスを割りあてます。目 的によっては、一台のマシンの複数のポートに同じ IP アドレスを付けること も可能ですが、複数のインターフェイスには、それぞれ独自の IP アドレスを 付けるのが普通です。

インターネットプロトコルで構成されたネットワークは、一連の IP アドレス が集まって構成されています。1つのネットワークの IP アドレスには共通の 部分がなければいけません。1つのネットワーク全体に共通なアドレスの部分 をアドレスの「ネットワーク部」と呼びます。残りの部分を「ホスト部」と呼 びます。1つのネットワークの中で共通しているネットワークアドレス分のビッ ト数をネットマスクと呼び、アドレスのうちどこまでがネットワーク部で、ど こからがホスト部かを定義しています。例えば、以下のような場合を考えてく ださい。

-----------------        ---------------
ホストアドレス           192.168.110.23
ネットワークマスク       255.255.255.0
ネットワーク部           192.168.110.
ホスト部                            .23
-----------------        ---------------
ネットワークアドレス     192.168.110.0
ブロードキャストアドレス 192.168.110.255
-----------------        ---------------

ホストに付けられたアドレスのうち、ネットマスクとビットごとに論理積を取っ たものがネットワークアドレスになります。すなわち、ネットワークアドレス は、それぞれのネットワークに割りあてられたアドレスの最小のものになりま す。つまり、ネットワークアドレスはアドレスのホスト部を全て 0 にした ものです。

ネットワークに接続されているホストは自分自身のアドレスに送られたパケッ トを受けとりますが、それ以外にも「ブロードキャストアドレス」という特別 に設定されたアドレスに送られたパケットも受けとります。ブロードキャスト アドレスは、ネットワーク上にいる全てのホストにパケットを送りたい場合に 利用する特別のアドレスです。経路情報や各種の警告メッセージなどはブロー ドキャストアドレスへ送出され、ネットワーク上にいる全てのホストが同時に 受けとることができます。ブロードキャストアドレスはそのネットワークで利 用可能な最大の IP アドレスにすることが慣例になっています。例えば、上記 の例ではブロードキャストアドレスは 192.168.110.255 になってい ます。何らかの理由からネットワークアドレスとブロードキャストアドレスを 同じにしているサイトがあるかも知れません。実用上はどちらにしておいても 大差はありませんが、ネットワーク上の全てのホストは同じブロードキャスト アドレスを使わなければなりません。

IP プロトコルの開発の早期の段階で、何らかの管理上の理由から、いくつか のIP 番号のグループがネットワークを構築し、これらの番号がいわゆる「ク ラス」へと発展しました。IP アドレスにおけるクラスはそのネットワークで 使用できるホストの数を決定します。ネットワークのクラスは以下のように分 けられています。

----------------------------------------------------------
| Network | Netmask       | Network Addresses            |
| Class   |               |                              |
----------------------------------------------------------
|    A    | 255.0.0.0     | 0.0.0.0    - 127.255.255.255 |
|    B    | 255.255.0.0   | 128.0.0.0  - 191.255.255.255 |
|    C    | 255.255.255.0 | 192.0.0.0  - 223.255.255.255 |
|Multicast| 240.0.0.0     | 224.0.0.0  - 239.255.255.255 |
----------------------------------------------------------

どのような IP アドレスを使うかは何をしたいかに依存します。以下に示す ような作業を組みあわせて、必要なアドレスを決めてください。

既存のIPネットワークにLinuxマシンをインストールする場合

既存のIPネットワークにLinuxマシンを接続したい場合、ネットワークの管理 者に相談して以下の情報を教えてもらってください。

これらの情報を使ってあなたのLinuxマシンのネットワークデバイスを設定し ます。正しい設定をしない限りネットワークは使えません。

インターネットへ接続しないネットワークを新しく構築する場合

インターネットへ接続する予定の無いプライベートなネットワークを構築する 場合、どのような IP アドレスを使っても構いません。しかしながら、このよ うなネットワークに使うべき IP アドレスはあらかじめ決められています。以 下に示すアドレスを使えば、インターネットとはパケットをやりとりできない ため、誤ってインターネットに接続してしまっても安全です。RFC1597では以 下のアドレスがプライベートネットワーク用に割りあてられています。

-----------------------------------------------------------
|       プライベートネットワーク用のアドレス              |
-----------------------------------------------------------
| Network | Netmask       | Network Addresses             |
| Class   |               |                               |
-----------------------------------------------------------
|    A    | 255.0.0.0     | 10.0.0.0    - 10.255.255.255  |
|    B    | 255.255.0.0   | 172.16.0.0  - 172.31.255.255  |
|    C    | 255.255.255.0 | 192.168.0.0 - 192.168.255.255 |
-----------------------------------------------------------

プライベートネットワーク用のアドレスもクラスごとに用意されているので、 まず構築したいネットワークの規模を考えて、それにふさわしい規模のクラス のIPアドレスを使ってください。

5.2 設定コマンドの置き場所は?

Linux の起動方法にはいくつかの流儀があります。カーネルが起動したとき、 まず実行されるのが init と呼ばれるプログラムです。 init は起動されると設定ファイルである /etc/inittab を読みこみ、システムの起動作業を実行します。init にはいくつか の種類があり、この違いが配布パッケージやマシンごとのもっとも大きな違い になっています。

通常、/etc/inittab ファイルには以下のような行があります。

si::sysinit:/etc/init.d/boot

この行で実際の起動方法を管理するシェルスクリプトを指定しています。この ファイルは MS-DOS の AUTOEXEC.BAT と同等の機能を果します。

通常、いくつものスクリプトが boot スクリプトから呼びだされ、ネットワー ク用の設定スクリプトも boot スクリプトから呼びだされます。

以下の表にシステムごとの違いをまとめました。

-------------------------------------------------------------------------------
Distrib. |ネットワークの初期化                        |サーバの起動
-------------------------------------------------------------------------------
Debian   |/etc/init.d/network                         |/etc/init.d/netbase     
         |                                            |/etc/init.d/netstd_init
         |                                            |/etc/init.d/netstd_nfs
         |                                            |/etc/init.d/netstd_misc
-------------------------------------------------------------------------------
Slackware|/etc/rc.d/rc.inet1                          |/etc/rc.d/rc.inet2 
-------------------------------------------------------------------------------
RedHat   |/etc/sysconfig/network-scripts/ifup-<ifname>|/etc/rc.d/init.d/network
-------------------------------------------------------------------------------

最近の配布パッケージには、一般的なネットワークインターフェイスを設定す るためのプログラムはあらかじめ含まれています。次に示すような設定用のプ ログラムがある場合、手動で設定するまえに、これらを使って必要な設定が可 能かチェックしてみてください。

-----------------------------------------
Distrib   | ネットワーク設定用ツール
-----------------------------------------
RedHat    | /sbin/netcfg
Slackware | /sbin/netconfig
-----------------------------------------

5.3 ネットワークインターフェイスの作成

多くの Unix では /dev ディレクトリにネットワークデバイス用の スペシャルファイルがありますが、Linux ではありません。Linux ではネット ワークデバイスはソフトウェアによって動的に作成されるので、デバイスファ イルは不要になっています。

ほとんどの場合、ネットワークデバイスは、デバイスドライバがハードウェア を検出して初期化する際に、自動的に作成されます。例えばイーサネットデバ イスドライバは、 eth[0..n] というインターフェイスをイーサネット ハードウェアに順に割りあてていきます。最初に検出されたイーサネッカード が eth0、次が eth1、等々になります。

例外もいくつかあり、有名なものはslipppp ですが、 これが使うネットワークデバイスはデバイスドライバではなくユーザプログラ ムが作成します。それぞれのデバイスに付けられる番号は、デバイスドライバ が割りあてるのと同様に順に振られていきますが、起動時にデバイスが自動的 に作成されるということはありません。なぜこのようになっているのかと言う と、イーサネットデバイスとは異なり、slipppp デバ イスは、マシンの稼働中に必要な数が変化するからです。詳細については後述 します。

5.4 ネットワークインターフェイスの設定

ネットワークの設定に必要なプログラムと情報が揃えばネットワークインター フェイスの設定を始めましょう。ネットワークインターフェイスの設定とは、 ネットワークデバイスに適切なアドレスを割りあてたり、その他ネットワーク デバイスを設定するための適切な値を指定することです。このためのプログラ ムがifconfig(interface configure)コマンドです。

ifconfig は、通常、以下のような書式で使います。

# ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up

この例では、``eth0''イーサネットインターフェイスを `192.168.0.1' という IP アドレスと `255.255.255.0' というネットマスクで設定し、`up' コマンドでインターフェイスを 使用可能にしています。

カーネルはインターフェイスのデフォルトの設定値を知っています。上記の例 でインターフェイスにネットワークアドレスとブロードキャストアドレスを設 定しても構いませんが、例のように、それらを指定しなければ自動的にカーネ ルが IP アドレスのクラスに従って適切な値を設定してくれます。上記の例で は、このインターフェイスに class-C のネットワークアドレスが割りあてら れたことをカーネルが認識し、ネットワークアドレスとして `192.168.0.0' を、ブロードキャストアドレスとして `192.168.0.255 を自動的に割りあてます。

ifconfigコマンドで指定できるオプションはいろいろあります。もっ とも重要なものを列挙すると、

up

このオプションでインターフェイスを利用可能(アクティブ)にします。

down

このオプションではインターフェイスを使用停止にします。

[-]arp

このオプションで ARP(Address Resolution Protocol)を使うかどうかの指定 ができます。

[-]allmulti

このオプションで promiscuous モードの有無を指定します。promiscuous モー ドとは、そのデバイス宛ではないパケットも受けつけるモードです。 tcpdump などのパケット snooper を使う場合はこの指定が必要です。

mtu N

このパラメータはデバイスの MTU(Maximum Transfer Unit)を設定し ます。

netmask addr

このパラメータはデバイスが接続しているネットワークのネットワークマスク を設定します。

irq addr

このパラメータは特定の種類のハードウェアにしか使えませんが、デバイスの ハードウェアの IRQ を設定します。

[-]broadcast [addr]

このパラメータで、指定したブロードキャストアドレス宛のデータグラ ムを受け取るかどうかを設定できます。

[-]pointopoint [addr]

このパラメータは slipppp などの一対一接続の場合 の接続先アドレスの指定です。

hw <type> <addr>

このパラメータは特定の種類のネットワークデバイスのハードウェアアドレス を設定します。Ethernet の場合はそれほど役に立ちませんが、AX.25 のよう なネットワークの場合に必要な機能です。

ifconfig コマンドはあらゆるネットワークインターフェイスに使用 可能です。pppddip といったユーザレベルのプログラ ムは必要なデバイスを作成すれば自動的にそれらを設定するので ifconfig を手動で使う必要はなくなります。

5.5 リゾルバの設定

リゾルバ(Name Resolver) は Linux の標準ライブラリに含まれてい ます。リゾルバの主な機能は人間向きの ftp.funet.fi のようなホ スト名を 128.214.248.6 のような IP アドレスに変換することです。

ホスト/ドメイン名とは?

すでにインターネットのホスト名については御存知だと思いますが、それらが どういう意味で、どのように構成されているかについては御存知ないかも知れ ません。インターネットのドメイン名は階層構造、すなわち木のような構造に になっています。ドメイン とは、一つのまとまり、すなわち複数の ホスト名を一つのグループにまとめたものです。ドメインサ ブドメイン に分割されているかも知れません。トップレベル・ドメ イン とはサブドメインではないドメインです。トップレベル・ドメイン については RFC-920 で規定されています。もっともよく知られたトップレベ ルドメインは、

COM

営利組織

EDU

教育機関

GOV

政府機関

MIL

軍事機関

ORG

その他の組織

Country Designator

国を示す 2 文字のコード

これらのトップレベル・ドメインはそれぞれサブドメインを持っています。国 を示す 2 文字のコードがトップレベル・ドメインになっている場合、サブド メインとしてcomedugovmilorg といっ た組織の種別を示すドメインが来ます。例えば com.augov.au はオーストラリアの営利組織と政府機関です。歴史的な理由 から、トップレベル・ドメインとして国名を示すコードの無いドメインは米国 の組織に限られています。もっとも、米国にも .us という国名を示 すコードはあります。

次のレベルはたいていその組織や団体の名称になります。それより細かいレベ ルのドメインはそれぞれの組織によって異なりますが、よくあるのは部門別に サブドメインを設定する方法です。しかし、このレベル以下はどのようなサブ ドメインを作ることも可能なので、それぞれの組織ごとに、ネットワークの管 理者がふさわしい分け方を設定しています。

もっとも左に位置する名前が、たいていの場合、そのマシンに付けられた独自 の名前で、ホスト名と呼ばれます。ホスト名よりも右側の部分を ドメイン名と呼び、両者を合せた完全な名前を「完全に記述された 名前」 Fully Qualified Domain Name(FQDN) と呼びます。

私が使っている電子メールのホストを例に取ると、FQDN は `perf.no.itg.telstra.com.au' です。この場合、ホスト名は `perf' でドメイン名は no.itg.telstra.com.au です。ド メイン名のうち、トップドメイン名は私のいる国、オーストラリアを示す 2 文字のコード(au)になっており、その次のレベルは営利組織を 示す .com です。会社の名前は `telestra' で、それ以下のサ ブドメイン名の構造は組織の構造を反映したものになっており、ここに示した 例では、私のマシンはインフォメーション・テクノロジー・グループ (itg)のネットワーク・オペレーション(no)部門に属して います。

必要な情報

まず、あなたのホストがどういうドメインに属しているかを知る必要がありま す。リゾルバは名前の変換サービスを `ドメイン・ネーム・サーバ (DNS)'に問い合わせるので、利用可能なネームサーバの IP アドレスも 知っておく必要があります。

関連するファイルは 3 つあり、それらを順に見ていくことにします。

/etc/resolv.conf

/etc/resolv.conf はリゾルバの使う一番重要な設定ファイルです。 このファイルの書式はごく簡単で、各行に 1 つのキーワードを配したテキス トファイルになっています。よく使われるキーワードは以下の 3 種です。

domain

このキーワードはローカルのドメイン名を設定します。

search

このキーワードはホスト名を検索する際に用いるドメイン名のリストを指定し ます。

nameserver

このキーワードは名前を変換する際に使うドメイン・ネーム・サーバの IP ア ドレスを指定します。複数のサーバを指定可能です。

例として、以下の /etc/resolv.conf を見てみましょう。

domain maths.wu.edu.au
search maths.wu.edu.au wu.edu.au
nameserver 192.168.10.1
nameserver 192.168.12.1

この例ではドメイン名を付けずにホスト名のみ指定した場合に、デフォルトで追 加するドメイン名として maths.wu.edu.au を指定しています。ホス ト名に maths.wu.edu.au を付けた FQDN が見つからなかった場合、 ドメイン名を wu.edu.au にして再度調べます。ネームサーバのエン トリは 2 つ設定してあり、リゾルバは 2 つのネームサーバに問い合わせます。

/etc/host.conf

/etc/host.conf ファイルはリゾルバの動作方法を設定するファイル です。このファイルのフォーマットの詳細は `resolv+ の man ペー ジにあります。ほとんど全ての環境では、以下の設定のままでいいでしょう。

                          
order hosts,bind                                          
multi on  

この設定の場合、リゾルバはネームサーバに問い合わせるまえに、まず自分自 身の持つ /etc/hosts ファイルをチェックします(order hosts,bind)。/etc/hosts ファイルに複数の IP アドレスが登録さ れていた場合、最初のアドレスだけでなく、全てのアドレスを報告します (multi on)。

/etc/hosts

/etc/hosts ファイルは身近なホストの IP アドレスを登録しておく 表です。この表に登録されているホストの IP アドレスについては DNS を引 く必要がありません。/etc/hosts の欠点は、登録しているホストの IP アドレスが変った場合、手動でこのファイルを更新しなければならないこ とです。きちんと管理されたシステムでは、このファイルに登録されるホスト 名は loopback インターフェイスを示すアドレスと身近にあるホストのアドレ スのみです。

# /etc/hosts
127.0.0.1      localhost loopback
192.168.0.1    this.host.name

一行目が示すように、一つの行に複数のホスト名を登録可能で、こ の例では 127.0.0.1 はループバックインターフェイスの IP アドレスでもあ ります。

5.6 ループバックインターフェイスの設定

ループバックインターフェイスとは、自分自身に接続するために用意された特 別な種類のインターフェイスです。このようなインターフェイスを用意してい るのにはいくつかの理由があります。例えば、実際のネットワークに接続せず にネットワーク用のソフトウェアをテストするなどの目的に使えます。慣例と して、ループバックインターフェイスには `127.0.0.1 のアドレス が使われます。ですから、どんなマシンを使っていようとも telnet で 127.0.0.1 に接続すれば、自分自身に接続することになります。

ループバックインターフェイスの設定は簡単で、次のようにするだけです。

# ifconfig lo 127.0.0.1
# route add -host 127.0.0.1 lo

route コマンドについては次節で説明します。

5.7 経路制御(ルーティング)

経路制御は大きな話題で、それだけで大部の本を書くことができます。一部の 人を別にすれば、ほとんどの人はごく単純な経路制御が必要なだけと思います ので、以下ではごく基本的な話題についてのみ扱うことにします。より詳細な 情報が必要ならば、この文書の最初に示した各種の文献にあたってください。

まず定義から始めましょう。IP 経路制御とは何でしょう? 以下に示すものが、 私の使っている定義です。

IP 経路制御とは複数のネットワークに接続しているホストが受けとった IP データグラムをどのネットワークに送るかを決めることです。

例を使って示した方がいいでしょう。よくあるルータを想像してください。こ のルータには複数のワークステーションが接続された Ethenet が接続され、 PPP を使ってインターネットに接続したり、別のオフィスへ PPP で接続する かも知れません。このルータがデータグラムを受けとった際、そのデータグラ ムを次にどのポートへ送り出すかを決めるのが IP 経路制御です。ルータでは ない普通のホストにも経路制御が必要です。なぜなら、ネットワークに接続し ている全てのホストは上述した自分自身を指すループバックインターフェイス とネットワーク上にある他のマシンと接続するためのインターフェイス(それ は ethernet だったり、シリアルポートを使った PPP や SLIP だったりしま す)の 2 つのインターフェイスを持っているため、どちらのインターフェイス にパケットを送り出すか決める必要があるからです。

さて、実際の経路制御はどのように行なわれるのでしょう?それぞれのホスト は経路情報を登録した経路表(ルーティング・テーブル)と呼ばれるリストを持っ ています。この表の各行には通常 3 つの欄があります。最初の欄は目的地と なるアドレス、2 つめはデータグラムが送られるべきインターフェイス名、3 つめは必須ではありませんが、次のネットワークへデータグラムを送るホスト の IP アドレスです。この欄をゲートウェイフィールドと言います。Linux で は /proc/net/route に経路表が登録されているため、以下のコマン ドで経路表を見ることができます。

# cat /proc/net/route

経路制御の方法自体はごく簡単です。データグラムを受けとれば、その目的地 アドレス(誰宛に送られたのか)をチェックして、経路表の各行と比較します。 そのアドレスにもっともよく一致する行が選択され、データグラムはその行が 指定するインターフェイスへ送られます。

その行にゲートウェイフィールドが登録されていれば、データグラムは指定さ れたインターフェイスを経由してそのホストに送られます。ゲートウェイフィー ルドが無い場合、目的地アドレスはその行が指定したインターフェイスが接続 しているネットワーク上にあるものと見なされます。

この経路表を操作するには `route' という専用のコマンドを使いま す。このコマンドは引数をカーネルのシステムコールに変換して、カーネルの 経路表に追加したり、削除したり、変更したりします。

簡単な例を示します。イーサネットのネットワークを使っていると想像してく ださい。ネットワークはクラス C で、ネットワークアドレスは 192.168.1.0 です。あなたのマシンの IP アドレスは 192.168.1.10 、インターネットに接続しているルータのアドレス は 192.168.1.1 になっています。

インターフェイスを設定するための最初のステップは上述した通り、 `ifconfig' です。

# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up

次に、目的地アドレスとして 192.168.1.* に一致するデータグラム が届けば、イーサネットデバイスに送るような経路表をカーネルに登録する必 要があります。そのためには以下のコマンドを使います。

# route add -net 192.168.0.0 netmask 255.255.255.0 eth0

`-net' という引数に注意してください。この指定で route プログラムはこのアドレスがネットワークであると認識しま す。ここで host を指定すると、一つの IP アドレスのみを指定し た経路になります。

この経路を登録することで、あなたのいる ethernet セグメント上にいる全て のホストと IP 接続できます。しかし、同じセグメント上にいな いホストの場合どうするのでしょう?

起りうる全てのネットワークへの経路を登録することは不可能ですので、特別 の仕組みが用意されています。この仕組みを「既定の経路(デフォルトルート)」 と呼びます。「既定の経路」は全ての目的地アドレスにマッチしますが、優先 順位が低く、他にマッチする行があった場合、そちらの方が優先されることに なります。「既定の経路」の考え方は単純で、「その他全てをここに送る」と いうことです。今考えているネットワークでは以下のように「既定の経路」を 設定します。

# route add default gw 192.168.1.1 eth0

`gw' の指定で route コマンドはその次の引数がゲートウェ イかルータの IP アドレスかホスト名であると認識します。このエントリに一 致する全てのデータグラムはこのアドレスに送られ、以降の経路制御はこのゲー トウェイかルータが考えることになります。

以上をまとめると次のようになります。

# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
# route add -net 192.168.0.0 netmask 255.255.255.0 eth0
# route add default gw 192.168.1.1 eth0

ネットワークを設定している `rc' ファイルを詳細に調べると少な くともその一つにこれとよく似た設定が見つかるはずです。これはごく一般的 な設定です。

次に多少複雑な経路の設定を見てみましょう。先に考えたルータを設定してい ると想像してください。このルータは PPP でインターネットに接続し、複数 の lan セグメントが接続されています。具体的には 3 つの ethenet セグメ ントと 1 つの PPP 接続があると考えましょう。その場合、経路設定は以下の ようになるでしょう。

# route add 192.168.1.0 netmask 255.255.255.0 eth0
# route add 192.168.2.0 netmask 255.255.255.0 eth1
# route add 192.168.3.0 netmask 255.255.255.0 eth2
# route add default ppp0

このルータのつながったネットワークを使っているワークステーションそれぞ れは、先に述べたより簡単な形式の設定になり、ルータのみがネットワークへ の経路を別々に登録することになります。それぞれのワークステーションの場 合、「既定の経路」を使ってルータにデータグラムを送りますが、ルータの場 合はそれらを適切な経路に送りだす必要があります。

上記のルータの設定でデフォルトの経路の設定に`gw' が無いのを不 思議に思うかも知れませんが、その理由は簡単で、PPP や SLIP といったシリ アル経由の接続は一対一の接続になっているからです。接続先が一台のマシン になっているため、他に選択の余地が無く、そのマシンをゲートウェイとして 設定する意味は無いわけです。ethenet や arcnet、トークンリングといった 種類のネットワークの場合、それらのネットワーク上には多数のホストがある ので gw オプションを指定する必要があります。

さて、routed プログラムは何をしているのでしょう?

上述した経路設定は単純なネットワーク構成に適しており、取り得る経路は一 つしかありませんでした。もっと複雑なネットワーク構成になれば設定はもう 少し複雑になります。幸いなことに、大部分の人はそのような設定を使う必要 はありません。

上述してきた「手動経路設定」、すなわち「静的経路設定」の大きな問題点は、 ネットワークの中のマシンやどこかの接続がダウンした場合、データグラムを 別の経路へ送るようにするには、〜別の経路がある場合ですが〜、手動で、設 定を変更するために必要なコマンドを実行しなければなりません。通常、この 作業は面倒で、手間がかかり、非実用的で、トラブルの原因になりがちです。 そのため、ネットワークにトラブルが生じた場合、別の経路を探して自動的に 経路表を変更するための様々な技術が開発されてきました。これらはまとめて 「動的経路制御プロトコル」と呼ばれています。

一般的な動的経路制御プロトコルのいくつかについては御存知かも知れません。 多分、これらのプロトコルの中で最も有名なものは RIP(Routing Information Protocol) と OSPF(Open Shortest Path First Protocol)でしょう。RIP は小〜 中規模な組織や、一つのビルの中といった小規模なネットワークで最も広く使 われているプロトコルです。OSPF は新しく開発されたプロトコルで、大規模 なネットワークの設定やネットワークの中に多数の経路がありうる場合により 適しています。

これらのプロトコルを実装したプログラムとして、`routed' - RIP のみ、と `gated' - RIP と OSPF、その他に対応、があります。 `routed' プログラムはたいていの Linux の配布パッケージに含ま れており、上述した `NetKit' パッケージにも入っています。

具体的な例を使って動的経路制御プロトコルがどのように働くのか見てみましょ う。以下のようなネットワークを考えます。

    192.168.1.0 /                         192.168.2.0 /
       255.255.255.0                         255.255.255.0
     -                                     -
     |                                     |
     |   /-----\                 /-----\   |
     |   |     |ppp0   //    ppp0|     |   |
eth0 |---|  A  |------//---------|  B  |---| eth0
     |   |     |     //          |     |   |
     |   \-----/                 \-----/   |
     |      \ ppp1             ppp1 /      |
     -       \                     /       -
              \                   /
               \                 /
                \               /
                 \             /
                  \           /
                   \         /
                    \       /
                     \     /
                  ppp0\   /ppp1
                     /-----\
                     |     |
                     |  C  |
                     |     |
                     \-----/
                        |eth0
                        |
                   |---------|
                   192.168.3.0 /
                      255.255.255.0

図のように、A、B、C の 3 つのルータがあります。それぞれのルータにはク ラス C の IP ネットワーク(ネットマスク 255.255.255.0)が設定された一つ の ethernet のセグメントが接続されています。また、PPP を使って他のルー タに接続され、ネットワークは三角形になっています。

ルータ A の経路表は以下のようになります。

# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
# route add -net 192.168.2.0 netmask 255.255.255.0 ppp0
# route add -net 192.168.3.0 netmask 255.255.255.0 ppp1

この設定はルータ A と B の間の接続が切れない限り正しく動きます。A と B の間の接続が切れると、A に接続された ethernet 上のホストから B に接続 された ethernet 上のホストへは接続できなくなります。なぜなら、ルータ A から B への経路は A の ppp0 を使うことになっており、この接続が切れてい るためです。一方、A と C の間の接続は生きているので、A の ethernet 上 のホストから C の ethernet 上のホストへは通信できます。一方、B と C の 間の接続は生きているので C の ethernet 上のホストから B の ethernet 上 のホストへも通信できます。

さて、ここで A は C と通信でき、C は B に通信できるとしたら、A から B へのデータグラムは C を経由して B に送ることが可能なはずです。このよう な問題を解決するために RIP のような動的経路制御プロトコルが開発されま した。A、B、C それぞれのルータで経路制御デーモンが動いていれば、どれか 一つの接続が切れても、そのネットワークの状態を反映するように自動的に経 路表が調整されます。経路制御デーモンの設定は簡単で、それぞれのルータで 2 つのことをするだけです。ルータ A の場合、

# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
# /usr/sbin/routed

とします。

経路制御デーモン routed は起動時に自動的に全ての使用可能なネッ トワークポートを探して、そのホストの経路表を更新できるようにそれぞれの ネットワークデバイスへメッセージを送ると同時に、他のホストから送られて くるメッセージを受けとります。

以上はごく簡単な動的経路制御の説明ですが、充分使えるはずです。より詳細 な説明が必要ならばこの文書の最初に上げた参考文献を参照してください。

The important points relating to dynamic routing are:

動的経路制御についての重要なポイントは以下の通りです。

  1. 目的地まで複数の経路があり、その中から一つの経路を選ばなければな らない状況にないかぎり、あなたの Linux マシンで動的経路制御デーモンを 動かす必要はありません。
  2. 動的経路制御デーモンは、ネットワークの状態の変化に応じて自動的に 経路表を変更します。
  3. RIP は小〜中規模のネットワークに適しています。

5.8 ネットワーク経由の各種サービスとサーバの設定

ネットワーク経由の各種サービスとそのためのサーバを起動すれば、遠隔地に いるユーザが、ネットワーク経由であなたの Linux マシンを使うことができ ます。誰かがネットワーク経由で接続してくると、あらかじめ起動されている サーバプロブラムか、各種サーバプログラムを起動するためのデーモンプログ ラム(inetd)が、どのポートへの接続かを確認し、接続を受けつけると共にプ ログラムを実行します。ネットワークデーモンの動作方法には 2 つの種類が あり、2 つの種類とも実際に用いられています。それらは、

スタンドアローン・タイプ

ネットワークサービス用のプログラムはあらかじめ起動されて受けもちのポー トを監視しており、接続があれば自分で必要なサービスを提供します。

inetd 経由で起動するタイプ

ined サーバはネットワーク接続を受けつけるための特別のデーモン プログラムです。このプログラムは設定ファイルに従って tcp と udp、接続 ポートの組み合わせから、必要なサービスを提供するためのプログラムを決定 し、そのプログラムを起動します。ポートを指定するためのファイルは別にあ ります。

設定すべき重要なファイルは 2 つで、ポート番号をサービス名に対応づける /etc/services と、inetd デーモンの設定ファイルである /etc/inetd.conf ファイルです。

/etc/services

/etc/services ファイルはサービス名とポート番号の対応を示した 単純なデータベースです。このファイルの書式はごく単純で、普通のテキスト ファイルの各行にデータベースへのエントリが記述されています。それぞれの エントリは任意の数の空白文字(タブかスペース)で分離された 3 つの欄から 構成されます。また、#から後はコメントとして無視されます。欄の構成 は

name      port/protocol        aliases     # comment

となっています(#はコメント部です)。

name

は一語でこの行の内容を表わします。

port/protocol

この欄は 2 つの部分に分かれます。

port

はこの行が示すサービスを提供するためのポート番号で す。よく使われるサービスにはあらかじめポート番号が割りあてられてい ます。詳細については RFC-1340 を御覧ください。

protocol

欄はこのサービスが tcpudp のどちらを使うかを指定します。

注意しておかなければならないことは、18/tcp18/udp は全く異なる意味を持つということです。1つのサービスが同じポートの tcp と udp を使わなければならない技術的な理由はありません。しかしながら、 常識的な意味から、特定のサービスが tcp でも udp でも 使える場合、それらは同じポートを使うようになっており、 /etc/services にそのような例がいくつか見つかるでしょう。

aliases

はこのサービスを参照する別名を設定します。

/etc/services ファイルの実例

最近の Linux の各種配布パッケージには、 /etc/services ファイ ルはあらかじめ用意されていますが、もし 0 からシステムを組みあげなけれ ばならない場合のために、以下に Debian システムからコピーした /etc/services の例を紹 介します。

# /etc/services:
# $Id: NET-3-HOWTO.sgml,v 1.4 2000/12/28 10:19:46 nakano Exp $
#
# 各種ネットワークサービス、インターネットスタイル。
#
# 一つの特権(well-known)ポートに TCP と UDP 双方を割りあてるのが最近の IANA 
# の方針なので注意してください。そのため、UDP をサポートしていないプロト
# コルでも、以下に示すポートのほとんどに TCP と UDP 双方のエントリがあり
# ます。RFC 1340 ``Assigned Numbers''(July 1982) からバージョンアップし
# ていますが、全てのポートが含まれているわけではなく、よく使われるものだ
# けを記載しています。

tcpmux          1/tcp                           # TCP port service multiplexer
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
daytime         13/tcp
daytime         13/udp
netstat         15/tcp
qotd            17/tcp          quote
msp             18/tcp                          # message send protocol
msp             18/udp                          # message send protocol
chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source
ftp-data        20/tcp
ftp             21/tcp
ssh             22/tcp                          # SSH Remote Login Protocol
ssh             22/udp                          # SSH Remote Login Protocol
telnet          23/tcp
# 24 - private
smtp            25/tcp          mail
# 26 - unassigned
time            37/tcp          timserver
time            37/udp          timserver
rlp             39/udp          resource        # resource location
nameserver      42/tcp          name            # IEN 116
whois           43/tcp          nicname
re-mail-ck      50/tcp                          # Remote Mail Checking Protocol
re-mail-ck      50/udp                          # Remote Mail Checking Protocol
domain          53/tcp          nameserver      # name-domain server
domain          53/udp          nameserver
mtp             57/tcp                          # deprecated
bootps          67/tcp                          # BOOTP server
bootps          67/udp
bootpc          68/tcp                          # BOOTP client
bootpc          68/udp
tftp            69/udp
gopher          70/tcp                          # Internet Gopher
gopher          70/udp
rje             77/tcp          netrjs
finger          79/tcp
www             80/tcp          http            # WorldWideWeb HTTP
www             80/udp                          # HyperText Transfer Protocol
link            87/tcp          ttylink
kerberos        88/tcp          kerberos5 krb5  # Kerberos v5
kerberos        88/udp          kerberos5 krb5  # Kerberos v5
supdup          95/tcp
# 100 - reserved
hostnames       101/tcp         hostname        # usually from sri-nic
iso-tsap        102/tcp         tsap            # part of ISODE.
csnet-ns        105/tcp         cso-ns          # also used by CSO name server
csnet-ns        105/udp         cso-ns
rtelnet         107/tcp                         # Remote Telnet
rtelnet         107/udp
pop-2           109/tcp         postoffice      # POP version 2
pop-2           109/udp
pop-3           110/tcp                         # POP version 3
pop-3           110/udp
sunrpc          111/tcp         portmapper      # RPC 4.0 portmapper TCP
sunrpc          111/udp         portmapper      # RPC 4.0 portmapper UDP
auth            113/tcp         authentication tap ident
sftp            115/tcp
uucp-path       117/tcp
nntp            119/tcp         readnews untp   # USENET News Transfer Protocol
ntp             123/tcp
ntp             123/udp                         # Network Time Protocol
netbios-ns      137/tcp                         # NETBIOS Name Service
netbios-ns      137/udp
netbios-dgm     138/tcp                         # NETBIOS Datagram Service
netbios-dgm     138/udp
netbios-ssn     139/tcp                         # NETBIOS session service
netbios-ssn     139/udp
imap2           143/tcp                         # Interim Mail Access Proto v2
imap2           143/udp
snmp            161/udp                         # Simple Net Mgmt Proto
snmp-trap       162/udp         snmptrap        # Traps for SNMP
cmip-man        163/tcp                         # ISO mgmt over IP (CMOT)
cmip-man        163/udp
cmip-agent      164/tcp
cmip-agent      164/udp
xdmcp           177/tcp                         # X Display Mgr. Control Proto
xdmcp           177/udp
nextstep        178/tcp         NeXTStep NextStep       # NeXTStep window
nextstep        178/udp         NeXTStep NextStep       # server
bgp             179/tcp                         # Border Gateway Proto.
bgp             179/udp
prospero        191/tcp                         # Cliff Neuman's Prospero
prospero        191/udp
irc             194/tcp                         # Internet Relay Chat
irc             194/udp
smux            199/tcp                         # SNMP Unix Multiplexer
smux            199/udp
at-rtmp         201/tcp                         # AppleTalk routing
at-rtmp         201/udp
at-nbp          202/tcp                         # AppleTalk name binding
at-nbp          202/udp
at-echo         204/tcp                         # AppleTalk echo
at-echo         204/udp
at-zis          206/tcp                         # AppleTalk zone information
at-zis          206/udp
z3950           210/tcp         wais            # NISO Z39.50 database
z3950           210/udp         wais
ipx             213/tcp                         # IPX
ipx             213/udp
imap3           220/tcp                         # Interactive Mail Access
imap3           220/udp                         # Protocol v3
ulistserv       372/tcp                         # UNIX Listserv
ulistserv       372/udp
#
# UNIX specific services
#
exec            512/tcp
biff            512/udp         comsat
login           513/tcp
who             513/udp         whod
shell           514/tcp         cmd             # no passwords used
syslog          514/udp
printer         515/tcp         spooler         # line printer spooler
talk            517/udp
ntalk           518/udp
route           520/udp         router routed   # RIP
timed           525/udp         timeserver
tempo           526/tcp         newdate
courier         530/tcp         rpc
conference      531/tcp         chat
netnews         532/tcp         readnews
netwall         533/udp                         # -for emergency broadcasts
uucp            540/tcp         uucpd           # uucp daemon
remotefs        556/tcp         rfs_server rfs  # Brunhoff remote filesystem
klogin          543/tcp                         # Kerberized `rlogin' (v5)
kshell          544/tcp         krcmd           # Kerberized `rsh' (v5)
kerberos-adm    749/tcp                         # Kerberos `kadmin' (v5)
#
webster         765/tcp                         # Network dictionary
webster         765/udp
#
# ``Assingned Numbers'' によると、、
# > 登録されているポートは IANA が管理しているわけではなく、以下のポート
# > についてはほとんどのシステムで通常のユーザ権限で起動された通常のプロセ
# > スやプログラムから操作可能です。

#> ポートとは TCPに関する RFC で定義されいる長時間の通信を支える論理的な
#> 接続端の名称です。名称不明の呼び出し元に答える目的で各種サービスの
#> 接続用ポートが定義されています。このリストはサーバプロセスが使う接続
#> 用のポートです。IANA がこれらのポートを管理することは不可能なので、
#> 以下のリストは単に慣例を示しているに過ぎません。

#
ingreslock      1524/tcp
ingreslock      1524/udp
prospero-np     1525/tcp                # Prospero non-privileged
prospero-np     1525/udp
rfe             5002/tcp                # Radio Free Ethernet
rfe             5002/udp                # Actually uses UDP only
bbs             7000/tcp                # BBS service
#

# Kerberos(Athena/MIT プロジェクト)サービスの使うポート。以下は
# Kerberos v4 用の非公式のものです。v4 の Kerberos を使っているサイトで
# は以下の行を使って、上述の v5 用のエントリはコメントアウトし
# てください。

kerberos4       750/udp         kdc     # Kerberos (server) udp
kerberos4       750/tcp         kdc     # Kerberos (server) tcp
kerberos_master 751/udp                 # Kerberos authentication
kerberos_master 751/tcp                 # Kerberos authentication
passwd_server   752/udp                 # Kerberos passwd server
krb_prop        754/tcp                 # Kerberos slave propagation
krbupdate       760/tcp         kreg    # Kerberos registration
kpasswd         761/tcp         kpwd    # Kerberos "passwd"
kpop            1109/tcp                # Pop with Kerberos
knetd           2053/tcp                # Kerberos de-multiplexor
zephyr-srv      2102/udp                # Zephyr server
zephyr-clt      2103/udp                # Zephyr serv-hm connection
zephyr-hm       2104/udp                # Zephyr hostmanager
eklogin         2105/tcp                # Kerberos encrypted rlogin
#
# 非公式だが必要な(NetBSD 用)サービス
#
supfilesrv      871/tcp                 # SUP server
supfiledbg      1127/tcp                # SUP debugging
#
# Datagram Delivery Protocol services
#
rtmp            1/ddp                   # Routing Table Maintenance Protocol
nbp                     2/ddp                   # Name Binding Protocol
echo            4/ddp                   # AppleTalk Echo Protocol
zip             6       /ddp                    # Zone Information Protocol
#
# Debian GNU/Linux services
rmtcfg          1236/tcp                # Gracilis Packeten remote config server
xtel            1313/tcp                # french minitel
cfinger         2003/tcp                # GNU Finger
postgres        4321/tcp                # POSTGRES
mandelspawn     9359/udp        mandelbrot      # network mandelbrot

# Local services

/etc/inetd.conf

/etc/inetd.conf ファイルは inetd サーバデーモンの設 定ファイルです。このファイルはあるサービスへの要求が来たとき、 inetd がどのように処理するかを指定します。受けつけるサービス それぞれについて、inetd に、どのネットワークデーモンをどのよ うに起動するかについて指定してやらねばなりません。

このファイルも書式はごく単純です。普通のテキストファイルで各行に提供す べきサービスが記述してあります。# 以降の部分はコメントと して無視されます。各行には任意の数の空白文字(タブかスペース)で区切られ た 7 つの欄があります。一般的な書式は以下の通りです。

service  socket_type  proto  flags  user  server_path  server_args

ここで、

service

/etc/services ファイルに指定したそれぞ れのサービス名です。

socket_type

の欄はこのエントリが使用するソケットの種類です。 使えるのは streamdgramrawrdmseqpacket です。詳細は技術的な話になるので省略しますが、一般 的に言うと、tcp を使ったほぼ全てのサービスは stream を使い、udp を使ったほぼ全てのサービスは dgram を使 います。これ以外のソケットを使うのはごく限られた特殊のサーバだけ です。

proto

はこのエントリが使うプロトコルを示します。ここでの指 定は /etc/services の対応するエントリと一致しておらねばならず、 たいていの場合、tcpudp のどちらかです。Sun の RPC(Remoto Procedure Call)を使ったサービスでは rpc/tcprpc/udp を使うことがあります。

flags

waitnowait かのどちらかです。 この欄は、inetd が起動したネットワークサービス用デーモンが、 起動後はソケットを解放するため、即座に次の接続リクエストを受けつける ことが可能か、ネットワークサービス用デーモンが動いている間は新しい接続 を受けつけずに待つかの指定です。この項目も多少トリッキーな方法で実現し ていますが、一般的に言うと tcp を使ったサーバは nowait で、udp を使ったサーバは wait になっ ているはずです。いくつか例外もありますので、不確実な場合は先に示した例 を見てください。

user

フィールドには、指定したネットワークサービスを起動する ユーザ名を指定します。このユーザ名は /etc/passwd に登録されて いなければなりません。ユーザを指定しておくのはセキュリティ上も役立ちま す。起動するユーザを nobody にしておけば、ネットワークサーバ のセキュリティが破られても被害を最小限に留めることが可能です。もっとも、 この欄はたいていの場合 root になっています。なぜならば、ほ とんどのサービスでは正しく機能するためにルート権限が必要だからです。

server_path

この欄は実際に実行するサーバプログラムを絶対パスで指定します。

server_args

この欄は必須ではありませんが、ここから行末までを、サーバプログラムを 起動する際に渡すコマンドライン引数に用いられます。

/etc/inetd.conf の例

/etc/services ファイルと同様、最近の Linux の配布パッケージで は充分な /etc/inetd.conf ファイルが付属しています。ここでも Debian パッケージからコピー してきた /etc/inetd.conf の例を示すことにしましょう。

# /etc/inetd.conf:  see inetd(8) for further informations.
#
# Internet server configuration database
#
#
# Modified for Debian by Peter Tobias <tobias@et-inf.fho-emden.de>
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
# Internal services
#
#echo           stream  tcp     nowait  root    internal
#echo           dgram   udp     wait    root    internal
discard         stream  tcp     nowait  root    internal
discard         dgram   udp     wait    root    internal
daytime         stream  tcp     nowait  root    internal
daytime         dgram   udp     wait    root    internal
#chargen        stream  tcp     nowait  root    internal
#chargen        dgram   udp     wait    root    internal
time            stream  tcp     nowait  root    internal
time            dgram   udp     wait    root    internal
#
# These are standard services.
#
telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.telnetd
ftp     stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.ftpd
#fsp    dgram   udp     wait    root    /usr/sbin/tcpd  /usr/sbin/in.fspd
#
# Shell, login, exec and talk are BSD protocols.
#
shell   stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rshd
login   stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rlogind
#exec   stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rexecd
talk    dgram   udp     wait    root    /usr/sbin/tcpd  /usr/sbin/in.talkd
ntalk   dgram   udp     wait    root    /usr/sbin/tcpd  /usr/sbin/in.ntalkd
#
# Mail, news and uucp services.
#
smtp    stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.smtpd  
#nntp   stream  tcp     nowait  news    /usr/sbin/tcpd  /usr/sbin/in.nntpd
#uucp   stream  tcp     nowait  uucp    /usr/sbin/tcpd  /usr/lib/uucp/uucico
#comsat dgram   udp     wait    root    /usr/sbin/tcpd  /usr/sbin/in.comsat
#
# Pop et al
#
#pop-2  stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.pop2d
#pop-3  stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.pop3d
#
# `cfinger' is for the GNU finger server available for Debian.  (NOTE: The
# current implementation of the `finger' daemon allows it to be run as `root'.)
#
#cfinger stream tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.cfingerd
#finger stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.fingerd
#netstat        stream  tcp     nowait  nobody  /usr/sbin/tcpd  /bin/netstat
#systat stream  tcp     nowait  nobody  /usr/sbin/tcpd  /bin/ps -auwwx
#
# Tftp service is provided primarily for booting.  Most sites
# run this only on machines acting as "boot servers."
#
#tftp   dgram   udp     wait    nobody  /usr/sbin/tcpd  /usr/sbin/in.tftpd
#tftp   dgram   udp     wait    nobody  /usr/sbin/tcpd  /usr/sbin/in.tftpd /boot
#bootps dgram   udp     wait    root    /usr/sbin/bootpd        bootpd -i -t 120
#
# Kerberos authenticated services (these probably need to be corrected)
#
#klogin         stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rlogind -k
#eklogin        stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rlogind -k -x
#kshell         stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rshd -k
#
# Services run ONLY on the Kerberos server (these probably need to be corrected)
#
#krbupdate      stream tcp      nowait  root    /usr/sbin/tcpd  /usr/sbin/registerd
#kpasswd        stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/kpasswdd
#
# RPC based services
#
#mountd/1       dgram   rpc/udp wait    root    /usr/sbin/tcpd  /usr/sbin/rpc.mountd
#rstatd/1-3     dgram   rpc/udp wait    root    /usr/sbin/tcpd  /usr/sbin/rpc.rstatd
#rusersd/2-3    dgram   rpc/udp wait    root    /usr/sbin/tcpd  /usr/sbin/rpc.rusersd
#walld/1        dgram   rpc/udp wait    root    /usr/sbin/tcpd  /usr/sbin/rpc.rwalld
#
# End of inetd.conf.
ident           stream  tcp     nowait  nobody  /usr/sbin/identd        identd -i

5.9 その他のネットワークに関連した設定ファイル

他にもさまざまなネットワークに関する設定ファイルがあります。通常、それ らを修正する必要はありませんが、どのようなファイルが存在し、それらは何 を設定しているかを知っておいても損は無いでしょう。

/etc/protocols

/etc/protocols ファイルは TCP/IP パケットに埋めこまれている各 種プロトコルの識別番号とプロトコルを結びつけるデータベースになっていま す。このファイルを使えば、プログラムから特定のプロトコルを識別番号では なく名前で参照できるようになり、tcpdump のようなプ ログラムも出力に番号ではなく、プロトコル名で表示するようになります。この ファイルの一般的な書式は

protocolname  number  aliases

となります。

Debian パッケージに付属の /etc/protocols ファイルは以下の通りです。

# /etc/protocols:
# $Id: NET-3-HOWTO.sgml,v 1.4 2000/12/28 10:19:46 nakano Exp $
#
# Internet (IP) protocols
#
#       from: @(#)protocols     5.1 (Berkeley) 4/17/89
#
# Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992).

ip                      0       IP                      # internet protocol, pseudo protocol number
icmp            1       ICMP            # internet control message protocol
igmp            2       IGMP            # Internet Group Management
ggp                     3       GGP                     # gateway-gateway protocol
ipencap         4       IP-ENCAP        # IP encapsulated in IP (officially ``IP'')
st                      5       ST                      # ST datagram mode
tcp                     6       TCP                     # transmission control protocol
egp                     8       EGP                     # exterior gateway protocol
pup                     12      PUP                     # PARC universal packet protocol
udp                     17      UDP                     # user datagram protocol
hmp                     20      HMP                     # host monitoring protocol
xns-idp         22      XNS-IDP         # Xerox NS IDP
rdp                     27      RDP                     # "reliable datagram" protocol
iso-tp4         29      ISO-TP4         # ISO Transport Protocol class 4
xtp                     36      XTP                     # Xpress Tranfer Protocol
ddp                     37      DDP                     # Datagram Delivery Protocol
idpr-cmtp       39      IDPR-CMTP       # IDPR Control Message Transport
rspf            73      RSPF            # Radio Shortest Path First.
vmtp            81      VMTP            # Versatile Message Transport
ospf            89      OSPFIGP         # Open Shortest Path First IGP
ipip            94      IPIP            # Yet Another IP encapsulation
encap           98      ENCAP           # Yet Another IP encapsulation

/etc/networks

/etc/networks ファイルは /etc/hosts ファイルとよく似 た機能を持っており、ネットワークアドレスとネットワーク名の対応表になっ ています。/etc/hosts ファイルとの違いは各行に 2 つの欄しか無 いことで、各行は以下のように構成されます。

# networkname networkaddress

例えばこのようになります。

loopnet    127.0.0.0
localnet   192.168.0.0
amprnet    44.0.0.0

route コマンドを使う際、目的地がネットワークで、そのネットワー クアドレスが /etc/networks に登録されていれば、route コマンドの出力はアドレスではなく名前になります。

5.10 ネットワークのセキュリティとアクセス管理

まず最初に注意しておきますが、悪意を持った攻撃からマシンとネットワーク のセキュリティを守るのは複雑な技術が必要になります。私自身この分野につ いてはとてもエキスパートとは言えません。そのため、以下に有益であろう手 段を紹介しますが、もしセキュリティについて真剣に考えるならば自分自身で 調べてみることをお薦めします。インターネット上にはこの問題についての情 報が豊富にあります。

まず第一にやるべきことは、必要の無いサーバは起動しない ことで す。Linux の各種配布パッケージではあらかじめ全てのサービスが設定され、 それらは自動的に起動するようになっています。最低限の安全を確保するため に、まず /etc/inted.conf に目を通して、使う必要の無いサービス をコメントアウト(行頭に # を付ける)しておきましょう。コメントアウ トしておいた方がいいサービスは shellloginexecuucpftp といったサービスと、 fingernetstatsystat といった情報提供 用サービスです。

セキュリティとアクセス管理のメカニズムにはさまざまな種類がありますので、 以下ではごく基本的なものだけを説明します。

/etc/ftpusers

/etc/ftpusers ファイルは ftp 経由で特定のユーザがログインする ことを許可しないための簡単な仕組みです。/etc/ftpusers は ftp 接 続があった際に ftp デーモンプログラム ftpd が読みこみます。こ のファイルは単に ftp を許可しないユーザを列挙しただけのものです。この ファイルは以下のような形式になっています。

# /etc/ftpusers - users not allowed to login via ftp
root
uucp
bin
mail

/etc/securetty

/etc/securetty ファイルを使えばどの tty デバイスから root がログオンできるかを指定できます。 /etc/securetty ファイルは login プログラム(通常は /bin/login)が読みます。このファイルにはルートのアクセスを許可 する tty を列挙します。その他の tty からはルートでアクセスできません。

# /etc/securetty - tty's on which root is allowed to login
tty1
tty2
tty3
tty4

tcpd を使ったアクセスコントロール

tcpd プログラムは /etc/inetd.conf で見たように、指定 されたサービスをより安全に実行するために、ログインとアクセス管理の機能 を提供します。

inetd から起動されると、tcpd は指定したサービスへの アクセスを許可するか拒否するかを記述した 2 つのファイルを読みこみます。

tcpd/etc/hosts.allow/etc/hosts.deny の 2 つのファイルをこの順に調べ、一致する記述があるかどうかをチェック します。一致する記述がなければそのサービスは全ての人に許可しているもの と見なします。以下にこれらのファイルについて説明します。詳細については それぞれの man ページを読んでください(まず hosts_access(5) か ら始めるのがよいでしょう)。

/etc/hosts.allow

/etc/hosts.allow ファイルは /usr/sbin/tcpd 用の設定 ファイルです。hosts.allow ファイルにはどのマシンからの接続を 許可するかの設定を記述します。

このファイルの書式はごく単純です。

# /etc/hosts.allow
#
# <service list>: <host list> [: command]

service list

は、このルールを適用するサーバプログラムをコンマで区切って記述します。 サーバプログラムには ftpd telnetd fingerd などがあります。

host list

はホスト名をコンマで区切って記述します。ホスト名の代りに IP アドレスを 使うことも可能です。ワイルドカードキャラクタを使って複数のホストや IP アドレスを指定可能です。例えば、gw.vk2ktj.ampr.org と書くと 1 つのホストを指定したことになりますが、.uts.edu.au とするとこの文字列で終るホスト(このドメインに属するホスト)全てを指定し たことになります。44. とすると、この IP アドレスで始まるホス ト全てに一致します。設定を簡単にするためにいくつか特別のキーワードが用 意してあります。例えば ALL は全てのホスト名にマッチし、 LOCAL. を含まないホスト名、すなわちそのマシンと 同じドメインにあるマシンにマッチし、PARANOID は登録されている ホスト名と IP アドレスがマッチしない全てのマシン(名前を詐称しているマ シン)に一致します。もう一つ、役に立つキーワードに EXCEPT があ ります。これは例外リストになります。例については後述します。

command

は必須ではないパラメータで、この行のルールが適用される際に実行されるコ マンドへのフルパスを指定します。この機能を使えば、接続してきたホストに 誰がログインしているかを調べたり、誰かが接続しようとするとメールなどの 手段を用いて管理者に報せることが可能です。ここには様々な変数が用意され ており、たとえば %h は接続してきたホスト名かホスト名が分らな い場合には IP アドレスに変換され、%d は呼び出されたデーモン 名に変換されます。

以下に例を示します。

# /etc/hosts.allow
#
# メールは全ての人に許可
in.smtpd: ALL
# telnet と ftp は同じドメインのホストか自宅のホストにのみ許可
telnetd, ftpd: LOCAL, myhost.athome.org.au
# finger は全ての人に許可するが、誰が試みたかは記録
fingerd: ALL: (finger @%h | mail -s "finger from %h" root)

/etc/hosts.deny

/etc/hosts.deny/usr/sbin/tcpd プログラムの設定ファ イルで、どのホストからの接続を拒否するかを設定します。

A simple sample would look something like this:

以下に簡単な例を示します。

# /etc/hosts.deny
#
# ホスト名を詐称しているホストは不許可
ALL: PARANOID
#
# 全てのホストを不許可
ALL: ALL

PARANOID の指定は実際のところ不要です。なぜならば、もう一つの エントリで全ての接続を拒否しているからです。必要に応じてこれらのエント リのどちらかをデフォルトにするのもいいでしょう。

/etc/hosts.denyALL:ALL を設定し、 /etc/hosts.allow で提供したいサービスのみを特定のホストに許可 するように設定するのが一番安全でしょう。

/etc/hosts.equiv

hosts.equiv ファイルは、パスワード無しにあなたのマシンにアク セスできるホストとユーザを指定します。この機能は全てのマシンがあなたの 管轄下にある安全な環境では便利ですが、それ以外の状況ではセキュリティ的 には危険です。あなたのマシンのセキュリティは、このファイルに登録したホ ストの中のセキュリティが最も弱いマシンと同じレベルになってしまいます。 セキュリティを高めるためにはこの機能は使わないようにして、 各ユーザにも .rhosts ファイルを使わないようにさせましょう。

ftpデーモンを正しく設定する。

多くのサイトで、匿名(anonymous) ftp サーバを動かして、特定の ユーザ ID が無い人々にもファイルのダウンロードやアップロードを許可して います。この機能を使う場合は ftp デーモンが匿名アクセスを正し く処理できるように設定されているかを確認してください。 ftpd(8) の man ページは、この設定のためにかなりの紙幅を費やし ているので、それらの指示に従って設定しているか、常に注意してください。 重要なポイントは /etc/passwd ファイルのコピーを匿名 ftp 用の /etc/ ディレクトリで使わないことです。絶対に必要なアカウント 以外は passwd ファイルから削除しておきましょう。そうしないと総当たり式 の攻撃でパスワードを解読されてしまう危険性があります。

Network ファイアウォール

あなたのマシンやサーバにまでデータグラムが届かないようにすることはセキュ リティ的に優れた方法です。この方法の詳細については Firewall-HOWTO に解説があります。

その他のコメント

多少宗教がかってきますが、その他の注意しておくべきポイントを述べておき ます。

sendmail

sendmail デーモンは有名なプログラムですが、しばしばセキュリティ 的な問題についても報告されています。どうするかはおまかせしますが、私は sendmail は動かさないことにしました。

NFS とその他 Sun の RPC を使うサービス

についても慎重になる べきです。これらのサービスはさまざまな方法で悪用可能です。NFS のような サービスの代りを見つけるのは困難ですが、これらを設定する際には誰にマウ ント許可を与えるかに充分注意する必要があります。


次のページ 前のページ 目次へ