16.3. NFSv4 サーバーの基本設定と起動

16.3.1. NFSv4 サーバーの設定

NFS を使用するには、NFS サーバーの設定ファイル /etc/exports を編集し、エクスポート(公開)するディレクトリを指定します。NFS クライアントは、エクスポートされたディレクトリを mount コマンドでマウントして使用します。以下では、基本的な NFSv4 の設定手順を解説します。また、NFSv2/v3 クライアントからの利用も考慮してこれらのクライアントからもマウントするために必要な設定をあわせて解説します。

Portmap のための /etc/hosts.allow の設定

ティップ

NFSv4 のみを使用するのであれば、portmap へのアクセスを許可する必要はありません。

NFSv2/NFSv3 クライアントからのアクセスが混在する環境では、アクセスを許可するホストの IP アドレスを次の例のように /etc/hosts.allow に指定します。

portmap: 192.168.0.0/255.255.255.0
NFS 関連デーモンのための /etc/hosts.allow の設定

ティップ

NFSv4 のみを使用するのであれば、ここでの設定は必要ありません。

NFSv2/NFSv3 クライアントからのアクセスが混在する環境では、アクセスを許可するホストの IP アドレスを指定します。

mountd:  192.168.0.0/255.255.255.0

注意

Turbolinux 11 Server では、nfs-utils 関連デーモンも TCP Wappers にリンクされているため、NFSv2/NFSv3 クライアントからのアクセスがある場合には /etc/hosts.allow で指定が必要です。

/etc/idmapd.conf の設定

/etc/idmapd.conf は、NFSv4 のデーモン /usr/sbin/rpc.idmapd の設定ファイルです。/etc/idmapd.conf は、サーバーとクライアントで同じ内容にする必要があります。ファイルの内容は以下の通りです。

[General]

Verbosity = 0
Pipefs-Directory = /var/lib/nfs/rpc_pipefs
Domain = localdomain

[Mapping]

Nobody-User = nobody
Nobody-Group = nobody

Domain の行にドメイン名を指定します。ここで指定したドメイン名は NFSv4 が内部的に使用します。その他は、編集する必要はありません。なお、NFS サーバーにアカウントの無いユーザーや、ユーザー名/グループ名と UID/GID の一致しないユーザーからの書き込みは、Nobody-User と Nobody-Group で指定したユーザーにマップされます。Turbolinux 11 Server では、デフォルトで nobody ユーザーにマップされています。

/usr/sbin/rpc.idmapd は、ユーザー名/グループ名と UID/GID のマップを保持するデーモンです。NFS では、サーバーとクライアント上のユーザーやグループに同じ UID/GID が設定されていることを前提としています。例えば、サーバー上のユーザー taro の UID が 500 であるとします。しかし、クライアント上では hanako に UID 500 がマップされている場合、taro はサーバーで chmod 600 filename を実行し、自分だけがアクセス可能なパーミッションを設定したとしても、クライアントの hanako はこのファイルにアクセスできてしまいます。このように、以前のバージョンの NFS では、UID/GID のみを参照しているため、サーバーとクライアント間の UID/GID に不一致があると、他のユーザーが作成したファイルであるにもかかわらず、削除や書き込みが可能でした。NFSv4 では、ユーザー名/グループ名と ID 番号をマップすることにより、UID/GID とユーザー名/グループ名が一致していなければ、ファイルへのアクセスは許可されません。

エクスポートディレクトリの作成

ここでは、/home/NFS ディレクトリをエクスポートするものとして解説しています。以下のコマンドを実行して、ディレクトリを作成します。/home/NFS ディレクトリは、誰でも書き込み可能なディレクトリですが、SUID ビットを設定することによって、他のユーザーが作成したファイルへの書き込みや削除を禁止しています。

# mkdir -m 1777 /home/NFS
# ls -ld /home/NFS
drwxrwxrwt 2 root root 4096 2007-11-13 12:10 /home/NFS/
ユーザーの作成

ここでは、以下のユーザーを作成するものとして解説しています。クライアント側にも同じユーザーを作成します。

# useradd -u 600 taro
# useradd -u 601 jiro
# passwd taro
Changing password for user taro.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
# passwd jiro
Changing password for user jiro.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
# id taro
uid=600(taro) gid=600(taro) groups=600(taro)
# id jiro
uid=601(jiro) gid=601(jiro) groups=601(jiro)
NFS サーバーの起動

