Linux Tips – NFSサーバのポートを固定する設定方法

Crystal_Clear_device_nfs_mount

Linux Tips – NFSサーバのポートを固定する設定方法NFSクライアントとNFSサーバの間にファイアウォールを設置する構成では、ファイアウォールで通信許可の設定を行う都合上、NFSサーバの使用する全てのポートを固定する必要があります。ここでは、そのようなケースに対して有効な設定方法を紹介します。

例えば、インターネットから利用される一般的なシステムでは、「DMZ」を構成するために、Webサーバ等の公開サーバ(=NFSクライアント)を配置するネットワークセグメントと、NFSサーバを配置するネットワークセグメントの間に、ファイアウォール もしくは それを代替する機能を持つネットワーク機器を配置します。このようなシステム構成で有効な設定方法です。

Linux NICFirewallLinux NIC
NFS Client
in DMZ
FirewallNFS Server

RHEL6系の設定方法

設定手順
  • /etc/sysconfig/nfs ファイルの設定
  • /etc/sysconfig/nfs をvi等で開いて、以下の設定例に従ってポート番号を指定する。

    # vi /etc/sysconfig/nfs
    
  • /etc/sysconfig/nfs ファイルの設定例
  • RHEL6系のNFSサーバにはポート固定用の設定が用意されているが、デフォルト設定ではコメントアウトされているので、ポート番号を固定する項目のコメントを外して有効にする。

    # Port rquotad should listen on.
    RQUOTAD_PORT=875
    # TCP port rpc.lockd should listen on.
    LOCKD_TCPPORT=32803
    # UDP port rpc.lockd should listen on.
    LOCKD_UDPPORT=32769
    # Port rpc.mountd should listen on.
    MOUNTD_PORT=892
    # Port rpc.statd should listen on.
    STATD_PORT=662
    # Outgoing port statd should used. The default is port
    # is random
    STATD_OUTGOING_PORT=2020
    # To enable RDMA support on the server by setting this to
    # the port the server should listen on
    RDMA_PORT=20049
    
  • 設定の反映
  • nfslockサービス・nfsサービスを再起動して、設定を反映する。

    # service nfslock restart
    # service nfs restart
    
  • ポート番号の確認
  • rpcinfoコマンドを用いてNFSサーバが使用しているポート番号を確認する。

    # rpcinfo -p
    
  • ポート番号の確認(実行結果例)
  • # 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    662  status
        100024    1   tcp    662  status
        100011    1   udp    875  rquotad
        100011    2   udp    875  rquotad
        100011    1   tcp    875  rquotad
        100011    2   tcp    875  rquotad
        100003    2   tcp   2049  nfs
        100003    3   tcp   2049  nfs
        100003    4   tcp   2049  nfs
        100227    2   tcp   2049  nfs_acl
        100227    3   tcp   2049  nfs_acl
        100003    2   udp   2049  nfs
        100003    3   udp   2049  nfs
        100003    4   udp   2049  nfs
        100227    2   udp   2049  nfs_acl
        100227    3   udp   2049  nfs_acl
        100021    1   udp  32769  nlockmgr
        100021    3   udp  32769  nlockmgr
        100021    4   udp  32769  nlockmgr
        100021    1   tcp  32803  nlockmgr
        100021    3   tcp  32803  nlockmgr
        100021    4   tcp  32803  nlockmgr
        100005    1   udp    892  mountd
        100005    1   tcp    892  mountd
        100005    2   udp    892  mountd
        100005    2   tcp    892  mountd
        100005    3   udp    892  mountd
        100005    3   tcp    892  mountd
    
  • ファイアウォール等への通信許可設定
  • 上記のポート番号の情報を元にファイアウォールやiptablesで通信許可の設定を行う。(*2)

RHEL4・RHEL5系の設定方法

