Ubuntu 22.04 に NFSv4 サーバ構築(NFSv3 無効化)

はじめに

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 サーバ構築完了です。

外部からのみ mount できない場合は、ファイアーウォール等に引っかかっている可能性があります。

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 の無効化完了です。