  NFS HOWTO
  Nicolai Langfeldt janl@math.uio.no
  v0.7, 3 November 1997
  中野武雄 nakano@apm.seikei.ac.jp
  v0.7j2, 25 November 1997

  この文書は NFS クライアントとサーバの設定方法を記述したものです。
  ______________________________________________________________________

  Table of Contents

  1. 前書き
     1.1 法的なこと
     1.2 その他
     1.3 献辞

  2. README.first
  3. NFS サーバの設定
     3.1 設定の前に
     3.2 はじめのいっぽ
     3.3 ポートマッパ（portmapper）
     3.4 mountd と nfsd

  4. NFS クライアントの設定
     4.1 Mount options
     4.2 NFS を最適化する

  5. 遅いラインを通しての NFS
  6. セキュリティと NFS
     6.1 クライアント側のセキュリティ
     6.2 サーバ側のセキュリティ: nfsd
     6.3 サーバ側のセキュリティ: ポートマッパ
     6.4 NFS とファイアウォール
     6.5 まとめ

  7. マウントのチェックリスト
  8. FAQ
  9. ファイルシステムの export
     9.1 IRIX, HP-UX, Digital-UNIX, Ultrix, SunOS 4 (Solaris 1), AIX
     9.2 Solaris 2

  10. PC-NFS

  ______________________________________________________________________

  1.  前書き

  1.1.  法的なこと

  (C)opyright 1997 Nicolai Langfeldt.  Do not modify without amending
  copyright, distribute freely but retain this paragraph.  The FAQ
  section is based on a NFS FAQ compiled by Alan Cox.  The Checklist
  section is based on a mount problem checklist compiled by the IBM
  Corporation.

  この文書の著作権は (C)opyright 1997 Nicolai Langfeldt にあります。この
  文書を修正する場合は著作権表示にもその旨明記して下さい。著作宣言を変更
  しなければ自由に再配布することができます。 FAQ セクションは Alan Cox
  によって編まれた NFS FAQ を基にしています。チェックリストの節は IBM
  Corporation によって編まれた mount problem checklist を基にしていま
  す。

  訳注：翻訳は中野武雄が行いました。 (C)opyright 1997 Takeo Nakano

  1.2.  その他

  この文書はまだ完成したものではありません。この文書をより良い物にするた
  めに、問題点や成功例などについて筆者にメールを送って下さい。現金、コメ
  ント、質問などは janl@math.uio.no まで。メールを送り、返信を希望する場
  合には、返信先のアドレスが正しく機能していることを確認して下さるように
  お願いします。

  この HOWTO 文書を翻訳する場合も私に知らせて下さい。どの言語に私の名前
  が載ったかを知りたいので :-)

  この文書を書くことを私に勧め、また多くの有益な助言をくれた Olaf Kirch
  に感謝（とグチを少々 :-)。

  この HOWTO ではカーネルバージョン 2.0 における NFS を扱っています。
  2.1 版のカーネルでは、NFS に関して重要な拡張と変更が行われています。

  訳注：翻訳に関するコメントは中野武雄 nakano@apm.seikei.ac.jp までお願
  いします。本文書の翻訳に当たっては、嶋崎さん、なかごめさん、岡本さんは
  じめ JF メーリングリストの皆さんに有益なご指摘をいただきました。

  1.3.  献辞

  この HOWTO 文書は Anne Line Norheim Langfeldt に捧げる。といっても彼女
  がこの文書を読むことは無いだろうけど。そういった類の女の子じゃないから
  なあ。

  訳注：結婚したんですね :-)

  2.  README.first

  NFS (Network File System) には三つの重要な特性があります。

  o  NFS を用いるとネットワークで接続されたホスト間でファイルを共有でき
     るようになります。

  o  たいていの場合はうまく動きます。

  o  NFS はシステムにセキュリティ上の問題をたくさん持ち込みます。これら
     の問題はみなクラッカーに良く知られているので、あなたのファイルに対
     するアクセス権（read、write そして delete）が侵される可能性がありま
     す。

  この文書ではこれらの点それぞれについて述べるつもりです。この文書のセ
  キュリティに関する節は必ず読むようにして下さい。間抜けなセキュリティホ
  ールを残しておきたくはないでしょう？セキュリティに関する部分は技術的に
  高度な内容を含むことがあるので、 IP ネットワーキングや関連用語に対する
  ある程度の知識を必要とします。もしわからない言葉が出てきたら、他のネッ
  トワーク関連の HOWTO 文書を読むか、ネットワーク管理に関する書籍を読ん
  で、 TCP/IP の用語に慣れるようにして下さい。これらはいずれにせよ UNIX
  や Linux マシンの管理をするには必要なことですから。この分野に関する非
  常に良い本を紹介しておきましょう。 Craig Hunt による TCP/IP Network
  Administration で、出版社は O'Reilly & Associates, Inc. です。この本を
  読んで内容を理解すれば、以降職探しに苦労することはなくなるでしょう
  :-)。

  訳注：この本は日本語版がオーム社からでています。邦題は「TCP/IP ネット
  ワーク管理」です。
  NFS のトラブルシュートの役に立つセクションを 2 つ設けました。 ``マウン
  トのチェックリスト'' と ``FAQ'' です。もし何かうまく動かない場合には、
  これらの節を参照して下さい。

  3.  NFS サーバの設定

  3.1.  設定の前に

  この HOWTO を読み進める前に、まずサーバ及びクライアントとして使うマシ
  ンの間で、それぞれ互いに telnet 通信ができるように設定しておく必要があ
  ります。もしこの設定がなされていない場合は、 NET-3 HOWTO などを読んで
  必要なネットワーク設定を行って下さい。

  3.2.  はじめのいっぽ

  何はともあれ NFS サーバのセットアップがまず必要です。もし読者であるあ
  なたが大学のネットワークに参加している場合には、おそらく何台もの NFS
  サーバが既に存在していることでしょう。これらのサーバに対するアクセス権
  があり、この HOWTO をその設定のために読んでいる場合には、この章を読む
  必要はありません。 ``NFS クライアントの設定'' に進んで下さい。

  また Linux 以外のマシンを NFS サーバにしたい場合は、システムのマニュア
  ルを探して、サーバ機能の立ち上げ方法と、ファイルシステムを NFS によっ
  て export する方法とを理解する必要があります。この HOWTO にも、他のい
  ろいろなシステムでサーバを立ち上げる方法について説明した節を設けてあり
  ます。サーバとしての設定をすべて行うことができたら、この HOWTO の次の
  章に進んで下さい。あるいはこの章を読み進んでみても良いかもしれません。
  この章で述べている内容には、サーバにするマシンの種類によらず役に立つこ
  とも一部含まれていますから。

  さて、ここまで読み進んできたあなたは、以下のようなたくさんのプログラム
  の設定をすることになります。

  3.3.  ポートマッパ（portmapper）

  ポートマッパは Linux では portmap か rpc.portmap というファイル名に
  なっています。私のシステムの man ページによると、これは「DARPA ポート
  を RPC プログラム番号にマップするプログラム」となっています。さて、こ
  のプログラムが本 HOWTO 文書における最初のセキュリティ・ホールの候補と
  なります。この穴を塞ぐ方法については ``NFS のセキュリティ'' に書いてあ
  ります。しつこいようですが、必ず読んでおくようにして下さい。

  ではポートマッパを起動しましょう。おそらく /usr/sbin ディレクトリに
  portmap か rpc.portmap という名前で存在しているはずです（一部のシステ
  ムでは rpcbind となっていることもあります）。とりあえず今は手動で起動
  すれば良いですが、このプログラムはシステムをブートするたびに実行させる
  ものですから、 rc スクリプトに記述しておくとよいでしょう。 rc スクリプ
  トに関しては init の man ページに詳しい記述があるでしょう。おそらく
  /etc/rc.d か /etc/init.d、 /etc/rc.d/init.d あたりのディレクトリにある
  はずです。 inet のようなファイル名のものが、おそらく編集対象となるスク
  リプトです。しかし、どのように編集すればよいかというのはこの HOWTO の
  範囲を越えていますので触れません。さて、ポートマップを起動し、実行され
  ているかを ps aux で確認しましょう。動いてましたか？よろしい。

  3.4.  mountd と nfsd

  次に必要になるプログラムは mountd と nfsd です。しかしこれらを起動する
  前に、まず別のファイルを編集しなければなりません。 /etc/exports です。
  例えば eris というマシンにある /mn/eris/local というディレクトリ以下を
  apollon というマシンから利用できるようにしたい場合を考えましょう。この
  場合は eris の /etc/export に以下のような行を挿入します。
  ______________________________________________________________________
  /mn/eris/local  apollon(rw)
  ______________________________________________________________________

  ここでは appllon に /mn/eris/local への読み書きの許可を与えています。
  rw の代わりに ro とすることもでき、この場合は読み出しだけの許可になり
  ます（何も書かなければ読み出しだけの許可が与えられます）。他にもいくつ
  かオプションが ありますが、そのうちセキュリティに関連したものについて
  は後で触れるつもりです。これらオプションのすべては exports の man ペー
  ジに記述があります。少なくとも一生に一度は目を通しておくべきでしょう。
  また exports には全てのホストを一つ一つ書く必要はなく、もう少し便利な
  方法があります。例えば NIS や NYS （YP という方が馴染みがあるかもしれ
  ません）を使っている場合は、ネットグループによる指定が可能です。 NIS
  を使っていなくても、マウント許可を与えるホストの指定にドメインのワイル
  ドカードや IP のサブネットを用いることができます。ただしこのように一律
  な許可属性を与えるときは、許可したくないユーザにまでアクセス許可を与え
  ていないかどうか注意する必要があります。

  注意: この exports ファイルの書式は他の Unix で使われるものとは異なっ
  ています。他の Unix における exports ファイルに関しては、この HOWTO に
  も別の節を設けてあります。

  では mountd （rpc.mountd というファイル名かもしれません）と nfsd （こ
  ちらも rpc.nfsd かも）を起動することにしましょう。これらのプログラムは
  いずれも exports ファイルを参照します。

  /etc/exports を編集したら、 mountd と nfsd にファイルが変更されたこと
  を知らせる必要があります。伝統的な方法は exportfs を実行することでした
  が、たいていの Linux 配布パッケージには exportfs プログラムは入ってい
  ません。このような場合は以下のスクリプトをお使いのホストに準備すると良
  いでしょう。

  ______________________________________________________________________
  #!/bin/sh
  killall -HUP /usr/sbin/rpc.mountd
  killall -HUP /usr/sbin/rpc.nfsd
  echo re-exported file systems
  ______________________________________________________________________

  このファイルを例えば /usr/sbin/exportfs という名前で保存し、忘れずに
  chmod a+rx します。以降は exports ファイルを編集するたびに root になっ
  てこの exportfs コマンドを実行して下さい。

  では mountd と nfsd がちゃんと実行されているかを確認しましょう。まず
  rpcinfo -p を実行して下さい。以下のような表示が出ると思います。

  ______________________________________________________________________
     program vers proto   port
      100000    2   tcp    111  portmapper
      100000    2   udp    111  portmapper
      100005    1   udp    745  mountd
      100005    1   tcp    747  mountd
      100003    2   udp   2049  nfs
      100003    2   tcp   2049  nfs
  ______________________________________________________________________

  このようにポートマッパによって portmapper 自身と mountd、 nfsd がアナ
  ウンスされます。

  rpcinfo: can't contact portmapper: RPC: Remote system error -
  Connection refused というような表示が出た場合には、ポートマッパが実行
  されていません。修正して下さい。No remote programs registered. という
  表示が出た場合はポートマッパに問い合わせる許可が無いか、何かがおかしく
  なっています。 nfsd、 mountd とポートマッパを kill して、もう一度最初
  から実行しなおしてみて下さい。

  ポートマッパのサービスに関する表示を確認したら、 ps によっても確認して
  みて下さい。ポートマッパはサービスプログラムが終了した後でもサービスポ
  ートを報告してしまうので、何かおかしくなったら ps でチェックしてみる方
  が賢い場合もあります。

  ブートの度に mountd と nfsd を起動したい場合には、もちろんポートマッパ
  の場合と同じようにシステムの rc スクリプトを修正する必要があります。お
  そらくほとんどの場合には、あなたのマシンに既にスクリプトが存在している
  と思います。この場合は必要な部分をコメントアウトして、必要なデーモンが
  適切な実行レベルで起動されるようにするだけです。

  読んでおくべき man ページは portmap、 mountd、 nfsd、及び exports で
  す。

  さて、ここまで私の言ってきたことがすべて実行されたら、 NFS クライアン
  トを起動するための準備が整ったことになります。

  4.  NFS クライアントの設定

  まずカーネルに NFS ファイルシステムの機能を持たせる必要があります。直
  に組み込むか、モジュールとして利用できるようにするかしておいて下さい。
  これらはカーネルをコンパイルする前に指定します。まだ一度もカーネルのコ
  ンパイルをしたことのない人は kernel HOWTO などを読んでがんばって下さ
  い。また良くできた配布パッケージ（Red Hat など）を使っていて、これまで
  カーネルやモジュールをいじっていない（つまり台無しにしていない :-) の
  なら、おそらく NFS はすでに利用できるようになっているでしょう。

  続いて root のプロンプトで適切な mount コマンドを実行すればファイルシ
  ステムを利用できるようになります。前の章からの例を続けることにして、
  eris の /mn/eris/local をマウントする場合を考えます。この場合は以下の
  ようなコマンドになります。

  ______________________________________________________________________
  mount -o rsize=1024,wsize=1024 eris:/mn/eris/local /mnt
  ______________________________________________________________________

  rsize と wsize オプションについては後で説明します。この時点で /mnt 以
  下でファイルシステムが利用できるようになっているはずです。 cd や ls し
  たり、それぞれのファイルを見ることもできます。このファイルシステムはロ
  ーカルなものよりは遅いかもしれませんが、でも ftp よりはずっと便利で
  しょう？

  もしマウントがうまく行かなくて、 mount: eris:/mn/eris/local failed,
  reason give by server: Permission denied というようなエラーメッセージ
  が出る場合には、サーバの exports ファイルが間違っていないか、修正後に
  exportfs の実行を行ったかを確認して下さい。また mount clntudp_create:
  RPC: Program not registered というエラーだった場合は、サーバで mountd
  か nfsd が実行されていないのが原因です。

  ファイルシステムを切り離すには以下のようにします。

  ______________________________________________________________________
  umount /mnt
  ______________________________________________________________________

  システムの起動時に NFS ファイルシステムをマウントさせるためには、
  /etc/fstab ファイルを通常のように編集します。我々の例に従えば、以下の
  ような行が必要になります。

  ______________________________________________________________________
  # device      mountpoint     fs-type     options              dump fsckorder
  …
  eris:/mn/eris/local  /mnt    nfs        rsize=1024,wsize=1024 0    0
  …
  ______________________________________________________________________

  これでほとんど終わりですが、この先も読んで下さいね。

  4.1.  Mount options

  他にも一緒につけておくと良さそうなオプションがあります。 NFS サーバが
  クラッシュしたときやネットワークが切断されたときにクライアントでどうす
  るかを指定するものです。この状態を優雅に扱うことができるのが NFS の良
  いところの一つです。サーバの障害に当たっては二つのモードがあります。

     soft
        NFS クライアントは NFS マウントされたファイルシステムにアクセス
        しているプロセスにエラーを通知します。このエラーを正しく扱えるプ
        ログラムはほとんどありませんので、この設定はお勧めできません。

     hard
        NFS マウントされたファイルシステム上のファイルにアクセスしている
        プログラムはサーバがクラッシュすると宙ぶらりんになります。これら
        のプロセスは intr を一緒に指定していない場合は中断することも
        kill することもできなくなります。 NFS サーバが復活すると、プログ
        ラムはそれぞれ何もなかったかのように再開します。おそらくこちらが
        望ましい場合が多いでしょう。私は全ての NFS マウントに hard,intr
        を用いることをお勧めします。

  以前の例をまた用いることにします。 fstab のエントリは以下のようになり
  ます。

  ______________________________________________________________________
  # device      mountpoint     fs-type    options                  dump fsckorder
  …
  eris:/mn/eris/local  /mnt    nfs        rsize=1024,wsize=1024,hard,intr 0 0
  …
  ______________________________________________________________________

  4.2.  NFS を最適化する

  rsize や wsize といったオプションがない場合、通常 NFS は 4096 か 8192
  バイトを単位に読み書きを行います。しかし Linux のカーネルとネットワー
  クカードの組み合わせによっては、この設定では動かなかったり、あるいは遅
  くなってしまったりする場合があります。ですからここでは実験を行って、最
  速になるような rsize や wsize を決定するやり方を述べることにします。転
  送速度は簡単なコマンドの組み合わせで調べることができます。先ほど示した
  mount コマンドで書き込み可能にしたディスクに、以下のようなコマンドを用
  いることでシーケンシャルな書き込みの性能をテストすることができます。

  ______________________________________________________________________
  time dd if=/dev/zero of=/mnt/testfile bs=16k count=4096
  ______________________________________________________________________

  このコマンドによって中味がすべて 0 のバイト列で埋め尽くされた 64Mb の
  ファイルができます（おそらくこれだけのサイズがあれば、パフォーマンスに
  対するキャッシュの影響を小さくできるでしょう。もしたくさんメモリを積ん
  でいる場合にはもっとファイルを大きくして下さい）。何度か（5〜10 回くら
  い）行って平均時間を求めて下さい。この場合最も大事なのは `elapsed' あ
  るいは `wall clock' で表示される時間です。次にこのファイルを再読み込み
  することで、読み込み性能のテストを行います。

  ______________________________________________________________________
  time dd if=/mnt/testfile of=/dev/null bs=16k
  ______________________________________________________________________

  こちらも数回行って平均しましょう。その後 umount し、 rsize と wsize
  に大きな値を入れて再び mount して下さい。値は 1024 の倍数になるように
  し、 16384 バイトは越えないようにしましょう（これは NFS バージョン 2
  の制限です）。 mount したらそのファイルシステムに cd で入り、ファイル
  システムの中味が正しく見えるかをしばらく調べてみて下さい。 rsize や
  wsize が大きく過ぎると、妙な兆候が現われ、ファイルの信頼性が 100% でな
  くなります。よくある例としては、「エラーメッセージは出ないのに "ls" の
  結果が不完全になる」「エラーメッセージは出ないのにファイルの読み込みが
  失敗する」などがあります。さて、与えた rsize と wsize でシステムが正し
  く動作していることがわかったら、もう一度速度のテストをしてみましょう。
  サーバの OS が違うと最適なサイズも異なる場合が多いです。 SunOS や
  Solaris の場合は 4096 が他に比べてずっと速かったりするそうです。

  最近の Linux カーネル（1.3 のどれか以降）では rsize をマシンのページサ
  イズと同じかそれ以上にすると先読みが行われます。 Intel の CPU ではペー
  ジのサイズは 4096 バイトです。先読みは NFS の読み込み速度をはっきり体
  感できるほど高速化します。ですから Intel のマシンでは、可能ならば
  rsize を 4096 バイトにすると良いでしょう。もちろんあくまで可能ならば、
  です。
  rsize と wsize を反映させるためには /etc/fstab の編集が必要になること
  をお忘れなく。

  NFS の書き込み速度を上げる技として、サーバの同期書き込みを禁止する方法
  があります。 NFS の仕様によると、データが不揮発性のメディア（普通は
  ディスク）に書き込まれるまで、NFS の書き込み要求は終了されたとは見なさ
  れません。この仕様のため書き込み性能に制限が生じます。また非同期書き込
  みによって NFS の書き込み速度が上昇するのはこのためです。これまで
  Linux の nfsd で同期書き込みが実装されたことはありません。なぜなら
  Linux のファイルシステムの実装においては同期書き込みが重要視されていな
  いからです。しかし Linux 以外のサーバでは exports ファイルに以下のよう
  な記述をすることによって性能を上げることが可能です。

  ______________________________________________________________________
  /dir    -async,access=linuxbox
  ______________________________________________________________________

  書式は異なるかもしれませんので、そのマシンの exports の man ページを参
  照して下さい。なお、これによってデータを失う危険性は高まることは知って
  おいて下さい。

  5.  遅いラインを通しての NFS

  「遅いライン」としてはモデムや ISDN、あるいは遠く離れたコネクションな
  どを想定しています（ありがちなのは最後でしょう）。

  この節はプロトコルの知識に基づいたもので、実際の実験は行っていません。
  私の家のコンピュータは HDD のクラッシュのせいでこの６ヶ月間ダウンした
  ままなので、この内容をテストするためのモデム回線がないのです。もしここ
  の内容を試したら、是非私までお知らせ下さい :-)

  まず覚えておいて欲しいことは、 NFS は遅いプロトコルである、ということ
  です。 NFS はオーバーヘッドが大きいのです。 NFS を用いるのはファイル転
  送に kermit を用いるようなもので、遅いのです。ほとんどのプロトコルは
  NFS より速く、 FTP 、HTTP、 rcp、 ssh 全部そうです。

  でも試してみたい、ですか？わかりました。

  NFS のデフォルトのパラメータは、転送も応答もきわめて速いラインに向いた
  ものになっています。デフォルトのパラメータを応答の遅いラインに用いる
  と、「NFS からエラーがレポートされる」、「オペレーションが中断する」、
  「ファイルが実際より小さくなる」などなど、様々な不思議な現象に見舞われ
  ることになります。

  まず最初に行うべきは、マウントオプション soft の使用を中止することで
  す。これを用いるとタイムアウトがおこり、ソフトウェアにエラーが返されま
  す。たいていのソフトではこのエラーを正しく扱えるようになっていません。
  これが不可思議なエラーの主な理由です。代わりにマウントオプションとして
  hard を用いて下さい。 hard を有効にすると、無限にリトライを繰り返すよ
  うになり、ソフトウェアの都合を考えずに勝手に中断したりすることがなくな
  ります。こちらの方が良いんです。本当です。

  次にすべきことは、マウントオプションの timeo と retrans をチューンする
  ことです。これらは nfs(5) のマニュアルページに記述されていますが、ここ
  にもコピーを書きます。

     timeo=n
        RPC タイムアウトの後、最初の再送を行うまでの時間を 1/10 秒単位で
        指定する。デフォルトは 7 （つまり 0.7 秒）。最初のタイムアウトの
        後は、タイムアウトの時間は倍々される。これはタイムアウトが最大値
        の 60 秒になるか、あるいは再送の回数が指定した値よりも大きくなっ
        てメジャータイムアウトとなるまで続く。メジャータイムアウトになる
        と、ファイルシステムがハードマウントされている場合には、新たなタ
        イムアウト列が初期値を 2 倍にして再び試みられる（列の内部ではタ
        イムアウトは倍々）。タイムアウトの最大値は常に 60 秒である。ネッ
        トワークが混雑している、サーバが遅い、経路に複数のルータまたはゲ
        ートウェイがある、などの場合にはこのタイムアウトを増やすことに
        よって全体の性能を向上させることができる。

     retrans=n
        マイナータイムアウトと再送の合計数がこの値を超えるとメジャータイ
        ムアウトとなる。デフォルトは 3 回。メジャータイムアウトが起こる
        と、ファイル操作は中断されるか、あるいは "server not responding"
        のメッセージがコンソールに表示される。

  もうちょっとわかりやすく言いましょう。もし返事がタイムアウトである 0.7
  秒（700ms）のうちに返ってこないと、 NFS クライアントはリクエストを再送
  してタイムアウトを倍の 1.4 秒にします。さらに返事が 1.4 秒以内に返って
  こない場合には、再度リクエストを送り、タイムアウトも倍の 2.8 秒にする
  わけです。

  ラインの速度は ping で測定することができます。パケットのサイズは
  rsize/wsize オプションで与えた値と同じにします。

  ______________________________________________________________________
  $ ping -s 8192 lugulbanda
  PING lugulbanda.uio.no (129.240.222.99): 8192 data bytes
  8200 bytes from 129.240.222.99: icmp_seq=0 ttl=64 time=15.2 ms
  8200 bytes from 129.240.222.99: icmp_seq=1 ttl=64 time=15.9 ms
  8200 bytes from 129.240.222.99: icmp_seq=2 ttl=64 time=14.9 ms
  8200 bytes from 129.240.222.99: icmp_seq=3 ttl=64 time=14.9 ms
  8200 bytes from 129.240.222.99: icmp_seq=4 ttl=64 time=15.0 ms

  --- lugulbanda.uio.no ping statistics ---
  5 packets transmitted, 5 packets received, 0% packet loss
  round-trip min/avg/max = 14.9/15.1/15.9 ms
  ______________________________________________________________________

  ここでの時間は ping のパケットが lugulbanda まで往復する時間を測ってい
  ます。 15ms はきわめて高速と言えます。 28000 bps のラインでは、
  4000-5000ms 程度の値となるでしょう。もしラインに他の負荷がかかっている
  場合にはこの時間はさらに長くなり、倍になることも珍しくありません。この
  時間が長いことを「応答が遅い」と言っているのです。一般的に、パケットが
  大きくなるほど、またラインの負荷が高くなるほど応答は遅くなります。
  timeo をあなたのラインと負荷にあわせて大きくして下さい。ラインを他の用
  途に使っている場合は応答がその分遅くなることも考慮して下さい。例えば
  FTP と NFS を同時に使いたいような場合には、 FTP でファイル転送を行って
  いる間に ping の時間を計測しておくべきでしょう。

  6.  セキュリティと NFS

  断っておきますが、私はコンピュータセキュリティの専門家ではありません。
  しかしセキュリティに関して多少は役に立つアドバイスをすることができると
  思います。でも注意して下さい。ここに書いてあることは NFS の問題をすべ
  てリストアップしたものではないのです。もしここに書いてあることを実行し
  ただけで「もう安心だ」と思った方は、とんだお人好しというものです。「幸
  運を呼ぶツボ」とかを売りつけられないように気を付けた方が良いですよ
  :-)。

  以下のような状況なら、この章の内容は必要ありません：あなたのホストが所
  属しているのが閉じたネットワークで、そこにいる全てのユーザは信用がお
  け、そうでない人はネットワーク上のマシンにアクセスできないようになって
  いる場合です。つまりネットワークに対するダイアルアップ接続は禁止、他の
  ネットワークにへの接続も禁止（そのネットのユーザが全員信頼できて、同様
  のセキュリティを確保している場合は別）です。偏執に過ぎると思いますか？
  全然そんなことはないんですよ。これはセキュリティに関するごく基本的な考
  え方に過ぎません。それに、覚えておいて下さい、私がこれから述べることは
  ごく基本的なことなのです。安全なサイトを構築するには、熱心で知識が深
  く、潜在的なセキュリティ上の問題点に関する最新情報の入手先を知っている
  ような管理者が不可欠です。

  NFS の基本的な問題点は、特に指定をしなければクライアントとサーバがお互
  いを信頼しあってしまうところにあります。これはまずいわけで、例えばサー
  バの root アカウントが破られたら、クライアントの root アカウントを破る
  のも非常に簡単になってしまうわけです（逆もまたしかり）。この問題を避け
  る方法はいくつかあり、後で説明する予定です。

  CERT のセキュリティに関する勧告を読んでおくようにしましょう。この文書
  の以下のほとんども、CERT が勧告した内容を扱っています。最新の勧告のリ
  ストは <ftp://ftp.cert.org/01-README> で見ることができます。 NFS 関連
  の勧告を以下にいくつか挙げておきます。

  ______________________________________________________________________
  CA-91:21.SunOS.NFS.Jumbo.and.fsirand                            12/06/91
       Vulnerabilities concerning Sun Microsystems, Inc. (Sun) Network
       File System (NFS) and the fsirand program.  These vulnerabilities
       affect SunOS versions 4.1.1, 4.1, and 4.0.3 on all architectures.
       Patches are available for SunOS 4.1.1.  An initial patch for SunOS
       4.1 NFS is also available. Sun will be providing complete patches
       for SunOS 4.1 and SunOS 4.0.3 at a later date.

  CA-94:15.NFS.Vulnerabilities                                    12/19/94
       This advisory describes security measures to guard against several
       vulnerabilities in the Network File System (NFS). The advisory was
       prompted by an increase in root compromises by intruders using tools
       to exploit the vulnerabilities.

  CA-96.08.pcnfsd                                                 04/18/96
       This advisory describes a vulnerability in the pcnfsd program (also
       known as rpc.pcnfsd). A patch is included.
  ______________________________________________________________________

  6.1.  クライアント側のセキュリティ

  クライアント側では、サーバを信頼しすぎないように設定することが可能で、
  これはマウント時のオプションで指定します。例えば NFS ファイルシステム
  にある suid されたプログラムを動作させないようにするには nosuid オプ
  ションを使います。これは良い設定で、NFS マウントする全てのディスクに導
  入を考えるべきだと思います。これを用いないと、サーバの root ユーザがク
  ライアントでも root 権限を奪うことができてしまいます。 suid プログラム
  をサーバのファイルシステムに作り、クライアントに一般ユーザでログインし
  て先ほどの suid プログラムを実行すれば... おわかりですね？マウントした
  ファイルシステム上のファイルの実行をすべて禁止することもできます。これ
  には noexec オプションを用います。ただ、これは実際には nosuid に比べて
  だいぶ不便になってしまうでしょう。どんなファイルシステムにも実行しなけ
  ればならないスクリプトやプログラムの類がいくつかは入っているでしょうか
  ら。これらのオプションは /etc/fstab のオプションの列に、 rsize や
  wsize などと一緒にコンマで区切って記述します。

  6.2.  サーバ側のセキュリティ: nfsd

  サーバ側では、クライアントの root アカウントを信頼しないように設定する
  ことができます。これには exports に記述する際、 root_squash オプション
  を用います。

  ______________________________________________________________________
  /mn/eris/local apollon(rw,root_squash)
  ______________________________________________________________________

  こうすると、クライアントで UID 0 のユーザがファイルにアクセス（read,
  write, delete）しようとすると、サーバは UID をサーバにおける "nobody"
  アカウントのものと置き換えます。つまりサーバの root だけにアクセスや変
  更が許されているファイルに対して、クライアントの root がアクセスや変更
  を行うことができなくなるのです。これも良い設定で、 export する全ての
  ファイルシステムに root_squash を用いるべきだと思います。「でもクライ
  アントの root ユーザは `su' を使って他のユーザになって、そのユーザの
  ファイルを変更できちゃうじゃないですか！」と言う意見があるかもしれませ
  ん。その通り、それが Unix や NFS の流儀なのです。この意見には重要な側
  面があります。重要なバイナリやファイルなどは root によって保有されるべ
  きで、 bin などの root 以外のアカウントにするべきではありません。なぜ
  ならクライアントの root ユーザがアクセスできないのはサーバの root アカ
  ウントのファイルだけだからです。 nfsd の man ページには他にも何種類か
  の排他オプションが記述されています。これらを用いれば、好きな（あるいは
  嫌いな）クライアントユーザを信頼しないように設定できます。また UID や
  GID の範囲によって排他機能を設定することもオプションで指定できます。こ
  れは  Linux の nfsd の man ページに記述されています。

  root_squash は実は Linux の NFSd ではデフォルトになっています。ファイ
  ルシステムへの root のアクセスを許可するには no_root_squash を指定して
  下さい。

  もう一つ重要なことは、 nfsd に対する特権ポートからの接続要求がチェック
  されているかどうかを確認しておくことです。もしクライアントからの要求を
  どんなポートからでも受け入れてしまうと、 NFS プロトコルを話す適当なプ
  ログラムを用いて、特権を持たないクライアントユーザが他のユーザに成りす
  ますことができてしまいます（このようなプログラムはインターネットで容易
  に入手できます）。 Linux の nfsd はデフォルトでこのチェックをするよう
  になっていますが、他の OS では手動でこのチェックを指定しなければならな
  いかもしれません。この作業はその OS の nfsd の man ページに記述されて
  いるはずです。

  最後にもう一つ。ファイルシステムを `localhost' や 127.0.0.1 に対して
  export してはなりません。この点に関しては私を信用して下さい。

  6.3.  サーバ側のセキュリティ: ポートマッパ

  初期のポートマッパと nfsd の組み合わせには設計上の問題があり、 NFS サ
  ーバのファイルへのアクセスが特権無しに可能になってしまっていました。幸
  運なことに Linux のポートマッパはこの攻撃に対して比較的安全になってい
  ます。また二つのファイルを用いたアクセスリストを設定することによって、
  さらに安全にできます。

  まず /etc/hosts.deny を編集します。以下の行を書き込みます。

  ______________________________________________________________________
  portmap: ALL
  ______________________________________________________________________

  こうするとどこからのアクセスも受け付けなくなります。これはちょっと極端
  にすぎるので、/etc/hosts.allow を編集してポートを再び開けることになり
  ます。まずどのクライアントに開けるかを決める必要があります。まずサーバ
  のポートマッパにアクセスする必要のあるマシンをリストアップします。しっ
  かりと設定されたシステムでは、ポートマッパのあらゆるポートにアクセスが
  必要なマシンというのは非常に少ないはずです。ポートマッパは nfsd と
  mountd、 ypbind/ypserv、 pcnfsd、 そして ruptime や rusers などの 'r'
  コマンド群を管理します。このうち nfsd と mountd、 ypbind/ypserv そして
  pcnfsd のみが問題の対象となるものです。ホストマシンのサービスにアクセ
  スが必要なマシンには許可を与えなければなりません。例えばサーバのアドレ
  スが 129.240.223.254 で、サブネット 129.240.223.0 にあるクライアントホ
  ストにアクセス許可を与えるとします（これは networking HOWTO と同じ例で
  す。必要があったら networking HOWTO をもう一度見に行って、あなたの脳の
  メモリをリフレッシュして下さい）。この場合は hosts.allow に以下のよう
  に書きます。

  ______________________________________________________________________
  portmap: 129.240.223.0/255.255.255.0
  ______________________________________________________________________

  これは route コマンドで用いたネットワークアドレス及び ifconfig で用い
  たサブネットマスクと同じです。この場合 eth0 デバイスに対する ifconfig
  の結果は以下のようになっているはずです。

  ______________________________________________________________________
  …
  eth0      Link encap:10Mbps Ethernet  HWaddr 00:60:8C:96:D5:56
            inet addr:129.240.223.254  Bcast:129.240.223.255  Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:360315 errors:0 dropped:0 overruns:0
            TX packets:179274 errors:0 dropped:0 overruns:0
            Interrupt:10 Base address:0x320
  …
  ______________________________________________________________________

  同様に netstat -rn とすると以下のようになるはずです。

  ______________________________________________________________________
  Kernel routing table
  Destination     Gateway         Genmask         Flags Metric Ref Use    Iface
  …
  129.240.223.0   0.0.0.0         255.255.255.0   U     0      0   174412 eth0
  …
  ______________________________________________________________________

  （最初の列はネットワークアドレスになります）

  hosts.deny と hosts.allow ファイルに関しては同名の man ページに記述が
  あります。

  訳注: 訳者のところでは "man 5 hosts_access" でした。

  重要: portmap の行には IP 番号以外のものは書かないで下さい。ホストネー
  ムの問い合わせは間接的にポートマッパを呼び出すことがあり、するとまたホ
  ストネームの問い合わせが生じてポートマッパが呼び出されホストネームの問
  い合わせが...

  以上であなたのサーバは随分しっかりしたはずです。残る問題は（そう、まだ
  あるんですよ）、信頼しているマシンで root が破られた場合（あるいは MS-
  DOS がブートされた場合）くらいです。このとき root 権限を利用すると信頼
  したポートを通して他のユーザに成りすますような要求を出すことが可能に
  なってしまいます。

  6.4.  NFS とファイアウォール

  ルータやファイアウォールを用いて NFS やポートマッパのポートを塞ぐのは
  非常に良い考えです。 nfsd は通常ポート 2049 の tcp/udp を用います。ポ
  ートマッパはポート 111 の tcp/udp、 mountd は 745 と 747 の tcp/udp を
  使います。これらのポートは rpcinfo -p で調べる事ができます。

  逆に NFS にファイアウォールを越えさせたい場合は、最近の nfsd や mountd
  にあるオプションを使って特定の（非標準な）ポートを用いるようにし、その
  ポートをファイアウォールで開ければ良いでしょう。

  6.5.  まとめ

  hosts.allow/deny、 root_squash、 nosuid と portmapper/nfs ソフトの特権
  ポート関連の機能を用いれば、現在知られているポートマッパと NFS に関連
  した多くの問題を避けることができ、少なくとも多少は安心することができま
  す。しかし /home や /var/spool/mail が NFS マウントされていると、あな
  たのネットワークへの侵入者は .forward やメールボックスのファイルに特殊
  なコマンドを埋め込んでしまうことができます。同じ理由から、 PGP の秘密
  鍵を NFS アクセスできるようにするべきではありません。あるいは少なくと
  も危険性を知っていなければなりません（今や知ったわけですが）。

  NFS とポートマッパは複雑なシステムの組み合わせからなっているので、将来
  にわたって基本設計や実装にバグが発見されないとは限りません。あるいは現
  時点においても穴が存在していて、誰かが悪用しているかもしれないのです。
  まあそれが人生と言うものです。このように物事に遅れないためには、少なく
  とも comp.os.linux.announce や comp.security.announce などには目を通し
  ておく必要があるでしょう。

  7.  マウントのチェックリスト

  この節は IBM 社の「NFS mount problem checklist」をもとにしています。こ
  れを本 HOWTO へ引用することを許可してくれた彼らに感謝します。もし NFS
  ファイルシステムをマウントする際に問題が生じたら、是非ポストする前にこ
  のリストを参照して下さい。各々の項目で障害の様子と修正方法を記述してい
  ます。

  1. ファイルシステムが export されていない。あるいは問題となっているク
     ライアントに対して export されていない。

     修正: export する。

  2. export リストと name resolution が一致しない。

     つまり、 export リストでは johnmad に export することになっているの
     に、 johnmad が johnmad.austin.ibm.com と resolve されてしま
     い、"permission is denied" になってしまう場合などです。

     修正:両方の名前に export する。

     さらに、クライアントが 2 つのインターフェースを持っていて、それぞれ
     に違う名前が付いているのに、片方にしか export していない、というよ
     うなこともありがちです。

     修正:両方のインターフェースに export する。

     またサーバがクライアントを lookuphostbyname または lookuphostbyaddr
     （これらはライブラリ関数です）できない場合もあるかもしれません。ク
     ライアントに対して host <name> と host <ip_addr> を行うことができ、
     両者が同じマシンを示すことを確認して下さい。

     修正:name resolution をちゃんと設定する。

  3. NFS がスタートした後で、サーバのファイルシステムがマウントされた。
     このような場合には、サーバはマウントポイント以下に隠れた部分を
     export してしまい、マウントされたファイルシステムは export されませ
     ん。

     修正: NFSd をシャットダウンして再起動する。

     注意: マウントポイント以下の隠れた部分をマウントしてしまったクライ
     アントは、サーバのリスタート後にアクセスできなくなります。

  4. 日付がサーバかクライアント、あるいはその両方で大きくずれている。こ
     のような場合には、make がめちゃくちゃになります。

     修正: 日付を正しくセットする。

     筆者は日付の同期に NTP を用いることを薦めます。 NTP には米国におい
     て輸出規制があるので、debian や redhat、 slackware 用の NTP は
     <ftp://ftp.hacktic.nl/pub/replay/pub/linux/>またはこのミラーから入
     手する必要があります。

  5. 8 つ以上のグループに属しているユーザからのマウント要求を受け付けな
     い。

     修正: そのユーザの所属するグループ数を減らすか、他のユーザでマウン
     トする。

  8.  FAQ

  FAQ セクションです。この節は Alan Cox の NFS FAQ をもとにしています。

  1. Linux を nfs サーバにすると 'stale nfs handle' というエラーが頻発し
     ます。

     これは古い版の nfsd にあるバグが原因です。 nfs-server2.2beta16 以降
     では修正されています。

  2. ファイルシステムをマウントしようとすると、以下のようなメッセージが
     出てしまいます。

       can't register with portmap: system error on send

  Caldera のシステムをお使いではありませんか？このシステムには rc スクリ
  プトにバグがあります。 Caldera に連絡して修正版を手に入れて下さい。

  3. NFS サーバにコピーしたプログラムが実行できないんですが？

     効率上の理由で、 nfsd が open ファイルハンドラをキャッシュするから
     です（nfsd がユーザ領域で実行されていることを思い出して下さい）。
     nfsd がファイルをオープンしている間（つまりそのファイルに書き込みを
     行った後）には、カーネルはそのファイルに実行許可を与えません。 95
     年の春以降の nfsd では、このファイルハンドラのリリースは数秒で終了
     しますが、古いものでは数日もキャッシュしたままのこともあります。

  4. NFS ファイルが全部リードオンリーなのですが。

     Linux の NFS サーバはデフォルトではリードオンリーです。 exports と
     nfsd の man ページを読んで下さい。/etc/exports を修正する必要がある
     でしょう。

  5. Linux の NFS サーバからマウントしたとき、しばらく経つと読み書きがで
     きなくなる場合があります。

     古いバージョンでは rsize=1024,wsize=1024 をつけてマウントする必要が
     あります。

  6. ブロックサイズを 3500 から 4000 の間にしてマウントすると、 Linux ホ
     ストがクラッシュすることがあります。

     その範囲以外のブロックサイズを使って下さい。

  7. Linux では TCP を用いた NFS は可能ですか？

     今のところできません。

  8. Linux マシンから NFS マウントをしようとすると不思議なエラーが続けざ
     まに表示されます。

     NFS を使うユーザの所属するグループが 8 つ以内に収まっていることを確
     認して下さい。古いサーバではこの条件が必要なことがあります。

  9. クライアントマシンをリブートするとき、ハングした NFS サーバを
     umount するとクライアントがハングしてしまうことがあります。

     リブートや停止するときには NFS サーバを umount せず、単に無視して下
     さい。 umount しなければ何も問題を起こすことはありません。コマンド
     は umount -avt nonfs となります。

  10.
     Linux の NFS クライアントから Sun や BSD のシステムに書き込むと非常
     に遅いのですが。

     NFS の書き込みは通常同期的に行われます（もしデータを失う危険性を気
     にしなければこれを無効にすることもできます）。悪いことに、BSD から
     由来したカーネルにおいては、小さなブロックにおいてこれがうまく機能
     しない場合があるのです。例えば Linux から 4K のデータを 1K のパケッ
     トに分けて書き込もうとすると、 BSD は以下のような動作を行います。

               read 4K page
               alter 1K
               write 4K back to physical disk
               read 4K page
               alter 1K
               write 4K page back to physical disk
               etc..

  9.  ファイルシステムの export

  NFS でファイルシステムを export するやり方は、プラットフォームが異なる
  と必ずしも同じとは限りません。ここでは Linux と Slaris 2 が仲間はずれ
  です。この節では多くのシステムにおける export の方法を簡単にリストした
  いと思います。もしお使いのシステムがこの中に入っていない場合には、使っ
  ている OS の man ページを見て下さい。キーワードとしては、 nfsd、
  system administration tool、rc scripts、 boot scripts、 boot
  sequence、 /etc/exports、 exportfs などを使うと良いでしょう。この節で
  は「/mn/eris/local を apollon で read/write 可能なように export する」
  例について示すことにします。

  9.1.  IRIX, HP-UX, Digital-UNIX, Ultrix, SunOS 4 (Solaris 1), AIX

  これらの OS では伝統的な Sun の export フォーマットを用いています。
  /etc/exports に以下のように書いて下さい。

  ______________________________________________________________________
  /mn/eris/local -rw=apollon
  ______________________________________________________________________

  詳細な解説は exports の man ページにあります。ファイルを編集したら
  exportfs -av を実行してファイルシステムを export して下さい。

  exportfs コマンドの文法に対する厳格さはシステムによって変ります。 OS
  によっては先ほど入力した行が

  ______________________________________________________________________
  /mn/eris/local apollon
  ______________________________________________________________________

  で良いこともありますし、以下のように省略できることもあります。

  ______________________________________________________________________
  /mn/eris/local rw=apollon
  ______________________________________________________________________

  が、私は正式な書式を守ることをお勧めします。次のバージョンの exportfs
  が急に文法に厳しくなれば、突然動いていたもの全てが止まってしまう危険性
  があるのですから。

  9.2.  Solaris 2

  Sun は Solaris 2 を開発したときに、車輪を完全に最初から再開発したよう
  ですね。従ってこれは他の OS とは完全に異なっています。 Solaris 2 では
  編集するファイルは /etc/dfs/dfstab になっています。ここに share コマン
  ドを share(1M) の man ページに書かれているように記述します。以下に例を
  挙げます。

  ______________________________________________________________________
  share -o rw=apollon -d "Eris Local" /mn/eris/local
  ______________________________________________________________________

  編集が終わったら、プログラム shareall を実行してファイルシステムを
  export します。

  10.  PC-NFS

  PC-NFS を使わずに samba を使いましょう。

  ごめんなさい、私は PC NFS にはあまり馴染みがないんです。もし私に連絡を
  下さる方がいれば、その内容をここに取り込みたいと思っています。