以下のコマンドを実行し、NFS サーバーを起動します。

# /etc/init.d/portmap start
Starting portmapper:                                                      OK
# /etc/init.d/rpcidmapd start
Starting RPC idmapd:                                                      OK
# /etc/init.d/nfs start
Starting NFS services:                                                    OK
Starting NFS quotas:                                                      OK
Starting NFS daemon:                                                      OK
Starting NFS mountd:                                                      OK

注意

Turbolinux 11 Server では、/etc/init.d/nfs start を実行する前に portmap サービスを起動しておかなければなりません。/etc/init.d/portmap start を実行してから nfs を起動してください。idmapd は、/etc/init.d/nfs start を実行したときに、起動されていないと /etc/init.d/nfs スクリプトにより自動的に起動されます。

Turbolinux 11 Server の起動時に NFS サーバーを自動的に起動するには、以下のように chkconfig コマンドを実行しておきます。

# chkconfig portmap on
# chkconfig rpcidmapd on
# chkconfig nfs on
/etc/exports の編集

/etc/exports には、エクスポートするディレクトリ、アクセスを許可するホスト、アクセス権限などを設定します。1 行ごとに以下の書式で記述していきます。# で始まる行はコメントです。

directory-path hostname(options,options,...) hostname(options,options,...)

directory-path には、公開したいディレクトリのパスを記述します。hostname は、ホスト名、IP アドレス、FQDN、ドメイン名、いずれの形式でも指定可能です。hostname にマッチしたホストだけがエクスポートされたディレクトリをマウントすることができます。hostname に続けて( )内にホストまたはネットワークに対するオプションを指定します。hostname と ( ) の間にはスペースを含めないように注意してください。複数ホストを指定する場合には、スペースで区切って指定します。

以下は、/etc/exports の設定例です。

/home/NFS 192.168.0.0/24(rw,fsid=0,insecure,no_subtree_check,sync,anonuid=99,anongid=99)

1 行目の指定は、192.168.0.0/24 のネットワークアドレスに対して、/home/NFS への読み書きを rw で指定しています。rw を ro にすれば、読み込みのみ許可されます。また、NFSv4 では、fsid=0 が指定されたディレクトリを疑似 root システムとしてエクスポートします。詳細は、項16.5 で解説します。

NFSv4 では、仮想 root システムは 1 つだけ指定し、その中にあるサブディレクトリへバインドするディレクトリの指定を行います。

ここで指定したオプションの他にも数多くのオプションが存在します。詳細については、man exports(5) を参照してください。

/etc/exports の編集後、exportfs コマンドを実行して設定を有効にします。

# exportfs -r

エクスポートされたことを確認します。

# exportfs -v
/home/NFS       192.168.0.0/24(rw,wdelay,insecure,root_squash,no_subtree_check,fsid=0)

16.3.2. NFSv4 のパケットフィルタリング

注意

NFSv4 サーバーでは、TCP 2049 番ポートを使用します。ファイアウォールの存在する環境では以下のパケットフィルタリングの設定が必要です。

NFSv4 を利用する場合、サーバー側で通過を許可しなければならないパケットは、TCP 2049 番ポート宛のパケットです。ファイルシステムをマウントした後に netstat コマンドを実行すると、以下のように TCP 2049 番ポートで TCP セッションが確立されていることを確認できます。

# netstat -tn
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 192.168.0.100:2049      192.168.0.101:800       ESTABLISHED

このように、NFSv4 をサポートするサーバーとクライアント間の接続は、TCP 2049 番ポートを使用するため、従来のバージョンの NFS よりも容易にパケットフィルタリングのルールを指定できます。 iptables で NFSv4 クライアントとサーバー間のパケット転送を許可するには、ファイアウォール上の Linux システムで以下 2 つのルールを追加するだけです。iptables の詳細は、第22章 を参照してください。

# iptables -A FORWARD -i eth0 -p tcp -d 192.168.0.100 --dport 2049 -j ACCEPT
# iptables -A FORWARD -i eth1 -p tcp -m state --state ESTABLISHED --sport 2049 -s 192.168.0.100 -j ACCEPT