web-dev-qa-db-ja.com

NFSクライアントのマウントがファイアウォールの背後で失敗する

Iptablesファイアウォールを備えたUbuntu 11.10システムを使用しています。 mountd、lockd、statdのポートを固定し、それらをiptablesで開いた後、ファイアウォールを介してNFS共有を問題なく公開できます。

私が問題を抱えているのは、自分が制御できない別のNFSサーバーから共有をマウントすることです。ファイアウォールを無効にすると、マウントできます共有になります。他のNFS共有をマウントすることもできますなしファイアウォールを無効にします。

それで私は2つの質問につながります:

  • ファイアウォールがNFSクライアントによるサーバーのマウントを妨げるのはなぜですか?
  • クライアントはNFSマウントに使用するポートを指定できますか?

完全な設定とエラー情報:

nfsstatによると、サーバーはNFSv3です。マウントするとき:

# mount -t nfs -v 192.168.80.48:/location /mnt/tmp
mount.nfs: timeout set for Fri Mar 23 09:13:00 2012
mount.nfs: trying text-based options 'vers=4,addr=192.168.80.48,clientaddr=192.168.40.173'
mount.nfs: mount(2): No such file or directory
mount.nfs: trying text-based options 'addr=192.168.80.48'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.80.48 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.80.48 prog 100005 vers 3 prot UDP port 678
mount.nfs: portmap query retrying: RPC: Timed out
mount.nfs: prog 100005, trying vers=3, prot=6
mount.nfs: trying 192.168.80.48 prog 100005 vers 3 prot TCP port 681
mount.nfs: portmap query failed: RPC: Remote system error - Connection timed out

パケットがドロップされているのがわかります。

Rejected packets: SRC=192.168.80.48 DST=192.168.40.173 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=681 DPT=40325 WINDOW=5792 RES=0x00 ACK SYN URGP=0
Rejected packets: SRC=192.168.80.48 DST=192.168.40.173 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=681 DPT=47419 WINDOW=5792 RES=0x00 ACK SYN URGP=0
Rejected packets: SRC=192.168.80.48 DST=192.168.40.173 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=681 DPT=41238 WINDOW=5792 RES=0x00 ACK SYN URGP=0

showmountも同様に失敗します。冗長なmountプリントから、portmapが問題であるように見えますが、私はそれを開いています。

# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  32765  status
    100024    1   tcp  32765  status
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049
    100227    3   tcp   2049
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049
    100227    3   udp   2049
    100021    1   udp   4002  nlockmgr
    100021    3   udp   4002  nlockmgr
    100021    4   udp   4002  nlockmgr
    100021    1   tcp   4001  nlockmgr
    100021    3   tcp   4001  nlockmgr
    100021    4   tcp   4001  nlockmgr
    100005    1   udp  32767  mountd
    100005    1   tcp  32767  mountd
    100005    2   udp  32767  mountd
    100005    2   tcp  32767  mountd
    100005    3   udp  32767  mountd
    100005    3   tcp  32767  mountd

# cat /etc/services
sunrpc          111/tcp         portmapper      # RPC 4.0 portmapper
sunrpc          111/udp         portmapper
nfs             2049/tcp                        # Network File System
nfs             2049/udp                        # Network File System

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:sunrpc
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ntp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:netbios-ns
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:netbios-dgm
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:netbios-ssn
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:Microsoft-ds
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:nfs
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:sunrpc
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:3260
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:32765
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:32766
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:32767
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:4001
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
ACCEPT     udp  --  anywhere             anywhere            udp dpt:sunrpc
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ntp
ACCEPT     udp  --  anywhere             anywhere            udp dpt:netbios-ns
ACCEPT     udp  --  anywhere             anywhere            udp dpt:netbios-dgm
ACCEPT     udp  --  anywhere             anywhere            udp dpt:netbios-ssn
ACCEPT     udp  --  anywhere             anywhere            udp dpt:https
ACCEPT     udp  --  anywhere             anywhere            udp dpt:Microsoft-ds
ACCEPT     udp  --  anywhere             anywhere            udp dpt:nfs
ACCEPT     udp  --  anywhere             anywhere            udp dpt:4002
ACCEPT     udp  --  anywhere             anywhere            udp dpt:32765
ACCEPT     udp  --  anywhere             anywhere            udp dpt:32766
ACCEPT     udp  --  anywhere             anywhere            udp dpt:32767
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:domain
ACCEPT     udp  --  anywhere             anywhere            udp spt:domain
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:sunrpc
ACCEPT     udp  --  anywhere             anywhere            udp spt:sunrpc
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:netbios-ssn
ACCEPT     udp  --  anywhere             anywhere            udp spt:netbios-ssn
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:https
ACCEPT     udp  --  anywhere             anywhere            udp spt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:Microsoft-ds
ACCEPT     udp  --  anywhere             anywhere            udp spt:Microsoft-ds
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:submission
ACCEPT     udp  --  anywhere             anywhere            udp spt:submission
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:nfs
ACCEPT     udp  --  anywhere             anywhere            udp spt:nfs
3
JoeFish

sysctlには、接続に使用できるNFSポート範囲を定義する設定があります。