設定手順
  • /etc/sysconfig/nfs ファイルの作成
  • /etc/sysconfig/nfs を作成して、以下の設定例に従ってポート番号を指定する。

    # vi /etc/sysconfig/nfs
    
  • /etc/sysconfig/nfs ファイルの設定例(*1)
  • ### NFS port numbers ###
    # rpc.statd
    STATD_PORT=10002
    STATD_OUTGOING_PORT=10003
    # rpc.mountd
    MOUNTD_PORT=10004
    # rpc.rquotad
    RQUOTAD_PORT=10005
    # nlockmgr
    LOCKD_UDPPORT=10001
    LOCKD_TCPPORT=10001
    
  • 設定の反映
  • nfslockサービス・nfsサービスを再起動して、設定を反映する。

    # service nfslock restart
    # service nfs restart
    
  • ポート番号の確認
  • rpcinfoコマンドを用いてNFSサーバが使用しているポート番号を確認する。

    # rpcinfo -p
    
  • ポート番号の確認(実行結果例)
  • # rpcinfo -p
       program vers proto   port
        100000    2   tcp    111  portmapper
        100000    2   udp    111  portmapper
        100021    1   udp  10001  nlockmgr
        100021    3   udp  10001  nlockmgr
        100021    4   udp  10001  nlockmgr
        100021    1   tcp  10001  nlockmgr
        100021    3   tcp  10001  nlockmgr
        100021    4   tcp  10001  nlockmgr
        100024    1   udp  10002  status
        100024    1   tcp  10002  status
        100011    1   udp  10005  rquotad
        100011    2   udp  10005  rquotad
        100011    1   tcp  10005  rquotad
        100011    2   tcp  10005  rquotad
        100003    2   udp   2049  nfs
        100003    3   udp   2049  nfs
        100003    4   udp   2049  nfs
        100003    2   tcp   2049  nfs
        100003    3   tcp   2049  nfs
        100003    4   tcp   2049  nfs
        100005    1   udp  10004  mountd
        100005    1   tcp  10004  mountd
        100005    2   udp  10004  mountd
        100005    2   tcp  10004  mountd
        100005    3   udp  10004  mountd
        100005    3   tcp  10004  mountd
    
  • ファイアウォール等への通信許可設定
  • 上記のポート番号の情報を元にファイアウォールやiptablesで通信許可の設定を行う。(*2)

参考情報

(*1)割り当て可能なポート番号

割り当てるポート番号は、未使用のHigh Portから任意のものを指定することが可能。ただし、指定されたポートが既に使用されていた場合には、nfslock、nfsの起動時にエラーとなるので注意する。

<例> nlockmgr(lockd) がポート重複で起動に失敗した際のシスログ

lockd_up: makesock failed, error=-98
lockd_up: no pid, 2 users??
lockd_up: no pid, 3 users??
...
(*2)ファイアウォール製品の設定

ファイアウォール製品(Juniper Networks NetScreen等)によっては、デフォルトで「tcp/udp 111番」、「tcp/udp 2049番」ポートが「NFS」のサービスとして定義されている。その場合、ACLを設定する際には、これ以外のポートを「NFS-BoundToParticularPorts」等の名称でグループ化して、ACLには「NFS」と「NFS-BoundToParticularPorts」への通信を許可する設定を追加すれば良い。
 

実際に使用されるポート

実際には、普通にNFSマウントをしてNFS上のファイルを使用してるRHEL4の環境では、tcp 111番(portmapper)、tcp 2049番(nfs)、udp 10004番(mountd)の通信しか発生しない。さらには、tcp 111番(portmapper)、udp 10004番(mountd)もほとんど使われず、NFSサーバやNFSクライアントの再起動を行うタイミング等で少量の通信が発生する程度である。

本設定やネットワークの検証を必死になって行っても、結果的にあまり報われない可能性もあるので、力の掛け具合には注意した方が良い。
 

パフォーマンス影響の確認

性能を求められるシステムで設定変更を行う場合には、本設定の適用後にNFS領域のパフォーマンスが低下していないことを確認する。設定変更の前後に、NFSクライアントとなるサーバからNFS領域に対して ディスクベンチマーク を実行すれば良い。

関連記事

Iperfの使用方法 (Linuxネットワーク帯域確認方法)
HDDベンチマーク手順+性能測定結果一覧 (hdparm,dd,bonnie++)
 
「Linux」カテゴリーの記事一覧

参考になるサイト

Red Hat Customer Portal – How can I configure a system as an NFSv3 server which sits behind a firewall with NFS clients outside of the firewall?
RedHat社のカスタマーポータルで公開されている設定方法。(要サブスクリプション)