15.3. NFSv4 サーバーの基本設定

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

15.3.1. NFSv4 サーバー側の設定

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
locked:  192.168.0.0/255.255.255.0
stated:  192.168.0.0/255.255.255.0

注意

Turbolinux 10 Server では、nfs-utils 関連デーモンも TCP Wappers にリンクされているため、/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 が内部的に使用します。その他は、編集する必要はありません。なお、root ユーザーでの書き込みは、Nobody-User と Nobody-Group で指定したユーザーにマップされます。Turbolinux 10 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  3 root root 4096 Sep 17 19:19 /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 NFS4 idmapd:                                                     OK
# /etc/init.d/nfs start
Starting NFS services:                                                    OK
Starting NFS quotas:                                                      OK
Starting NFS daemon:                                                      OK
Starting NFS mountd:                                                      OK
Starting NFS4 idmapd:                                                     OK

ティップ

/etc/init.d/nfs start を実行したときに、portmap や idmapd が起動していない場合、これらのデーモンは /etc/init.d/nfs スクリプトにより自動的に起動されます。

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

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

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

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

deirectory-path には、公開したいディレクトリのパスを記述します。hostname は、ホスト名、IP アドレス、FQDN、ドメイン名、いずれの形式でも指定可能です。hostname にマッチしたホストだけがエクスポートされたディレクトリをマウントすることができます。以下は、/etc/exports の設定例です。

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

/home/NFS への読み書きを rw で指定しています。rw を ro にすれば、読み込みのみ許可されます。また、NFSv4 でマウントには、fsid=0 の指定が必要です。詳細は、項15.4 で解説します。ここで指定したオプションの他にも数多くのオプションが存在します。詳細については、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,anonuid=99,anongid=99)

15.3.2. クライアント側の設定

/etc/idmapd.conf の設定

サーバー側で設定した /etc/idmapd.conf の内容と同じにします。

マウントポイントの作成

NFSv4 サーバー側のエクスポートディレクトリをマウントするためのマウントポイントを作成します。ここでは、/mnt/NFS を作成しています。

# mkdir  /mnt/NFS
ユーザーの作成

サーバー側で作成したユーザーと同じようにユーザーを作成します。

# useradd -u 600 taro
# useradd -u 601 jiro
# passwd taro
# passwd jiro
# id taro
uid=600(taro) gid=600(taro) groups=600(taro)
# id jiro
uid=601(jiro) gid=601(jiro) groups=601(jiro)
デーモンの起動

クライアント側では portmap と rpc.idmapd を起動しておく必要があります。

# /etc/init.d/portmap start
Starting portmapper:                                                      OK
# /etc/init.d/rpcidmapd start
Starting NFS4 idmapd:                                                     OK

15.3.3. 動作確認

NFSv4 クライアントでのマウント

NFSv4 クライアントで NFS サーバー(nfsv4)のエクスポートディレクトリをマウントします。はじめに modprobe コマンドで nfs モジュールをロードします。NFSv4 の場合は、mount コマンドのファイルシステムタイプに -t nfs4 を指定します。また、マウントするディレクトリのパスは単に / と指定します。これは、/etc/exportfs で fsid=0 の指定されたディレクトリがクライアントからはルートディレクトリとして見えるためです(項15.4 を参照)。

# modprobe nfs
# mount -t nfs4 -o rw,hard,intr nfsv4:/ /mnt/NFS

ティップ

mount のオプションには様々なものがありますが、ここでは、rw,hard,intr を指定しています。これらのオプションは必須ではありません。オプションの詳細については、man mount(8) を参照してください。

以下のように、/etc/fstab に記述しておけば、毎回オプションを指定する必要がなくなります。

nfsv4:/  /mnt/NFS        nfs4     rw,hard,intr,noauto  0 0

/etc/fstab に記述した場合は、以下のように実行するだけでマウントすることができます。

# mount /mnt/NFS

ファイルシステムのマウント後は、/mnt/NFS ディレクトリに対して、あたかもローカルのファイルシステムのようにファイルやディレクトリの作成、修正、削除が可能になります。

# cd /mnt/NFS/
# su taro
$ touch test01
$ ls -l
total 0
-rw-r--r--  1 taro taro 0 Sep 17 20:32 test01
$ exit

また、root ユーザーでの書き込みは、デフォルトで nobody ユーザーへマップされていることがわかります。

# touch test02
# ls -l
total 0
-rw-r--r--  1 taro   taro   0 Sep 17 20:32 test01
-rw-r--r--  1 nobody nobody 0 Sep 17 20:32 test02

ファイルシステムをアンマウントするには、以下のコマンドを実行します。なお、ユーザーが /mnt/NFS 以下のディレクトリにアクセスしている状態で、アンマウントすることはできません。

# umount /mnt/NFS
NFSv3 クライアントでのマウント

NFSv2/v3 クライアントでマウントするのであれば、以下のように実行します。NFS サーバー側では、portmap が起動しており、最低でも /etc/hosts.allow で portmap、mountd へのアクセスがクライアントに対して許可されていなければなりません。mount コマンドの -t オプションには nfs を指定し、サーバー側のエクスポートディレクトリも / ではなく /home/NFS と通常のパスで指定します。

# mount -t nfs -o rw,hard,intr nfsv4:/home/NFS /mnt/NFS

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

NFSv4 を AUTH_SYS で利用する場合、サーバー側で通過を許可しなければならないパケットは、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 の詳細は、第21章 を参照してください。

# 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