概ね、[SOLVED] nfs mount via ssh tunnelの通りですが、最近のNFSで日本語での実例がなかったので記録しておきます。
以下はCentOSでの例ですが、Debian/Ubuntu系のひとはこちらを参考にすると良いでしょう。Mount NFS Folder via SSH Tunnel
やりたいこと
生のNFSではセキュリティ上の懸念があるので、SSHポートフォワード(SSHトンネリング)越しにNFSマウントしたい。その場合、パフォーマンスや安定性の懸念があるが、小規模なのでそこは問題にならないという前提です。
NFSv4でKerberos認証との連携ができるようになったようですが とあるエンジニアの備忘log: NFSv4 + Kerberos で セキュリティとユーザーマッピングを解決、Kerberosサーバーを建てるほどではなかったので、簡易的に今回の選択をしました。
環境などの前提条件
- CentOS release 6.5 (Final)
- nfs-utils: 1.2.3
- nfs-utils-lib: 1.1.5
どちらも標準yumリポジトリからインストールしています。
webとstorageという2つのVMをVirtualbox上で動かしています。それぞれは2nd NICでInternal Networkで接続されています。storageがNFSサーバーとなり、webがNFSクライアントとなります。どちらもVagrantから起動されています。
config.vm.define :web do | web |
web.vm.hostname = "web"
web.vm.network :private_network, ip: "192.168.33.10", virtualbox__intnet: true
end
config.vm.define :storage do | storage |
storage.vm.hostname = "storage"
storage.vm.network :private_network, ip: "192.168.33.20", virtualbox__intnet: true
end
やったこと
storageサーバー
インストール
$ sudo yum install -y nfs-utils nfs-utils-lib
共有ディレクトリ作成。65534はnfsnobodyユーザー/グループを表しています。nfs-utilsを入れた際に作成されると思います、が確認してなかったです。
$ sudo mkdir -p /var/nfs
$ sudo chown 65534:65534 /var/nfs
$ sudo chmod 755 /var/nfs
/etc/exportsに以下を追加。オプションでinsecureが必要です。これは、
-
secureオプションがデフォルトであり、secureオプションは1024以上のポートからのアクセスを拒否する - 以下でクライアントからは12049と10892のポートがバインドされている
という2つの理由のためです。SSHポートフォワードを経由するので不要かと思ったんですが、ないと動きませんでした。逆に言えば、ポートフォワードでデフォルトと同じ、892と2049をバインドしてやればいらない、んじゃないかなと思います。
/var/nfs 127.0.0.1(insecure,rw,sync,no_subtree_check)
/etc/sysconfig/nfsを編集して、mountdの使用ポートを892に固定します。デフォルトでは空いているポートをランダムに使用します。
57c57
@@ -54,7 +54,7 @@
# Optional arguments passed to rpc.mountd. See rpc.mountd(8)
#RPCMOUNTDOPTS=""
# Port rpc.mountd should listen on.
-# MOUNTD_PORT=892
+MOUNTD_PORT=892
#
#
# Optional arguments passed to rpc.statd. See rpc.statd(8)
exportsの変更を反映
exportfs -a
NFSプロセスをスタート
/etc/init.d/nfs start
サーバー側は以上で全てです。iptablesはデフォルトのままなのでインバウンドはsshしか許可されていません。
webサーバー
インストール
$ sudo yum install -y nfs-utils nfs-utils-lib
SSHポートフォワード。ローカルの12049と10892をそれぞれリモートのポートにバインドしています。
$ ssh vagrant@192.168.33.20 -L 12049:127.0.0.1:2049 -NCf
$ ssh vagrant@192.168.33.20 -L 10892:127.0.0.1:892 -NCf
マウントディレクトリ作成
$ sudo mkdir -p /mnt/nfs/var/nfs
マウント
$ sudo mount -o port=12049,mountport=10892 127.0.0.1:/var/nfs /mnt/nfs/var/nfs
エラーメッセージがでなければ、無事マウントできました。nfsnobodyユーザーのディレクトリなので、nfsnobodyユーザーでファイルを操作してみます。
$ sudo -u nfsnobody touch /mnt/nfs/var/nfs/fooo
エラーがでなければ成功です。
補足
アクセスする際に毎回sudoにするのが嫌なら
アクセスする際に毎回sudoにするのが嫌であれば、/etc/exportsでのオプションにall_squashを指定すると、どのユーザーからのアクセスでもサーバー側ではnfsnobodyユーザーからの操作として認識されます。
以下のようにwebサーバーの一般ユーザーからtouchしても、
$ touch /mnt/nfs/var/nfs/fooo
lsするとnfsnobodyユーザーでの操作として記録されています。よかったですね。
$ ls -la /mnt/nfs/var/nfs/fooo
-rw-rw-r-- 1 nfsnobody nfsnobody 0 May 14 16:31 /mnt/nfs/var/nfs/fooo
exportsオプションはこちらの日本語訳がわかりやすいです。 CentOS 6 - NFSサーバーの設定 : Server World
nfsnobody以外のユーザーでファイルを操作したい
uidとgidが合っていればとくに問題ありません。例としてvagrantユーザーでファイル操作してみます。
storageサーバー
ディレクトリ作成
$ sudo mkdir /var/nfs_vagrant
$ sudo chown vagrant:vagrant /var/nfs_vagrant
作成したディレクトリをexportsに設定
$ cat /etc/exports
/var/nfs_vagrant 127.0.0.1(insecure,rw,sync,no_subtree_check)
変更を反映
$ sudo exportfs -ra
webサーバー
通常のやり方と同じです。
$ sudo mount -o port=12049,mountport=10892 127.0.0.1:/var/nfs_vagrant /mnt/nfs/var/nfs
確認してみます。
$ touch /mnt/nfs/var/nfs/bar
$ ls /mnt/nfs/var/nfs/bar
/mnt/nfs/var/nfs/bar
うまくいきました。よかったですね。
うまくいかないので詳細なログみたい
mount -vやssh -vでverboseモードになります。
参考
- ノーマルなNFSのセットアップ Setting Up An NFS Server And Client On CentOS 6.3