web-dev-qa-db-ja.com

NFSエクスポートマウントでautofsを使用するファイアウォールの問題

ローカルネットワークマシンで正常に機能するNFSサーバー/クライアントシステムをセットアップしました。大好きです!

しかし、起動時にマウントが利用できない場合の長い遅延にうんざりしていたので、代わりにautofsを使用して共有をマウントするという彼の提案を@ridgyに取り上げることにしました- この投稿

以前にファイアウォールの問題があったので、すぐにufwがマウントのタイムアウトの原因であると疑った。そこで、サーバーとクライアントでufwを無効にしました。そして、確かに。これにより、autofsが正常に機能するようになりました。したがって、基本構成は正しいと確信しています。

この時点でufwにある他のルールは、ポート2078および6589のALLOWルールのみです。BLOCKルールは設定されていません。また、NFSはfstabで制御されたマウント中にufwをオンにして正常に動作するため、ブロックが発生している場所について少し混乱しています。

これまでのところ、通常のNFS 111,2049 TCP/UDP以外に、どのポート/プロトコルがautofsに固有であるかに関するドキュメントを見つけていません。

Ufwを再度有効にするたびに。共有に再びアクセスできなくなります。

何か案は?


@ridgy

以下のアドバイスに従って、nfs-commonとnfs-kernel-serverを編集した後、トリプルチェックを行い、編集は示されているとおりに行われました。再起動して実行しました...

$Sudo netstat -nalp | grep rpc...出力は;

tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1220/rpcbind    
tcp        0      0 0.0.0.0:32767           0.0.0.0:*               LISTEN      4158/rpc.mountd 
tcp6       0      0 :::111                  :::*                    LISTEN      1220/rpcbind    
tcp6       0      0 :::32767                :::*                    LISTEN      4158/rpc.mountd 
udp        0      0 0.0.0.0:972             0.0.0.0:*                           1220/rpcbind    
udp        0      0 0.0.0.0:32767           0.0.0.0:*                           4158/rpc.mountd 
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1220/rpcbind    
udp6       0      0 :::972                  :::*                                1220/rpcbind    
udp6       0      0 :::32767                :::*                                4158/rpc.mountd 
udp6       0      0 :::111                  :::*                                1220/rpcbind    
unix  2      [ ACC ]     STREAM     LISTENING     15939    1/init              /run/rpcbind.sock
unix  2      [ ]         DGRAM                    49175    4158/rpc.mountd     
unix  3      [ ]         STREAM     CONNECTED     48294    1220/rpcbind        /run/rpcbind.sock
unix  3      [ ]         STREAM     CONNECTED     16984    1220/rpcbind        
unix  3      [ ]         STREAM     CONNECTED     48275    4157/rpc.idmapd     
unix  3      [ ]         STREAM     CONNECTED     48276    4157/rpc.idmapd 

OK ...だから、私は疑問に思う... rpc.statdはどこにあるのか???また、クライアントからNFS共有(autofsはまだ無効になっています)が表示されたままです。ファイアウォールは新しいrpc.mountdポート32767で更新されていませんでしたが。

2
Orian

最終的には、それほど複雑ではなく、 Securing NFS のヒントに従っています。ファイル/etc/default/nfs-commonおよび/etc/default/nfs-kernel-serverを次のように変更しました。

nfs-common:

.
.
# Options for rpc.statd.
#   Should rpc.statd listen on a specific port? This is especially useful
#   when you have a port-based firewall. To use a fixed port, set this
#   this variable to a statd argument like: "--port 4000 --outgoing-port 4001".
#   For more information, see rpc.statd(8) or http://wiki.debian.org/SecuringNFS
STATDOPTS="--port 32765 --outgoing-port 32766"
.
.

nfs-kernel-server:

.
.
# Options for rpc.mountd.
# If you have a port-based firewall, you might want to set up
# a fixed port here using the --port option. For more information,
# see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS
# To disable NFSv4 on the server, specify '--no-nfs-version 4' here
RPCMOUNTDOPTS="--manage-gids --port 32767"
.
. 

