VirtualBoxのNAT環境でNFSクライアントとしてマウントする
VirtualBoxのNAT環境でCentOSを利用している時
mountコマンドを実行するとエラーが出て接続できませんでした。
その際、VBoxManageというコマンドを実行することで接続可能となりましたので
同じような問題を抱える方の一助となれば幸いです。
環境
NFSサーバ:CentOs8.2(192.168.1.1)
ホストOS:Windows10(192.168.1.2)
ゲストOS:CentOs7.9(10.0.2.15)
仮想環境:VirtualBox 6.1.18(※ネットワーク設定は NAT)
今回は、NFSサーバ(192.168.1.1)の /work ディレクトリ をゲストOS(10.0.2.15)で /home としてNFSマウントすることが目的です。
事象
ゲストOSでmountコマンドを実行すると「mount.nfs: Operation not permitted」というエラーが出てNFSマウントに失敗しました。
コマンド:
mount -v -t nfs 192.168.1.1:/work /home
エラー:
# mount -v -t nfs 192.168.1.1:/work /home
mount.nfs: timeout set for Sat Jan 23 23:04:49 2021
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.1.1,clientaddr=10.0.2.15'
mount.nfs: mount(2): Operation not permitted
mount.nfs: trying text-based options 'addr=192.168.1.1'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.1.1 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.1.1 prog 100005 vers 3 prot UDP port 20048
mount.nfs: mount(2): Permission denied
mount.nfs: Operation not permitted
調査
●ゲストOS:CentOs7.9(10.0.2.15) で tcpdump を実施。
23:02:49.440538 IP 10.0.2.15.745 > 192.168.1.1.2049: Flags [S], seq 437903753, win 29200, options [mss 1460,sackOK,TS val 565437 ecr 0,nop,wscale 7], length 0
23:02:49.441807 IP 192.168.1.1.2049 > 10.0.2.15.745: Flags [S.], seq 8128001, ack 437903754, win 65535, options [mss 1460], length 0
23:02:49.441838 IP 10.0.2.15.745 > 192.168.1.1.2049: Flags [.], ack 1, win 29200, length 0
23:02:49.442091 IP 10.0.2.15.745 > 192.168.1.1.2049: Flags [P.], seq 1:45, ack 1, win 29200, length 44: NFS request xid 3070970484 40 null
~ 以下、省略 ~
●NFSサーバ:CentOs8.2(192.168.1.1) で tcpdump を実施。
NFSサーバからは、ログ上ホストOSとやり取りしているように見える。
ゲストOS(745番ポート) ⇒ ホストOS(51003番ポート) ⇒ NFSサーバ(2049番ポート)
ゲストOSから745番ポートで通信が開始され、VirtualBoxで変換(今回は51003)、
そのままNFSサーバへ到達するが拒否されている。
どうもデフォルトでNFSサーバは、 ”secure” なポートのみからの接続を受け付けるようになっているらしい。
23:07:40.027643 IP 192.168.1.2.51003 > 192.168.1.1.2049: Flags [S], seq 4185779916, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
23:07:40.027720 IP 192.168.1.1.2049 > 192.168.1.2.51003: Flags [S.], seq 213404800, ack 4185779917, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
23:07:40.028499 IP 192.168.1.2.51003 > 192.168.1.1.2049: Flags [.], ack 1, win 8212, length 0
23:07:40.039466 IP 192.168.1.2.51003 > 192.168.1.1.2049: Flags [P.], seq 1:45, ack 1, win 8212, length 44: NFS request xid 1068118069 40 null
原因
VirtualBoxのNATによるポート番号変換が原因と思われます。
対処方法は後述する 対処1 もしくは 対処2 のどちらかを設定してください。
ただし、対処2 はセキュリティ的にお勧めできませんので自己責任でお願い致します。
対処案1(推奨)
デフォルトでは、VirtualBoxのNATは、接続のエイリアスを生成するときにランダムポートを使用するそうですが
SSH、FTPなどほとんどのプロトコルでうまく機能するそうです。
ただし、一部のプロトコルではうまく機能しないため、次のコマンドを使用してNATモードを変更できます。
参考:9.8.7. Configuring Aliasing of the NAT Engine
https://www.virtualbox.org/manual/ch09.html#nat-adv-alias
※当方はホストOSにWindows10を利用しているため、Windowsでの対応について記載しています
1.対象のゲストOSをシャットダウンします。
2.Windowsのコマンドプロンプトを管理者として実行します。
3.コマンドプロンプトで「 VBoxManage.exe 」が保存されているフォルダへ移動します。デフォルトでは以下のフォルダに保存されています。
C:\Program Files\Oracle\VirtualBox
4.コマンドプロンプトで「 VBoxManage.exe 」コマンドを以下のとおり実行します。
VBoxManage modifyvm centos79 –nataliasmode1 sameports
※「 centos79 」は仮想マシン名で自身の環境に読み替えてください
対処案2(非推奨)
これはNFSサーバの設定変更することとNFSサーバのセキュリティが下がるのでお勧めできないですが方法としては利用できるので参考までに記載します。
1./etc/exports に insecure オプションを追記します。
$ cat /etc/exports
/path/to/directory 192.168.1.0/255.255.255.0(ro,insecure,all_squash)
2.exportfs -a します。
3.nfs-server を再起動します。
■動作確認
mount コマンドを実行し、マウントできることを確認します。
コマンド:
# mount -v -t nfs 192.168.1.1:/work /home
mount.nfs: timeout set for Sat Jan 23 23:35:08 2021
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.1.1,clientaddr=10.0.2.15'
まとめ
事象について記事はありましたがコマンドプロンプトで実行するや仮想マシンは停止しておくなど細かい注意点を記載しているサイトがありませんでした。
皆さまのお役に立てれば幸いです。