以下の節では実際にネットワークを設定する前に知っておいた方がよいことに ついてまとめておきます。これらは、どのようなネットワーク機能を使う場合に も基本となることです。
ネットワークを構築したり、ネットワークを設定する前に用意しておくべき必 要なものがいくつかあります。以下にもっとも重要なものを説明します。
多分、現在お使いのカーネルにはネットワークに必要な機能やネットワークカー ド用のドライバが組みこまれていないでしょうから、カーネルのソースを入手 して、適切なオプションを指定し、カーネルを再構築する必要があるでしょう。
最新のカーネルソースは 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 #
ネットワークアプリケーションプログラムとは、telnet や
ftp などと、それらのサーバプログラムのことです。これらの大部
分は 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 #
インターネットプロトコル用のアドレスは 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マシンを接続したい場合、ネットワークの管理 者に相談して以下の情報を教えてもらってください。
これらの情報を使ってあなたの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アドレスを使ってください。
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
-----------------------------------------
多くの Unix では /dev ディレクトリにネットワークデバイス用の スペシャルファイルがありますが、Linux ではありません。Linux ではネット ワークデバイスはソフトウェアによって動的に作成されるので、デバイスファ イルは不要になっています。
ほとんどの場合、ネットワークデバイスは、デバイスドライバがハードウェア
を検出して初期化する際に、自動的に作成されます。例えばイーサネットデバ
イスドライバは、 eth[0..n]
というインターフェイスをイーサネット
ハードウェアに順に割りあてていきます。最初に検出されたイーサネッカード
が eth0
、次が eth1
、等々になります。
例外もいくつかあり、有名なものはslip と ppp ですが、 これが使うネットワークデバイスはデバイスドライバではなくユーザプログラ ムが作成します。それぞれのデバイスに付けられる番号は、デバイスドライバ が割りあてるのと同様に順に振られていきますが、起動時にデバイスが自動的 に作成されるということはありません。なぜこのようになっているのかと言う と、イーサネットデバイスとは異なり、slip や ppp デバ イスは、マシンの稼働中に必要な数が変化するからです。詳細については後述 します。
ネットワークの設定に必要なプログラムと情報が揃えばネットワークインター フェイスの設定を始めましょう。ネットワークインターフェイスの設定とは、 ネットワークデバイスに適切なアドレスを割りあてたり、その他ネットワーク デバイスを設定するための適切な値を指定することです。このためのプログラ ムが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コマンドで指定できるオプションはいろいろあります。もっ とも重要なものを列挙すると、
このオプションでインターフェイスを利用可能(アクティブ)にします。
このオプションではインターフェイスを使用停止にします。
このオプションで ARP(Address Resolution Protocol)を使うかどうかの指定 ができます。
このオプションで promiscuous モードの有無を指定します。promiscuous モー ドとは、そのデバイス宛ではないパケットも受けつけるモードです。 tcpdump などのパケット snooper を使う場合はこの指定が必要です。
このパラメータはデバイスの MTU(Maximum Transfer Unit)を設定し ます。
このパラメータはデバイスが接続しているネットワークのネットワークマスク を設定します。
このパラメータは特定の種類のハードウェアにしか使えませんが、デバイスの ハードウェアの IRQ を設定します。
このパラメータで、指定したブロードキャストアドレス宛のデータグラ ムを受け取るかどうかを設定できます。
このパラメータは slip や ppp などの一対一接続の場合 の接続先アドレスの指定です。
このパラメータは特定の種類のネットワークデバイスのハードウェアアドレス を設定します。Ethernet の場合はそれほど役に立ちませんが、AX.25 のよう なネットワークの場合に必要な機能です。
リゾルバ(Name Resolver) は Linux の標準ライブラリに含まれてい
ます。リゾルバの主な機能は人間向きの ftp.funet.fi
のようなホ
スト名を 128.214.248.6
のような IP アドレスに変換することです。
すでにインターネットのホスト名については御存知だと思いますが、それらが どういう意味で、どのように構成されているかについては御存知ないかも知れ ません。インターネットのドメイン名は階層構造、すなわち木のような構造に になっています。ドメイン とは、一つのまとまり、すなわち複数の ホスト名を一つのグループにまとめたものです。ドメイン はサ ブドメイン に分割されているかも知れません。トップレベル・ドメ イン とはサブドメインではないドメインです。トップレベル・ドメイン については RFC-920 で規定されています。もっともよく知られたトップレベ ルドメインは、
営利組織
教育機関
政府機関
軍事機関
その他の組織
国を示す 2 文字のコード
これらのトップレベル・ドメインはそれぞれサブドメインを持っています。国
を示す 2 文字のコードがトップレベル・ドメインになっている場合、サブド
メインとしてcom
や edu
、 gov
、 mil
、 org
といっ
た組織の種別を示すドメインが来ます。例えば com.au
と
gov.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
はリゾルバの使う一番重要な設定ファイルです。
このファイルの書式はごく簡単で、各行に 1 つのキーワードを配したテキス
トファイルになっています。よく使われるキーワードは以下の 3 種です。
このキーワードはローカルのドメイン名を設定します。
このキーワードはホスト名を検索する際に用いるドメイン名のリストを指定し ます。
このキーワードは名前を変換する際に使うドメイン・ネーム・サーバの 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
ファイルはリゾルバの動作方法を設定するファイル
です。このファイルのフォーマットの詳細は `resolv+
の man ペー
ジにあります。ほとんど全ての環境では、以下の設定のままでいいでしょう。
order hosts,bind
multi on
この設定の場合、リゾルバはネームサーバに問い合わせるまえに、まず自分自
身の持つ /etc/hosts
ファイルをチェックします(order
hosts,bind)。/etc/hosts
ファイルに複数の IP アドレスが登録さ
れていた場合、最初のアドレスだけでなく、全てのアドレスを報告します
(multi on)。
/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 アドレスでもあ ります。
ループバックインターフェイスとは、自分自身に接続するために用意された特
別な種類のインターフェイスです。このようなインターフェイスを用意してい
るのにはいくつかの理由があります。例えば、実際のネットワークに接続せず
にネットワーク用のソフトウェアをテストするなどの目的に使えます。慣例と
して、ループバックインターフェイスには `127.0.0.1
のアドレス
が使われます。ですから、どんなマシンを使っていようとも telnet で
127.0.0.1
に接続すれば、自分自身に接続することになります。
ループバックインターフェイスの設定は簡単で、次のようにするだけです。
# ifconfig lo 127.0.0.1
# route add -host 127.0.0.1 lo
route コマンドについては次節で説明します。
経路制御は大きな話題で、それだけで大部の本を書くことができます。一部の 人を別にすれば、ほとんどの人はごく単純な経路制御が必要なだけと思います ので、以下ではごく基本的な話題についてのみ扱うことにします。より詳細な 情報が必要ならば、この文書の最初に示した各種の文献にあたってください。
まず定義から始めましょう。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
オプションを指定する必要があります。
上述した経路設定は単純なネットワーク構成に適しており、取り得る経路は一 つしかありませんでした。もっと複雑なネットワーク構成になれば設定はもう 少し複雑になります。幸いなことに、大部分の人はそのような設定を使う必要 はありません。
上述してきた「手動経路設定」、すなわち「静的経路設定」の大きな問題点は、 ネットワークの中のマシンやどこかの接続がダウンした場合、データグラムを 別の経路へ送るようにするには、〜別の経路がある場合ですが〜、手動で、設 定を変更するために必要なコマンドを実行しなければなりません。通常、この 作業は面倒で、手間がかかり、非実用的で、トラブルの原因になりがちです。 そのため、ネットワークにトラブルが生じた場合、別の経路を探して自動的に 経路表を変更するための様々な技術が開発されてきました。これらはまとめて 「動的経路制御プロトコル」と呼ばれています。
一般的な動的経路制御プロトコルのいくつかについては御存知かも知れません。 多分、これらのプロトコルの中で最も有名なものは 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:
動的経路制御についての重要なポイントは以下の通りです。
ネットワーク経由の各種サービスとそのためのサーバを起動すれば、遠隔地に いるユーザが、ネットワーク経由であなたの Linux マシンを使うことができ ます。誰かがネットワーク経由で接続してくると、あらかじめ起動されている サーバプロブラムか、各種サーバプログラムを起動するためのデーモンプログ ラム(inetd)が、どのポートへの接続かを確認し、接続を受けつけると共にプ ログラムを実行します。ネットワークデーモンの動作方法には 2 つの種類が あり、2 つの種類とも実際に用いられています。それらは、
ネットワークサービス用のプログラムはあらかじめ起動されて受けもちのポー トを監視しており、接続があれば自分で必要なサービスを提供します。
ined サーバはネットワーク接続を受けつけるための特別のデーモン プログラムです。このプログラムは設定ファイルに従って tcp と udp、接続 ポートの組み合わせから、必要なサービスを提供するためのプログラムを決定 し、そのプログラムを起動します。ポートを指定するためのファイルは別にあ ります。
設定すべき重要なファイルは 2 つで、ポート番号をサービス名に対応づける
/etc/services
と、inetd デーモンの設定ファイルである
/etc/inetd.conf
ファイルです。
/etc/services
ファイルはサービス名とポート番号の対応を示した
単純なデータベースです。このファイルの書式はごく単純で、普通のテキスト
ファイルの各行にデータベースへのエントリが記述されています。それぞれの
エントリは任意の数の空白文字(タブかスペース)で分離された 3 つの欄から
構成されます。また、#から後はコメントとして無視されます。欄の構成
は
name port/protocol aliases # comment
となっています(#はコメント部です)。
は一語でこの行の内容を表わします。
この欄は 2 つの部分に分かれます。
はこの行が示すサービスを提供するためのポート番号で
す。よく使われるサービスにはあらかじめポート番号が割りあてられてい
ます。詳細については RFC-1340
を御覧ください。
欄はこのサービスが tcp
と udp
のどちらを使うかを指定します。
注意しておかなければならないことは、18/tcp
と 18/udp
は全く異なる意味を持つということです。1つのサービスが同じポートの tcp
と udp を使わなければならない技術的な理由はありません。しかしながら、
常識的な意味から、特定のサービスが tcp
でも udp
でも
使える場合、それらは同じポートを使うようになっており、
/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
ファイルは inetd
サーバデーモンの設
定ファイルです。このファイルはあるサービスへの要求が来たとき、
inetd がどのように処理するかを指定します。受けつけるサービス
それぞれについて、inetd
に、どのネットワークデーモンをどのよ
うに起動するかについて指定してやらねばなりません。
このファイルも書式はごく単純です。普通のテキストファイルで各行に提供す
べきサービスが記述してあります。#
以降の部分はコメントと
して無視されます。各行には任意の数の空白文字(タブかスペース)で区切られ
た 7 つの欄があります。一般的な書式は以下の通りです。
service socket_type proto flags user server_path server_args
ここで、
は /etc/services
ファイルに指定したそれぞ
れのサービス名です。
の欄はこのエントリが使用するソケットの種類です。
使えるのは stream
、dgram
、raw
、rdm
、
seqpacket
です。詳細は技術的な話になるので省略しますが、一般
的に言うと、tcp
を使ったほぼ全てのサービスは stream
を使い、udp
を使ったほぼ全てのサービスは dgram
を使
います。これ以外のソケットを使うのはごく限られた特殊のサーバだけ
です。
はこのエントリが使うプロトコルを示します。ここでの指
定は /etc/services
の対応するエントリと一致しておらねばならず、
たいていの場合、tcp
か udp
のどちらかです。Sun の
RPC(Remoto Procedure Call)を使ったサービスでは rpc/tcp
か
rpc/udp
を使うことがあります。
は wait
か nowait
かのどちらかです。
この欄は、inetd
が起動したネットワークサービス用デーモンが、
起動後はソケットを解放するため、即座に次の接続リクエストを受けつける
ことが可能か、ネットワークサービス用デーモンが動いている間は新しい接続
を受けつけずに待つかの指定です。この項目も多少トリッキーな方法で実現し
ていますが、一般的に言うと tcp
を使ったサーバは
nowait
で、udp
を使ったサーバは wait
になっ
ているはずです。いくつか例外もありますので、不確実な場合は先に示した例
を見てください。
フィールドには、指定したネットワークサービスを起動する
ユーザ名を指定します。このユーザ名は /etc/passwd
に登録されて
いなければなりません。ユーザを指定しておくのはセキュリティ上も役立ちま
す。起動するユーザを nobody
にしておけば、ネットワークサーバ
のセキュリティが破られても被害を最小限に留めることが可能です。もっとも、
この欄はたいていの場合 root
になっています。なぜならば、ほ
とんどのサービスでは正しく機能するためにルート権限が必要だからです。
この欄は実際に実行するサーバプログラムを絶対パスで指定します。
この欄は必須ではありませんが、ここから行末までを、サーバプログラムを 起動する際に渡すコマンドライン引数に用いられます。
/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
他にもさまざまなネットワークに関する設定ファイルがあります。通常、それ らを修正する必要はありませんが、どのようなファイルが存在し、それらは何 を設定しているかを知っておいても損は無いでしょう。
/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/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
コマンドの出力はアドレスではなく名前になります。
まず最初に注意しておきますが、悪意を持った攻撃からマシンとネットワーク のセキュリティを守るのは複雑な技術が必要になります。私自身この分野につ いてはとてもエキスパートとは言えません。そのため、以下に有益であろう手 段を紹介しますが、もしセキュリティについて真剣に考えるならば自分自身で 調べてみることをお薦めします。インターネット上にはこの問題についての情 報が豊富にあります。
まず第一にやるべきことは、必要の無いサーバは起動しない ことで
す。Linux の各種配布パッケージではあらかじめ全てのサービスが設定され、
それらは自動的に起動するようになっています。最低限の安全を確保するため
に、まず /etc/inted.conf
に目を通して、使う必要の無いサービス
をコメントアウト(行頭に # を付ける)しておきましょう。コメントアウ
トしておいた方がいいサービスは shell
、login
、
exec
、uucp
、ftp
といったサービスと、
finger
や netstat
、systat
といった情報提供
用サービスです。
セキュリティとアクセス管理のメカニズムにはさまざまな種類がありますので、 以下ではごく基本的なものだけを説明します。
/etc/ftpusers
ファイルは ftp 経由で特定のユーザがログインする
ことを許可しないための簡単な仕組みです。/etc/ftpusers
は ftp 接
続があった際に ftp デーモンプログラム ftpd が読みこみます。こ
のファイルは単に ftp を許可しないユーザを列挙しただけのものです。この
ファイルは以下のような形式になっています。
# /etc/ftpusers - users not allowed to login via ftp
root
uucp
bin
mail
/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 プログラムは /etc/inetd.conf
で見たように、指定
されたサービスをより安全に実行するために、ログインとアクセス管理の機能
を提供します。
inetd から起動されると、tcpd
は指定したサービスへの
アクセスを許可するか拒否するかを記述した 2 つのファイルを読みこみます。
tcpd
は /etc/hosts.allow
と /etc/hosts.deny
の 2 つのファイルをこの順に調べ、一致する記述があるかどうかをチェック
します。一致する記述がなければそのサービスは全ての人に許可しているもの
と見なします。以下にこれらのファイルについて説明します。詳細については
それぞれの man ページを読んでください(まず hosts_access(5)
か
ら始めるのがよいでしょう)。
/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
も /usr/sbin/tcpd プログラムの設定ファ
イルで、どのホストからの接続を拒否するかを設定します。
A simple sample would look something like this:
以下に簡単な例を示します。
# /etc/hosts.deny
#
# ホスト名を詐称しているホストは不許可
ALL: PARANOID
#
# 全てのホストを不許可
ALL: ALL
PARANOID
の指定は実際のところ不要です。なぜならば、もう一つの
エントリで全ての接続を拒否しているからです。必要に応じてこれらのエント
リのどちらかをデフォルトにするのもいいでしょう。
/etc/hosts.deny
で ALL:ALL
を設定し、
/etc/hosts.allow
で提供したいサービスのみを特定のホストに許可
するように設定するのが一番安全でしょう。
hosts.equiv
ファイルは、パスワード無しにあなたのマシンにアク
セスできるホストとユーザを指定します。この機能は全てのマシンがあなたの
管轄下にある安全な環境では便利ですが、それ以外の状況ではセキュリティ的
には危険です。あなたのマシンのセキュリティは、このファイルに登録したホ
ストの中のセキュリティが最も弱いマシンと同じレベルになってしまいます。
セキュリティを高めるためにはこの機能は使わないようにして、
各ユーザにも .rhosts
ファイルを使わないようにさせましょう。
多くのサイトで、匿名(anonymous) ftp サーバを動かして、特定の
ユーザ ID が無い人々にもファイルのダウンロードやアップロードを許可して
います。この機能を使う場合は ftp デーモンが匿名アクセスを正し
く処理できるように設定されているかを確認してください。
ftpd(8)
の man ページは、この設定のためにかなりの紙幅を費やし
ているので、それらの指示に従って設定しているか、常に注意してください。
重要なポイントは /etc/passwd
ファイルのコピーを匿名 ftp 用の
/etc/
ディレクトリで使わないことです。絶対に必要なアカウント
以外は passwd ファイルから削除しておきましょう。そうしないと総当たり式
の攻撃でパスワードを解読されてしまう危険性があります。
あなたのマシンやサーバにまでデータグラムが届かないようにすることはセキュ リティ的に優れた方法です。この方法の詳細については Firewall-HOWTO に解説があります。
多少宗教がかってきますが、その他の注意しておくべきポイントを述べておき ます。
sendmail デーモンは有名なプログラムですが、しばしばセキュリティ
的な問題についても報告されています。どうするかはおまかせしますが、私は
sendmail
は動かさないことにしました。
についても慎重になる べきです。これらのサービスはさまざまな方法で悪用可能です。NFS のような サービスの代りを見つけるのは困難ですが、これらを設定する際には誰にマウ ント許可を与えるかに充分注意する必要があります。