以下の節では実際にネットワークを設定する前に知っておいた方がよいことに ついてまとめておきます。これらは最も基本となる原理で、あなたが実際に 張ろうとしているネットワークの実際の種類によらず、全てのネットワークに 適用されます。
ネットワークを構築したり設定したりする前に用意しておくべき ものがいくつかあります。まず最も重要なものから。
以下の点に注意してください:
最近のディストリビューションのほとんどにはネットワーク機能を有効にした カーネルが付属 しているので、カーネルを再コンパイルする必要はないと思います。よく知ら れているハードウェアを使っていればうまく動作するはずです。例えば 3COM の NIC や NE2000 の NIC, Intel の NIC などです。しかし、カーネルを更 新する必要がある状況になった場合には、以下の手順をご覧ください。
現在お使いのカーネルには、おそらく使いたいネットワークに機能のサポートや 使いたいネットワークカード用のドライバが組み込まれていないのでしょう。 カーネルのソースを入手して、適切なオプションを指定し、カーネルを再構築する 必要があるでしょう。
ただし、これは RedHat, Caldera, Debian, SuSE といったメジャーな ディストリビューションを使っている場合にはもはや当てはまりません。一般 的なハードウェアを使っている限りは、ごく特殊な機能を使わなければカーネル を再コンパイルする必要はないはずです。
最新のカーネルは常に ftp.cdrom.com から入手できます。これは公式サイトではありませんが、大きい帯域幅 を持ち、たくさんのユーザを受け入れることができます。公式サイトは kernel.org ですが、できるだけ ftp.cdrom.com を使ってください。 ftp.kernel.org は非常に負荷が高い状態です。ミラーサイトを使ってください。
[訳注: 日本では ftp.jp.kernel.org を利用するとよいでしょう]
通常カーネルのソースは /usr/src/linux
ディレクトリに展開し
ます。パッチの当て方やカーネルの構築方法については
Kernel-HOWTO を読んでください。
カーネルモジュールの設定方法については
``Modules mini-HOWTO'' をご覧ください。また、カーネルソースと
Documentation
ディレクトリに入っている README
ファイルは、気合いの入った読者には非常に有益な情報が書かれています。
特別に言及しない限り、安定版のカーネルを使うことをお勧めします (バージョン番号の 2 つめの数字が偶数のバージョンです)。開発版のカーネル (2 つめの数字が奇数のバージョン)は内部構造が大きく変わっていたり、その 他さまざまな変更が行なわれているため、今まで動いていたソフトウェアがう まく動かないかもしれません。自分でそれらの問題を解決したり、それらの ソフトウェアに潜む問題を解決できないのであれば、開発版のカーネルは使わ ないほうがいいでしょう。
その一方、この文書で説明する機能の一部はバージョン 2.1 のカーネルの 開発段階で導入されたものです。そこで選ばなければなりません: 2.2 カーネルと全てのツールが更新されたディストリビューションを待って 2.0 に留まるか、2.1 を入手し、その新機能を利用するのに必要な各種 補助プログラムを探し回るかです。この節を書いている 1998 年 8 月の時点 では、2.1.115 が最新バージョンで、じきに 2.2 が出るものと考えられてい ます。
ネットワークツールとは、Linux のネットワークデバイスを設定するためのプ ログラムです。これらのプログラムを用いてネットワークデバイスにアドレス を割り当てたり、経路情報を設定したりします。
最近の Linux ディストリビューションには、大抵ネットワークツールも含ま れています。ですから、システムはディストリビューションからインストール していて、ネットワークツールはまだインストールしていないようなら、 インストールしてください。
ディストリビューションを使わずにシステムを構築した場合には、ネットワー クツールはソースコードを入手してコンパイルする必要があります。しかし、 これはそんなに難しい作業ではありません。
ネットワークツールは Bernd Eckenfels がメンテナンスしており、 ftp.inka.de から入手可能です。ここは ftp.uk.linux.org にミラーされています。
また、RedHat の最新パッケージを net-tools-1.51-3.i386.rpm から入手できます。
お使いのカーネルのバージョンにあったバージョンを入手して、インストール の際は付属の文書の指示に従ってください。
この文書を執筆している時点での最新版のネットワークツールをコンパイル してインストールするには以下のようにします:
user% tar xvfz net-tools-1.33.tar.gz
user% cd net-tools-1.33
user% make config
user% make
root# make install
RedHat のパッケージを使う場合には以下のようにします:
root# rpm -U net-tools-1.51-3.i386.rpm
さらに、ファイアウォールを設定したり、IP マスカレード機能を使いたい場合は、
ipfwadm コマンドも必要です。ipfwadm
の最新版は
ftp.xos.nl
から入手できます。このコマンドにもいくつかのバージョンがあるので、
カーネルのバージョンに合ったものを入手してください。Linux の
ファイアウォール機能は 2.1 の開発中に変更され、カーネル 2.2 では
ipchains に置き換えられたので注意してください。
ipfwadm はカーネル 2.0 でしか使えません。
以下のディストリビューションには 2.0 以前のカーネルが付属していること
がわかっています。
Redhat 5.2 以前
Caldera 2.2 より前のバージョン
Slackware 4.x より前のバージョン
Debian 2.x より前のバージョン
この文書の執筆時点での最新版をインストールするには、 The Linux Documentation Project にある IPChains HOWTO を読んでください。
バージョン 2.2(または 2.1 後期)のカーネルを使っている場合は、 ipfwadm はファイアウォールの設定を行うための正しいプログラムでは ありません。このバージョンの NET-3-HOWTO では今のところファイアウォール の新しい設定方法は扱いません。ipchains に関する詳しい情報が必要ならば、 先に紹介した HOWTO を見てください。
ネットワークアプリケーションプログラムとは、telnet や
ftp などと、それらのサーバプログラムのことです。これらの大部
分は、以前は David Holland がメンテナンスしていましたが、現在は
netbug@ftp.uk.linux.org
がメンテナンスしています。配布物は
ftp.uk.linux.org
から入手可能です。
インターネットプロトコル用のアドレスは 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 ----------------- ---------------
ホストに付けられたアドレスのうち、ネットマスクとビットごとに論理積(AND)を取っ たものがネットワークアドレスになります。すなわち、ネットワークアドレス は、それぞれのネットワークに割り当てられたアドレスの最小のものになりま す。つまり、ネットワークアドレスはアドレスのホスト部を全て 0 にした ものです。
ネットワークに接続されているホストは自分自身のアドレスに送られたパケッ
トを受けとりますが、それ以外にも「ブロードキャストアドレス」という特別
に設定されたアドレスに送られたパケットも受けとります。ブロードキャスト
アドレスは、ネットワーク上にいる全てのホストにパケットを送りたい場合に
利用する特別のアドレスです。経路情報や各種の警告メッセージなどはブロー
ドキャストアドレスへ送出され、ネットワーク上にいる全てのホストが同時に
受けとることができます。ブロードキャストアドレスはそのネットワークで利
用可能な最大の IP アドレスにすることが慣例になっています。例えば、上記
の例ではブロードキャストアドレスは 192.168.110.255
になってい
ます。何らかの理由からネットワークアドレスとブロードキャストアドレスを
同じにしているサイトがあるかもしれません。実用上はどちらにしておいても
大差はありませんが、ネットワーク上の全てのホストは同じブロードキャスト
アドレスを使わなければなりません。
IP プロトコルの開発の早期の段階で、管理上の理由から、いくつか の IP 番号のグループがネットワークを構成するようになり、またこれらの ネットワークがグループ分けされて、いわゆる「クラス」へと発展しました。 IP アドレスにおけるクラスはそのネットワークで 使用できるホストの数を決定します。ネットワークのクラスは以下のように分 けられています。
---------------------------------------------------------------
|ネットワーク | ネットマスク | ネットワークアドレス |
| のクラス | | |
---------------------------------------------------------------
| 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 |
|マルチキャスト| 240.0.0.0 | 224.0.0.0 - 239.255.255.255 |
---------------------------------------------------------------
どのような IP アドレスを使うかは何をしたいかに依存します。以下に示す ような作業を組みあわせて、必要なアドレスを決めてください。
既存のIPネットワークにLinuxマシンを接続したい場合、ネットワークの管理 者に相談して以下の情報を教えてもらってください:
これらの情報を使ってあなたのLinuxマシンのネットワークデバイスを設定し ます。正しい設定をしない限りネットワークは使えません。
インターネットへ接続する予定の無いプライベートなネットワークを構築する 場合、どのような IP アドレスを使っても構いません。しかしながら、このよ うなネットワークに使うべき IP アドレスは予め決められています。以 下に示すアドレスを使えば、インターネットとはパケットをやりとりできない ため、誤ってインターネットに接続してしまっても安全です。RFC1597では以 下のアドレスがプライベートネットワーク用に割り当てられています。
--------------------------------------------------------------
| プライベートネットワーク用に予約されたアドレス |
--------------------------------------------------------------
|ネットワーク| ネットマスク | ネットワークアドレス |
| のクラス | | |
--------------------------------------------------------------
| 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 にはいくつか
の種類がありますが、全体としては Miguel van Smoorenburg が開発した
System V 系のものに収束しました。
init プログラム自体は同じですが、システムの起動の仕方の設定はディ ストリビューションごとに異なります。
/etc/inittab
ファイルには、普通は以下のような行があります。
si::sysinit:/etc/init.d/boot
この行は実際の起動方法を管理するシェルスクリプトを指定しています。この
ファイルは MS-DOS の AUTOEXEC.BAT
と同等の機能を果します。
通常、他のいくつものスクリプトが boot スクリプトから呼び出されます。 ネットワークの設定も、このようなスクリプトのどれかで行われます。
以下の表にシステムごとの違いをまとめました。
---------------------------------------------------------------------------
ディストリ | インタフェースの設定/経路設定 | サーバの初期化
ビューション| |
---------------------------------------------------------------------------
Debian | /etc/init.d/network | /etc/rc2.d/*
---------------------------------------------------------------------------
Slackware | /etc/rc.d/rc.inet1 | /etc/rc.d/rc.inet2
---------------------------------------------------------------------------
RedHat | /etc/rc.d/init.d/network | /etc/rc.d/rc3.d/*
---------------------------------------------------------------------------
Debian と RedHat はシステムのサービスを起動するスクリプトを
ディレクトリ全体を使って管理しています(設定情報は普通、これらのファイルの中
にはありません。例えば RedHat は全てのシステム情報を
/etc/sysconfig
ディレクトリの下に置いており、起動スクリプトは
ここから情報を取得します)。起動プロセスを把握したければ、筆者のお勧め
は /etc/inittab と init に付属の文書を調べることです。
Linux Journal にもシステムの初期化に関する記事が載る予定です。
この記事が WWW で公開され次第、この文書からもリンクを張ります。
最近のディストリビューションには、一般的なネットワークインターフェイス を設定するためのプログラムは予め含まれています。次に示すような設 定用のプログラムがある場合、手動で設定する前に、これらを使って必要な設 定が可能かチェックしてみてください。
-----------------------------------------
ディストリ | ネットワーク設定プログラム
ビューション|
-----------------------------------------
RedHat | /usr/bin/netcfg
Slackware | /sbin/netconfig
-----------------------------------------
多くの Unix では /dev ディレクトリにネットワークデバイス用の スペシャルファイルがありますが、Linux の場合は違います。Linux では ネットワークデバイスはソフトウェアによって動的に作成されるので、 デバイスファイルは不要です。
ほとんどの場合、ネットワークデバイスは、デバイスドライバがハードウェア
を検出して初期化する際に自動的に作成されます。例えばイーサネットデバ
イスドライバは、 eth[0..n]
というインターフェイスを
イーサネットハードウェアに順に割り当てていきます。最初に検出された
イーサネッカードが eth0
、次が eth1
のようになります。
例外もいくつかあり (注目すべきは slip と ppp)、 これが使うネットワークデバイスはデバイスドライバではなくユーザプログラ ムが作成します。それぞれのデバイスに付けられる番号は、デバイスドライバ が割り当てるのと同様に順に振られていきますが、起動時にデバイスが自動的 に作成されるということはありません。なぜこのようになっているのかと言う と、イーサネットデバイスとは異なり、slip や ppp デバ イスは、マシンの稼働中に必要な数が変化するからです。詳細については後述 します。
ネットワークの設定に必要なプログラムと情報が揃ったら、ネットワークインター フェイスの設定を始めましょう。ネットワークインターフェイスの設定とは、 ネットワークデバイスに適切なアドレスを割り当てたり、その他ネットワーク デバイスを設定するための適切な値を指定することです。このためのプログラ ムがifconfig(interface configure)コマンドです。
ifconfig
は、通常以下のような書式で使います:
root# ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
この例では、``eth0
''イーサネットインターフェイスに
`192.168.0.1
' という IP アドレスと `255.255.255.0
'
というネットマスクを設定しています。コマンドの後ろにある `up'
はインターフェイスをアクティブにする指定ですが、これはデフォルトの動作
なので、普通は省略できます。インターフェイスを停止させるには、単に
``ifconfig eth0 down
'' を実行してください。
カーネルはインターフェイスを設定する際、あるデフォルト値を想定します。
例えば、あるインターフェイスに対してネットワークアドレスとブロードキャ
ストアドレスを設定できますが、上記の例のようにこれを設定しなかった場合
には、カーネルは指定したネットマスクに基づいて、適切な値を推測します。
ネットマスクを与えなかった場合には、IP アドレスが属するネットワークク
ラスに基づいて設定が行われます。上記の例では、このインターフェイスに
クラス C のネットワークアドレスが割り当てられたことをカーネルが認識し、
ネットワークアドレスとして `192.168.0.0
' を、
ブロードキャストアドレスとして `192.168.0.255
を自動的に割り
当てます。
ifconfigコマンドで指定できるオプションはいろいろあります。もっ とも重要なものを列挙すると、
このオプションはインターフェイスを利用可能(アクティブ)にします。
このオプションはインターフェイスを停止させます。
このオプションは、このインターフェイスで ARP(Address ResolutionProtocol) を使うかどうかを指定します。
このオプションは、全てのハードウェアマルチキャストパケットの受信を有効 にするか無効にするかを指定します。ハードウェアマルチキャストを使うと、 特殊な終点アドレスに向けられたパケットを複数のホストで受け取ることがで きます。デスクトップ用のビデオ会議アプリケーションを使っている場合には このオプションは重要ですが、普通は使われません。
このパラメータはデバイスの MTU(Maximum Transfer Unit)を設定し ます。
このパラメータはデバイスが接続しているネットワークのネットワークマスク を設定します。
このパラメータは特定の種類のハードウェアにしか使えませんが、デバイスの ハードウェアの IRQ を設定します。
このパラメータで、指定したブロードキャストアドレス宛のデータグラ ムを受け取るかどうかを設定できます。
このパラメータは、slip や ppp などの一対一接続の場合 の接続先アドレスを指定します。
このパラメータは特定の種類のネットワークデバイスのハードウェアアドレス を設定します。イーサネットの場合はそれほど役に立ちませんが、AX.25 のよ うなネットワークの場合には便利です。
ifconfig コマンドはあらゆるネットワークインターフェイスに 使用可能です。pppdや dip といったユーザレベルのプロ グラムには、必要なデバイスを作成すると自動的にそれらを設定するものがあります。 この場合 ifconfig を手動で使う必要はありません。
リゾルバ(Name Resolver) は Linux の標準ライブラリの一部で
す。リゾルバの主な機能は、人間にとって分かりやすい
ftp.funet.fi
のようなホスト名を 128.214.248.6
のよう
な IP アドレスに変換することです。
すでにインターネットのホスト名については御存知だと思いますが、それらが どういう意味で、どのように構成されているかについては御存知ないかもしれ ません。インターネットのドメイン名は階層構造、すなわち木のような構造に なっています。ドメイン とは、一つのまとまり、すなわち複数の ホスト名を一つのグループにまとめたものです。ドメイン はサ ブドメイン に分割されているかもしれません。 トップレベルドメイン とはサブドメインではないドメインです。 トップレベルドメインについては RFC-920 で規定されています。非常に有名 なトップレベルドメインを以下に示します:
営利組織
教育機関
政府機関
軍事機関
その他の組織
インターネット関連の組織
特定の国を示す 2 文字のコード
歴史的経緯から、国を表さないトップレベルドメインに属するほとんどの
ドメインはアメリカ合衆国にある組織が使っています。ただし、
アメリカ合衆国も独自の国コードである `.us
' を持っています。現在で
は、この話は .com
や .org
には当てはまりません。アメリカ国外
の会社もこれらのドメインを使っています。
これらのトップレベルドメインそれぞれにはサブドメインがあります。国
を示す 2 文字のコードがトップレベルドメインになっている場合、
サブドメインとしてcom
や edu
, gov
, mil
, org
といった組織の種別を示すドメインが来ます。例えば com.au
と
gov.au
はオーストラリアの営利組織と政府機関です。これは一般的
な決まりではない点に注意してください。というのも、実際の方針は
それぞれのドメインのドメイン名管理機関によって異なるからです。
次のレベルはたいていその組織や団体の名称になります。それより細かい レベルのドメインはそれぞれの組織によって異なりますが、よくあるのは部門 別にサブドメインを設定する方法です。しかし、このレベル以下はどのような サブドメインを作ることも可能なので、それぞれの組織ごとに、ネットワーク の管理者がふさわしい分け方を設定しています。
もっとも左に位置する名前が、たいていの場合、そのマシンに付けられた 独自の名前で、ホスト名と呼ばれます。ホスト名よりも右側の部分 をドメイン名と呼び、両者を合せた完全な名前を「完全に記述 された名前(Fully Qualified Domain Name(FQDN))」と呼びます。
Terry のホストを例にしましょう。完全に記述された名前は
`perf.no.itg.telstra.com.au
' です。この場合、ホスト名は
`perf
' でドメイン名は no.itg.telstra.com.au
です。
ドメイン名のうち、トップドメイン名は彼の国であるオーストラリアを示し、
彼のメールアドレスは営利組織なので次のレベルのドメインは .com
です。会社の名前は `telestra
' で、それ以下のサブドメイン名の
構造は組織の構造を反映したものになっています。ここに示した例では、彼の
マシンはネットワーク管理部門(no
, Network Operations)の
情報技術グループ(itg
, Information Technology Group)に属してい
ます。
普通、名前はずっと短くなっています。例えば、筆者の ISP は
``systemy.it
'' ですし、筆者が所属する非営利の組織は ``linux.it
''
です。どちらにも com
や org
といったサブドメインはないので、
筆者のホストは単に ``morgana.systemy.it
'' であり、
rubini@linux.it
が有効なメールアドレスです。ドメインの所有者には
ホスト名やサブドメインを登録する権利がある点に注意してください。
例えば、筆者が属する LUG は pluto.linux.it
というドメインを使って
います。なぜなら、linux.it
の所有者が LUG のためにサブドメインを
開放してくれたからです。
まず、あなたのホストがどういうドメインに属しているかを知る必要がありま す。リゾルバは名前の変換サービスを `ドメインネームサーバ(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 アドレスです。
ローカルでネームサーバを実行したければ、これを行うのは簡単です。 DNS-HOWTO と、 お使いのバージョンの BIND (Berkeley Internet Name Domain)に含まれ ている文書を読んでください。
[訳注: DNS-HOWTO の日本語訳は DNS-HOWTO にあります]
ループバックインターフェイスとは、自分自身に接続するために用意された特
別な種類のインターフェイスです。このようなインターフェイスを用意してい
るのにはいくつかの理由があります。例えば、実際のネットワークに接続せず
にネットワーク用のソフトウェアをテストするなどの目的に使えます。慣例と
して、ループバックインターフェイスには `127.0.0.1
' というアドレス
が使われます。ですから、どんなマシンを使っていようとも telnet で
127.0.0.1
に接続すれば、自分自身に接続することになります。
ループバックインターフェイスの設定は簡単で、次のようにするだけです(た だし、普通はこの作業は標準の初期化スクリプトが実行することに注意してく ださい)。
root# ifconfig lo 127.0.0.1
root# route add -host 127.0.0.1 lo
route コマンドについては次節で説明します。
経路制御は大きな話題であり、それだけで分厚い本を書くことができます。 一部の人を別にすれば、ほとんどの人はごく単純な経路制御しか必要ないと思 いますので、以下ではごく基本的な話題についてのみ扱うことにします。より 詳細な情報が必要ならば、この文書の最初に示した各種の文献に当たってくだ さい。
まず定義から始めましょう。IP 経路制御とは何でしょう? 私が使ってい る定義を以下に示します:
IP 経路制御とは、複数のネットワークに接続しているホストが受けとった IP データグラムをどのネットワークに送るかを決めることです。
例を使って示した方がいいでしょう。よくあるオフィス用のルータを想像して ください。このルータはインターネットへの PPP 接続や、ワークステーション の繋がっている多数のイーサネットセグメントや、別のオフィスへの PPP 接続などを備えていること でしょう。このルータがデータグラムを受けとった際、そのデータグラ ムを次にどのポートへ送り出すかを決めるのが IP 経路制御です。ルータでは ない普通のホストにも経路制御が必要です。なぜなら、ネットワークに接続し ている全てのホストは上述した自分自身を指すループバックインターフェイス とネットワーク上にある他のマシンと接続するためのインターフェイス(それ はイーサネットだったり、シリアルポートを使った PPP や SLIP だったりしま す)の 2 つのインターフェイスを持っているため、どちらのインターフェイス にパケットを送り出すか決める必要があるからです。
さて、実際の経路制御はどのように行なわれるのでしょう? それぞれのホスト
は経路情報を登録した経路表(ルーティングテーブル)と呼ばれるリストを持っ
ています。この表の各行には通常 3 つの欄があります。最初の欄は目的地と
なるアドレス、2 つめはデータグラムが送られるべきインターフェイス名、3
つめは必須ではありませんが、お隣のネットワークへデータグラムを転送するホスト
の IP アドレスです。最後の欄はゲートウェイフィールドと言います。Linux で
は /proc/net/route
に経路表が登録されているため、以下のコマン
ドで経路表を見ることができます:
user% cat /proc/net/route
あるいは以下のコマンドも使えます:
user% /sbin/route -n
user% netstat -r
経路制御の方法自体はごく簡単です。データグラムを受けとれば、その目的地 アドレス(誰宛に送られたのか)をチェックして、経路表の各行と比較します。 そのアドレスにもっともよく一致する行が選択され、データグラムはその行が 指定するインターフェイスへ送られます。 その行にゲートウェイフィールドが登録されていれば、データグラムは指定さ れたインターフェイスを経由してそのホストに送られます。ゲートウェイフィー ルドが無い場合、目的地アドレスはその行が指定したインターフェイスが接続 しているネットワーク上にあるものとみなされます。
この経路表を操作するには `route' という専用のコマンドを使いま す。このコマンドは引数をカーネルのシステムコールに変換して、カーネルの 経路表に追加したり、削除したり、変更したりします。
簡単な例を示します。イーサネットのネットワークを使っていると想像してく
ださい。ネットワークはクラス C で、ネットワークアドレスは
192.168.1.0
です。あなたのマシンの IP アドレスは
192.168.1.10
、インターネットに接続しているルータのアドレス
は 192.168.1.1
になっています。
インターフェイスを設定するための最初のステップは、上述した通り
`ifconfig
' です。
root# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
次に、経路表にエントリを登録して、「目的地アドレスとして
192.168.1.*
に一致するデータグラム
が届いたら、イーサネットデバイスに送る」ということをカーネルに教える必
要があります。そのためには以下のコマンドを使います。
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
`-net
' という引数に注意してください。この指定で
route
プログラムはこのアドレスがネットワークであると認識しま
す。ここで -host
を指定すると、一つの IP アドレスのみを指定し
た経路になります。
この経路を登録することで、あなたのいるイーサネットセグメント上にいる全 てのホストと IP 接続できます。しかし、同じセグメント上にいないホストの 場合はどうするのでしょう?
起りうる全てのネットワークへの経路を登録することは不可能ですので、特別 の仕組みが用意されています。この仕組みを「既定の経路(デフォルトルート)」 と呼びます。「既定の経路」は全ての目的地アドレスにマッチしますが、優先 順位が低く、他にマッチする行があった場合、そちらの方が優先されることに なります。「既定の経路」の考え方は単純で、「その他全てをここに送る」と いうことです。今考えているネットワークでは以下のように「既定の経路」を 設定します:
root# route add default gw 192.168.1.1 eth0
`gw
' の指定により、 route
コマンドはその次の引数が
ゲートウェイまたはルータの IP アドレスまたはホスト名であると認識します。
このエントリに一
致する全てのデータグラムはこのアドレスに送られ、以降の経路制御はこのゲー
トウェイかルータが考えることになります。
以上をまとめると次のようになります:
root# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# route add default gw 192.168.1.1 eth0
ネットワークを設定している `rc
' ファイルを詳細に調べると少な
くともその一つにこれとよく似た設定が見つかるはずです。これはごく一般的
な設定です。
次に多少複雑な経路の設定を見てみましょう。先に考えたルータを設定してい ると想像してください。このルータは PPP でインターネットに接続し、複数 の LAN セグメントが接続されています。具体的には 3 つのイーサネットセグメ ントと 1 つの PPP 接続があると考えましょう。その場合、経路設定は以下の ようになるでしょう。
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# route add -net 192.168.2.0 netmask 255.255.255.0 eth1
root# route add -net 192.168.3.0 netmask 255.255.255.0 eth2
root# route add default ppp0
このルータのつながったネットワークを使っているそれぞれのワークステー
ションは、先に述べた、より簡単な形式の設定になり、ルータのみがネットワーク
への経路を別々に登録することになります。それぞれのワークステーションの場
合、「既定の経路」を使ってルータにデータグラムを送りますが、ルータの場
合はそれらを適切な経路に送り出す必要があります。
上記のルータの設定でデフォルトの経路の設定に`gw
' が無いのを不
思議に思うかもしれませんが、その理由は簡単で、PPP や SLIP といったシリ
アル経由の接続は一対一の接続になっているからです。接続先が一台のマシン
になっているため、他に選択の余地が無く、そのマシンをゲートウェイとして
設定する意味は無いわけです。イーサネットや 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)が設定された一つ のイーサネットのセグメントが接続されています。また、PPP を使って他のルー タに接続され、ネットワークは三角形になっています。
ルータ A の経路表が以下のようになるのは明らかなはずです:
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# route add -net 192.168.2.0 netmask 255.255.255.0 ppp0
root# route add -net 192.168.3.0 netmask 255.255.255.0 ppp1
この設定はルータ A と B の間の接続が切れない限り正しく動きます。A と B の間の接続が切れると、A に接続されたイーサネット上のホストから B に接続 されたイーサネット上のホストへは接続できなくなります。なぜなら、ルータ A から B への経路は A の ppp0 を使うことになっており、この接続が切れてい るためです。一方、A と C の間の接続は生きているので、A のイーサネット上 のホストから C のイーサネット上のホストへは通信できます。一方、B と C の 間の接続は生きているので C のイーサネット上のホストから B のイーサネット上 のホストへも通信できます。
さて、ここで A は C と通信でき、C は B に通信できるとしたら、A から B へのデータグラムは C を経由して B に送ることが可能なはずです。このよう な問題を解決するために RIP のような動的経路制御プロトコルが開発されま した。A、B、C それぞれのルータで経路制御デーモンが動いていれば、どれか 一つの接続が切れても、そのネットワークの状態を反映するように自動的に経 路表が調整されます。経路制御デーモンの設定は簡単で、それぞれのルータで 2 つのことをするだけです。ルータ A の場合、
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# /usr/sbin/routed
経路制御デーモン routed は起動時に使用可能なネットワーク ポート全てを自動的に探して、そのホストの経路表を更新できるようにそれぞ れのネットワークデバイスへメッセージを送ると同時に、他のホストから送ら れてくるメッセージを受けとります。
以上はごく簡単な動的経路制御の説明ですが、充分使えるはずです。より詳細 な説明が必要ならばこの文書の最初に挙げた参考文献を参照してください。
動的経路制御についての重要なポイントは以下の通りです:
ネットワーク経由の各種サービスとそのためのサーバを起動すれば、遠隔地に いるユーザが、ネットワーク経由であなたの Linux マシンを使うことができ ます。サーバプログラムはネットワークポートを監視します。ネットワークポート は特定のホストの特定のサービスを示す手段であり、telnet によるアクセス と ftp によるアクセスをサーバが区別する方法です。遠隔地のユーザが サーバマシンとの接続を確立すると、そのポートを監視しているサーバプログラム (ネットワークデーモンプログラム)は接続を受け付けて動作します。 ネットワークデーモンの動作方法には 2 つの種類があり、どちらの方法も実 際に用いられています。これらを以下に示します:
ネットワークサービス用のプログラムは予め起動されて受け持ちの ポートを監視しており、接続があれば自分で必要なサービスを提供します。
ined サーバはネットワーク接続を受けつけるための特別のデーモン プログラムです。このプログラムは接続を受け付けたとき、必要とされる プログラムを設定ファイルに従って起動します。どのサービスポートも tcp プロトコルと udp プロトコルのどちらを使うようにも設定できます。 ポートは別のファイルに記述されますが、これについては後述します。
設定すべき重要なファイルは 2 つあります。ポート番号をサービス名に
対応づける /etc/services
と、inetd デーモンの
設定ファイルである /etc/inetd.conf
ファイルです。
/etc/services
/etc/services
ファイルは、人間にとって分かりやすいサービス
名と計算機が扱いやすいポート番号を対応させる単純なデータベースです。
このファイルの書式はごく単純で、普通のテキストファイルの各行に
データベースのエントリが記述されています。それぞれのエントリは任意の数
の空白文字(タブかスペース)で分離された 3 つのフィールドから構成されま
す。また、#から後はコメントとして無視されます。フィールドの構成は
以下のようになっています:
name port/protocol aliases # comment
は一語で書かれ、記述するサービスを示します。
このフィールドはさらに 2 つの部分に分かれます。
この行が示すサービスを提供するためのポート番号で
す。よく使われるサービスには予めポート番号が割り当てられてい
ます。詳しくは RFC-1340
をご覧ください。
このフィールドには tcp
または udp
を指定します。
注意しておかなければならないことは、18/tcp
と 18/udp
は全く異なる意味を持つということです。1つのサービスが同じポートの tcp
と udp を使わなければならない技術的な理由はありません。普通はこの常識
通りに指定が行われ、/etc/services
に両方のエントリが現れるの
は特定のサービスが tcp
でも udp
でも使える場合だけで
す。
はこのサービスの参照に使える別名を設定します。
ある行の `#
以降に書かれた部分はコメントとして無視されます。
最近の Linux の各種ディストリビューションでは /etc/services
ファイルが予め用意されています。もし 0 からシステムを組みあげなけれ
ばならない場合のために、古い
Debian
ディストリビューションからコピーした /etc/services
の例を以下
に紹介します:
# /etc/services:
# $Id: NET3-4-HOWTO.sgml,v 1.14 2000/12/18 02:12:43 morimoto Exp $
#
# Network services, Internet style
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1340, ``Assigned Numbers'' (July 1992). Not all ports
# are included, only the more common ones.
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
#
# From ``Assigned Numbers'':
#
#> The Registered Ports are not controlled by the IANA and on most systems
#> can be used by ordinary user processes or programs executed by ordinary
#> users.
#
#> Ports are used in the TCP [45,106] to name the ends of logical
#> connections which carry long term conversations. For the purpose of
#> providing services to unknown callers, a service contact port is
#> defined. This list specifies the port used by the server process as its
#> contact port. While the IANA can not control uses of these ports it
#> does register or list uses of these ports as a convenience to the
#> community.
#
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 (Project Athena/MIT) services
# Note that these are for Kerberos v4 and are unofficial. Sites running
# v4 should uncomment these and comment out the v5 entries above.
#
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
#
# Unofficial but necessary (for NetBSD) services
#
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/services
ファ
イルは大きくなっていきます。自分が使っている /etc/services
が
不完全かもしれないと不安であれば、新しいディストリビューションから
/etc/services
をコピーしてくるとよいでしょう。
/etc/inetd.conf
/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
を使うことがあります。
このフィールドには 2 種類しか設定がありません。
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
/etc/protocols
ファイルは、 TCP/IP パケットに埋めこまれている各
種プロトコルの識別番号とプロトコルを結びつけるデータベースです。
このファイルを使えば、プログラムから特定のプロトコルを識別番号では
なく名前で参照できるようになり、tcpdump のようなプ
ログラムも、番号ではなくプロトコル名で出力するようになります。この
ファイルの一般的な書式は以下の通りです:
protocolname number aliases
Debian ディストリビューション
に付属の /etc/protocols
ファイルは以下の通りです:
# /etc/protocols:
# $Id: NET3-4-HOWTO.sgml,v 1.14 2000/12/18 02:12:43 morimoto 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
コマンドの出力はアドレスではなく名前になります。
まず最初に注意しておきますが、悪意を持った攻撃からマシンとネットワーク のセキュリティを守るのは複雑な技術が必要になります。私自身この分野につ いてはとてもエキスパートとは言えません。そのため、以下に有益であろう手 段を紹介しますが、もしセキュリティについて真剣に考えるならば自分自身で 調べてみることをお勧めします。 Security-HOWTO を含めて、 インターネット上にはこの問題についての情報が豊富にあります。
重要な経験則は
「使うつもりのないサーバは起動しない」
ことです。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
#
# Allow mail to anyone
in.smtpd: ALL
# All telnet and ftp to only hosts within my domain and my host at home.
telnetd, ftpd: LOCAL, myhost.athome.org.au
# Allow finger to anyone but keep a record of who they are.
fingerd: ALL: (finger @%h | mail -s "finger from %h" root)
/etc/hosts.deny
も /usr/sbin/tcpd プログラムの設定ファ
イルであり、どのホストからの接続を拒否するかを設定します。
以下に簡単な例を示します:
# /etc/hosts.deny
#
# Disallow all hosts with suspect hostnames
ALL: PARANOID
#
# Disallow all hosts.
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
は動かさないことにしました。
これについても慎重になる べきです。これらのサービスはさまざまな方法で悪用可能です。NFS のような サービスの代わりを見つけるのは困難ですが、これらを設定する際には誰にマウ ント許可を与えるかに充分注意する必要があります。