*

* Tips   * Top

ファイアウォール(Firewall)を越えてNFSマウントしたい

たとえば部署間をまたがって、 ファイアウォール(Firewall)を越えてディスクをNFSでマウント しなければならないなんてことが起こりました (通常はないと思うのですが‥‥)。 通常、NFSを使用するときはポートマッパが空いているポートを 自動的に割り当てるので、使用するポートが定まらず、浮動になります。 そんなとき、NFSとファイアウォールにどんな設定をするといいでしょう‥‥?

(ご注意) このページをご利用になった結果の影響については、 一切責任を負いませんので、あらかじめご了承願います。

  1. ファイアウォール越しにNFSでディスクのマウントをするには、 NFSで使用するポートを固定させ、そのポートのみをオープンすることで、 ファイアウォールにあける穴を最小限にとどめることができます。 それでもかなり大きな穴が開いてしまいますが、 NFSでマウントをする以上は仕方がありません。 用途にもよると思いますが、かわりといえば、Windowsのファイル共有(137-139)を オープンさせるくらいしか見つからないのではないでしょうか‥‥?

  2. まず、NFSを使用するためには、 portmapper, nfsd, statd, mountd, lockd 等を起動する必要があります。 このうち、portmapper(111)とnfsd(2049)はポートが固定されていますが、 statd, mountd, lockdがどのポートを使用するかはportmapper頼みで、 使用ポートがどこに割り当てられるかわかりません。

  3. カーネル2.4.13以降とnfs-utils 0.3.3以降を組み合わせて使用することで、 これらを固定したポートで使用することができます。 それぞれのバージョンには気をつけてください。 私は、Vine Linux 2.6r4を使用していますが、 nfs-utilsのバージョンが0.3.1だったので アップデートする必要がありました。

  4. statdの設定
    /etc/rc.d/init.d/nfslockを編集します。rpc.statdを起動するところで、
    daemon rpc.statd -p 32771 -o 32772
    のように、ポート番号を指定します。 このとき、rpc.statdの受信用のポート(-p)と、 ステータスを外向きに送出するリクエストを受けるポート(-o)との 両方を指定します。

  5. mountdの設定
    /etc/rc.d/init.d/nfsを編集します。rpc.mountdを起動するところで、
    daemon rpc.mountd $RPCMOUNTDOPTS -p 32773
    のように、-pオプションの次にポート番号を指定します。

  6. lockdの設定
    lockdは、カーネルに組み込まれているようです。 このためlockdのポートの指定は、カーネルのブート時に渡します。 例えばliloを使っている場合は、lilo.confのなかで 目的のカーネルの箇所に、
    append="lockd.udpport=32774 lockd.tcpport=32774"
    などを追加します、root=/dev/‥‥の次の行くらいでいいでしょう。 追加したあとは、liloコマンドを使用して ブートセクタへ書き込むことを忘れないでください。
    lilo -v -b /dev/‥‥ -C /etc/lilo.conf

  7. さて、これで無事に終了です。OSを再起動します。 再起動後、rpcinfo -pで、状態を確認します。
      プログラム バージョン プロトコル ポート
        100000    2   tcp    111  portmapper
        100000    2   udp    111  portmapper
        100024    1   udp  32771  status
        100024    1   tcp  32771  status
        100003    2   udp   2049  nfs
        100003    3   udp   2049  nfs
        100021    1   udp  32774  nlockmgr
        100021    3   udp  32774  nlockmgr
        100021    4   udp  32774  nlockmgr
        100005    1   udp  32773  mountd
        100005    1   tcp  32773  mountd
        100005    2   udp  32773  mountd
        100005    2   tcp  32773  mountd
        100005    3   udp  32773  mountd
        100005    3   tcp  32773  mountd
    NFSに関係するポートが、指定したポートへ割り当てられていることが 確認できると思います。

  8. OSの起動時に不幸にもこのようなメッセージが出る場合があります。
    nfs: Starting NFS services:  succeeded
    kernel: lockd_up: makesock failed, error=-98
    kernel: lockd_up: no pid, 2 users??
    kernel: lockd_up: no pid, 3 users??
    kernel: lockd_up: no pid, 4 users??
    kernel: lockd_up: no pid, 5 users??
    kernel: lockd_up: no pid, 6 users??
    kernel: lockd_up: no pid, 7 users??
    kernel: lockd_up: no pid, 8 users??
    nfs: rpc.nfsd startup succeeded
    nfs: rpc.mountd startup succeeded
    これは割り当てたポートが既に使用中の可能性があります。 lockd以外は起動しているので、ついつい そのまま使えそうな気もしてしまうのですが、 ファイルのロックが正しくできないので 排他するような開き方をするとうまく動作しません。 (nfsでマウントしたディスクをsambaなどでWindowsへ見せて、 WordやExcelでファイルを開くなどすると、 待てど暮らせどなかなか開いてこないのですぐにわかります)。 この場合は、使用ポートを変更して再度トライしてください。

  9. NFSが固定ポートで正常に動作しているのを確認できれば、 あとはファイアウォールのポリシーを設定します。今回の場合では、 111, 2049, 32771〜32774を使用していますので、それらを 通過できるようにします。

  10. 参考文献
    http://www.linux.or.jp/JF/JFdocs/NFS-HOWTO/security.html


shacho@critical.ne.jp
Last modified: Sun Mar 07 15:50:00 JST 2004