sunrpc.max_resvport = 1023

sunrpc.min_resvport = 650

これらの設定は、RPC接続(NFS)の作成に使用する最高および最低のポートを定義します

これらのポートを開くか、システムに応じて異なる範囲を定義できます。ファイアウォールまたはそのポートを使用する別のサービスによってブロックされているポートを使用しようとすると、拒否されます。

編集:

この範囲を増減することもできます。 fstabに460のNFSマウントが定義されているサーバーがありますが、372程度で失敗します。失敗したマウントの1つを手動でマウントすると、マウントされますが、動作しているマウントの1つはマウント解除されます。私はこの範囲を150増やし、それらはすべてマウントされました。これはそれを行うための最良の方法ではありません。 automounterが思い浮かびますが、機能します。

変更を加えるには、/etc/sysctl.confを編集して次のような行を追加します。

sunrpc.min_resvport = 900

それらを変更する必要がある場合に変更を永続的にするには。 1024を超える場合、これらは「非特権」ポートであり、通常のシステムユーザーは-1024にアクセスできることに注意してください。

編集2:

NFSマウントコマンドで、以下を追加できます。

proto=tcp-マウントがTCP/IPを使用するように強制します

public-portmapperを完全にバイパスし、特に指定のない限り、ポート2049でNFSサーバーに接続します

したがって、mount nfs.test.com:/export /test

なる

mount -o proto=tcp ,public nfs.test.com:/export /test

EDIT 3

了解しました! root@pressyrluck # ./nowhammies > /dev/please

この情報はliftedcopiedswipedborrowed from Sourceforge NFS でした

Nfsを介したデータの共有に関与するデーモンの一部は、すでにポートにバインドされています。 portmapは常にポート111 tcpおよびudpにあります。 nfsdは常にポート2049にありますTCPおよびUDP(ただし、カーネル2.4.17以降、NFS over TCP=マシン)。

他のデーモン、statd、mountd、lockd、およびrquotadは、通常、ポートマッパーによって通知された最初の使用可能なポートに移動します。

Statdを特定のポートに強制的にバインドするには、-p portnumオプションを使用します。 statdを特定のポートで強制的に応答させるには、起動時に-o portnumオプションを追加で使用します。

Mountdを特定のポートにバインドさせるには、-p portnumオプションを使用します。

たとえば、ポート32765のstatdブロードキャストをポート32766でリッスンし、mountdをポート32767でリッスンするには、次のように入力します。

# statd -p 32765 -o 32766
# mountd -p 3276

lockdは、必要なときにカーネルによって開始されます。したがって、モジュールオプション(モジュールとしてビルドされている場合)またはカーネルオプションを渡して、lockdが特定のポートでのみリッスンして応答するように強制する必要があります。

ロード可能なモジュールを使用していて、/ etc/modules.confファイルでこれらのオプションを指定する場合は、ファイルに次のような行を追加します。

options lockd nlm_udpport=32768 nlm_tcpport=32768

この説明のために、ネットワークについて説明し、NFSサーバーを保護するためのファイアウォールをセットアップします。 nfsサーバーは192.168.0.42で、クライアントは192.168.0.45のみです。上記の例のように、statdは開始され、着信要求の場合はポート32765にのみバインドし、ポート32766で応答する必要があります。mountdは強制的にポート32767にバインドします。lockdのモジュールパラメータは32768にバインドするように設定されています。nfsdもちろん、ポート2049にあり、ポートマッパーはポート111にあります。

クォータは使用していません。

iptables -A INPUT -f -j ACCEPT -s 192.168.0.45
iptables -A INPUT -s 192.168.0.45 -d 0/0 32765:32768 -p 6 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 32765:32768 -p 17 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 2049 -p 17 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 2049 -p 6 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 111 -p 6 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 111 -p 17 -j ACCEPT
iptables -A INPUT -s 0/0 -d 0/0 -p 6 -j DENY --syn --log-level 5
iptables -A INPUT -s 0/0 -d 0/0 -p 17 -j DENY --log-level 5

最初の行は、すべてのパケットフラグメントを受け入れるように指示しています(通常のパケットとして扱われる最初のパケットフラグメントを除く)。理論的には、再構成されるまでパケットは通過しません。また、最初のパケットフラグメントが渡されない限り、再構成されません。もちろん、パケットフラグメントでマシンをオーバーロードすることによって生成できる攻撃があります。ただし、フラグメントを通過させない限り、NFSは正しく機能しません。詳細については、セクション7「トラブルシューティング」を参照してください。

他の行では、クライアントホストの任意のポートから、サーバーで利用可能にした特定のポートへの特定の接続を許可します。これは、たとえば、192.158.0.46がNFSサーバーに接続しようとした場合、マウントできないか、使用可能なマウントを確認できないことを意味します。

新しいポート固定機能を使用すると、NFS共有のマウントを許可するホストを制御するのがはるかに簡単になります。 NFSは暗号化されたプロトコルではなく、同じ物理ネットワーク上の誰もがトラフィックを傍受し、やり取りされる情報を再構成する可能性があることは言及する価値があります。

5