なぜこれらのポートですか? 32767は最高の15ビット数であるため、これらのポートが他の何かによってすでに使用されている可能性はほとんどありません。

クォータを使用していないため、/etc/default/quotaを提案どおりに変更しませんでした。そして、これらの変更を行った後に再起動する必要がありました。その後、私は結果を見ました

$ Sudo netstat -nalp | grep rpc

tcp        0      0 0.0.0.0:32767           0.0.0.0:*               LISTEN      1018/rpc.mountd 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      735/rpcbind     
tcp        0      0 0.0.0.0:32765           0.0.0.0:*               LISTEN      806/rpc.statd   
tcp6       0      0 :::32767                :::*                    LISTEN      1018/rpc.mountd 
tcp6       0      0 :::111                  :::*                    LISTEN      735/rpcbind     
tcp6       0      0 :::32765                :::*                    LISTEN      806/rpc.statd   
udp        0      0 0.0.0.0:875             0.0.0.0:*                           735/rpcbind     
udp        0      0 127.0.0.1:982           0.0.0.0:*                           806/rpc.statd   
udp        0      0 0.0.0.0:32765           0.0.0.0:*                           806/rpc.statd   
udp        0      0 0.0.0.0:32767           0.0.0.0:*                           1018/rpc.mountd 
udp        0      0 0.0.0.0:111             0.0.0.0:*                           735/rpcbind     
udp6       0      0 :::875                  :::*                                735/rpcbind     
udp6       0      0 :::32765                :::*                                806/rpc.statd   
udp6       0      0 :::32767                :::*                                1018/rpc.mountd 
udp6       0      0 :::111                  :::*                                735/rpcbind     
unix  2      [ ACC ]     STREAM     LISTENING     11412    735/rpcbind         /run/rpcbind.sock
unix  2      [ ]         DGRAM                    9521     806/rpc.statd       
unix  2      [ ]         DGRAM                    9614     1018/rpc.mountd     
unix  3      [ ]         STREAM     CONNECTED     11721    862/rpc.idmapd      
unix  3      [ ]         STREAM     CONNECTED     11722    862/rpc.idmapd      

ご覧のとおり、rpc.mountdおよびrpc.statdがリッスンしているポートは静的です。

クライアントでshowmountと入力すると(ここでは192.168.192.20)、Wiresharkは通信を表示します(サーバーは192.168.192.111)。ここで重要:GETPORT CallおよびGETPORT replyを返すPort:32767。通信では、このポートが使用されます。

enter image description here これで、ファイアウォールルールを変更できるようになり、showmountおよびautofsをファイアウォール経由で使用できるようになります。

レコードのみ

コメントのヒントと私自身の経験から、ディストリビューションごとに異なる動作を発見しました。

  • 現在のraspbian jessiedebianに基づく)には、サービスnfs-common(ファイル/etc/init.d/nfs-common)があります。 rpc.statdのポート設定を尊重して、ブート時に/etc/default/nfs-common
  • 現在のUbuntu 16.04には、そのようなサービスはありません。 NFS V4では必要ないため、rpc.statdは起動時に開始されません。しかし、mount .... -o nfsvers=3が完了すると、rpc.statdのポート設定を尊重して、/etc/default/nfs-commonが開始されます。

私はそれに関する一貫した文書を見つけられませんでした。 in NFSの構成方法 ファイル/etc/init.d/nfs-commonが明示的に言及されていますが、パッケージにはnotがあります。誰かがそれについてのヒント/リンクを持っている場合、それは豊かに値するでしょう。

もう1つのコメント:man rpc.mountdおよびman rpc.statd say(オプション--portの場合):

「このオプションが指定されていない場合、rpc.statdは/ etc/servicesを参照しようとします。ポートが成功した場合、すべてのリスナーソケットに同じポートを設定します。

/etc/servicesでポートを設定しても(上記のwikiで提案されているように)、これは機能しませんでした。したがって、/etc/defaultのファイルを変更することは必須のようです-その時点でmanページは正しくありません。

2
ridgy