はじめに
Ubuntu 22.04 に NFSv4 サーバを構築するための、シンプルな手順です。
ステートフルで信頼性の高い、NFSv4 だけを有効化し、設定が混同しやすい NFSv3 は無効化していきます。
セットアップ
1. nfs-kernel-server のインストール
apt で nfs-kernel-server をインストールします。
# apt install -y nfs-kernel-server
2049番ポートが開いていれば、NFSv4 動作OK です。
# ss -natpu | grep 2049
tcp LISTEN 0 64 0.0.0.0:2049 0.0.0.0:*
tcp LISTEN 0 64 [::]:2049 [::]:*
3. 公開用ディレクトリの準備
公開用ディレクトリとして、/srv/nfs を作成します。
# mkdir /srv/nfs
mount したときに、確認できるように、適当なファイルをつくっておきます。
# touch /srv/nfs/test-file
2. /etc/exports に設定を記述
/etc/exports に NFS で公開するディレクトリを記述します。
また、今回は 127.0.0.1 と 192.168.11.0/24 にアクセスを許可を設定します。
filename: /etc/exports
/srv/nfs 127.0.0.1(rw,async,fsid=0,crossmnt,no_root_squash,no_subtree_check)
/srv/nfs 192.168.11.0/24(rw,async,fsid=0,crossmnt,no_root_squash,no_subtree_check)
3. 設定を反映
exportfs -r で設定を反映させます。
# exportfs -r
設定反映は、PC 再起動や nfs-kernel-server の restart でも大丈夫です。
systemctl restart nfs-kernel-server
4. ローカルで mount 確認
ファイアーウォールにかかると、原因が掴みにくくなるため、最初に NFS サーバのローカル環境で、mount を試みます。
mount が通り、ls でファイルが見えたら成功です。
# mkdir /mnt/nfs
# mount -t nfs4 127.0.0.1:/ /mnt/nfs
# ls /mnt/nfs/
test-file
5. 外部から mount 確認
別の PC から、ネットワーク経由で mount できることを確認します。
# mkdir /mnt/nfs
# mount -t nfs4 192.168.1.7:/ /mnt/nfs
# ls /mnt/nfs/
test-file
mount してファイルが見えていたら、NFS サーバ構築完了です。
NFSv3 の無効化
NFSv3 が有効な状態だと、rpc 系の余計なポートが開いた状態となるため、完全に無効化していきます。
この無効化方法は、ディストリビューションやバージョンによって大分差分があります。
今回は、Ubuntu 22.04 環境での NFSv3 無効化方法になります。
設定が中途半端な状態だと、2049番ポートまで開かない状態になりますので、気をつけてください。
NFSv3 の無効化は、結構はまりやすいポイントです。
1. NFSv3 のポート確認
インストール時点で、以下のような rpc 系ポートが LISTEN 状態となっています。
(固定していない場合、ポート番号は起動ごとに変わります。)
# ss -natpu | grep LISTEN | egrep "2049|rpc"
tcp LISTEN 0 4096 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=364,fd=4),("systemd",pid=1,fd=32))
tcp LISTEN 0 4096 0.0.0.0:42823 0.0.0.0:* users:(("rpc.mountd",pid=663,fd=5))
tcp LISTEN 0 4096 0.0.0.0:34555 0.0.0.0:* users:(("rpc.statd",pid=661,fd=9))
tcp LISTEN 0 4096 0.0.0.0:50373 0.0.0.0:* users:(("rpc.mountd",pid=663,fd=9))
tcp LISTEN 0 4096 0.0.0.0:51589 0.0.0.0:* users:(("rpc.mountd",pid=663,fd=13))
tcp LISTEN 0 64 0.0.0.0:2049 0.0.0.0:*
tcp LISTEN 0 4096 [::]:45919 [::]:* users:(("rpc.mountd",pid=663,fd=15))
tcp LISTEN 0 4096 [::]:111 [::]:* users:(("rpcbind",pid=364,fd=6),("systemd",pid=1,fd=34))
tcp LISTEN 0 4096 [::]:54277 [::]:* users:(("rpc.statd",pid=661,fd=11))
tcp LISTEN 0 4096 [::]:51701 [::]:* users:(("rpc.mountd",pid=663,fd=11))
tcp LISTEN 0 4096 [::]:35131 [::]:* users:(("rpc.mountd",pid=663,fd=7))
tcp LISTEN 0 64 [::]:2049 [::]:*
2. nfs-mountd.service (rpc.mountd) 以外の rpc 系サービスの無効化
nfs-mountd.service (rpc.mountd) を除いた、rpc-statd.service rpcbind.socket rpcbind.service のサービスを無効化します。
nfs-mountd.service (rpc.mountd) は、NFSv4 の TCP 2049番ポートの LISTEN で必要なため、残します。
# systemctl mask --now rpc-statd.service rpcbind.socket rpcbind.service
このコマンドを実行した直後(起動中)で、LISTEN 状態は、以下のようになります。
# ss -natpu | grep LISTEN | egrep "2049|rpc"
tcp LISTEN 0 4096 0.0.0.0:42823 0.0.0.0:* users:(("rpc.mountd",pid=663,fd=5))
tcp LISTEN 0 4096 0.0.0.0:50373 0.0.0.0:* users:(("rpc.mountd",pid=663,fd=9))
tcp LISTEN 0 4096 0.0.0.0:51589 0.0.0.0:* users:(("rpc.mountd",pid=663,fd=13))
tcp LISTEN 0 64 0.0.0.0:2049 0.0.0.0:*
tcp LISTEN 0 4096 [::]:45919 [::]:* users:(("rpc.mountd",pid=663,fd=15))
tcp LISTEN 0 4096 [::]:51701 [::]:* users:(("rpc.mountd",pid=663,fd=11))
tcp LISTEN 0 4096 [::]:35131 [::]:* users:(("rpc.mountd",pid=663,fd=7))
tcp LISTEN 0 64 [::]:2049 [::]:*
まだ、 rpc.mountd が起動していますが、この状態で再起動すると、NFSv3 としての動作に必要な他のサービスが存在しないため、rpc.mountd の起動が失敗して、NFSv4 の TCP 2049番ポート含めて見えない状態になります。(NFS サービスが全く起動しない状態)
再起動後の nfs-mountd.service 起動失敗の systemctl status 表示
root@ubuntu:~# systemctl status nfs-mountd.service
\u25cb nfs-mountd.service - NFS Mount Daemon
Loaded: loaded (/lib/systemd/system/nfs-mountd.service; static)
Active: inactive (dead) since Wed 2025-01-15 20:58:57 JST; 34s ago
Process: 664 ExecStart=/usr/sbin/rpc.mountd (code=exited, status=0/SUCCESS)
Main PID: 666 (code=exited, status=0/SUCCESS)
CPU: 4ms
1\u6708 15 20:58:57 ubuntu rpc.mountd[664]: Failed to register (mountd, 3, tcp): svc_reg() err: RPC: Remote system error - Connection refused
1\u6708 15 20:58:57 ubuntu rpc.mountd[664]: Failed to register (mountd, 3, udp6): svc_reg() err: RPC: Remote system error - Connection refused
1\u6708 15 20:58:57 ubuntu rpc.mountd[664]: Failed to register (mountd, 3, tcp6): svc_reg() err: RPC: Remote system error - Connection refused
1\u6708 15 20:58:57 ubuntu rpc.mountd[664]: mountd: No V2 or V3 listeners created!
1\u6708 15 20:58:57 ubuntu rpc.mountd[666]: Version 2.6.1 starting
1\u6708 15 20:58:57 ubuntu systemd[1]: Started NFS Mount Daemon.
1\u6708 15 20:58:57 ubuntu systemd[1]: Stopping NFS Mount Daemon...
1\u6708 15 20:58:57 ubuntu rpc.mountd[666]: Caught signal 15, un-registering and exiting.
1\u6708 15 20:58:57 ubuntu systemd[1]: nfs-mountd.service: Deactivated successfully.
1\u6708 15 20:58:57 ubuntu systemd[1]: Stopped NFS Mount Daemon.
3. nfs-mountd.service (rpc.mountd) が、NFSv4 としてのみ動作するように設定
nfs-mountd.service (rpc.mountd) が、NFSv3 含めて起動しようとすると、上記の 通り、起動が失敗するため、本手順で NFSv4 としてのみ起動するように設定します。
3-1. /etc/nfs.conf の修正
/etc/nfs.conf を修正して、NFSv3 を無効化します。
filename: /etc/nfs.conf
# vers2=n
# vers3=y
vers2=n
vers3=n
vers2=n
はコメントアウトのデフォルト値が n
ですが、明示的に vers2=n
が必要です。
3-2. 再起動して確認
設定を保存して再起動すると、rpc.mountd の LISTEN がなくなり、NFSv4 の TCP 2049 番ポートのみ LISTEN 状態で見えるようになります。
# ss -natpu | grep LISTEN | egrep "2049|rpc"
tcp LISTEN 0 64 0.0.0.0:2049 0.0.0.0:*
tcp LISTEN 0 64 [::]:2049 [::]:*
これで、NFSv3 の無効化完了です。
外部からのみ mount できない場合は、ファイアーウォール等に引っかかっている可能性があります。