NFSで利用するポートを固定する

2010/03/24PC::Linux/BSD

NFSサーバーのポートの固定をしたときのメモ。

環境

  • Debian GNU/Linux 4.0/i386
    • Kernel 2.6.18-6-686
    • nfs-kernel-server 1.1.0.10-6+etch.1

NFSが利用するポート

NFSが利用するポートは以下の通り。

  • portmapper: 111/tcp, 111/udp
  • nfs: 2049/tcp, 2049/udp
  • statd: 不定/tcp, 不定/udp
  • nlockmgr: 不定/tcp, 不定/udp
  • mountd: 不定/tcp, 不定/udp

上記のように、nlockmgr, statd, mountdが利用するポートは不定の為、iptablesでルールを記述することができません。ですので、iptablesを用いたセキュアな環境を構築するためにはこれらのポートを固定する必要があります。

NFSのポートを固定する

statdの固定

/etc/default/nfs-common

# If you do not set values for the NEED_ options, they will be attempted
# autodetected; this should be sufficient for most people. Valid alternatives
# for the NEED_ options are "yes" and "no".

# 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 49152 --outgoing-port 49155"

# Some kernels need a separate lockd daemon; most don't. Set this if you
# want to force an explicit choice for some reason.
NEED_LOCKD=

# Do you want to start the idmapd daemon? It is only needed for NFSv4.
NEED_IDMAPD=

# Do you want to start the gssd daemon? It is required for Kerberos mounts.
NEED_GSSD=

STATDOPTSのパラメータ指定で入力側ポートと出力側ポートを指定します。
上記の例では入力に両方でプライベートポート*1である49152を、出力にも49155を指定しています。*2

nlockmgrの利用するポートの固定

/etc/modprobe.d/options.local
このファイルは用意されていないので、作成する必要があります。混乱を避けるためにあえて私は新規に作成していますが、modprobe.confに記述してもよいかと。

options lockd nlm_udpport=49153 nlm_tcpport=49153

新規に作成、もしくは既存のmodprobe.confに上記を記述します。上記の例ではnlockmgrの利用するポートを49153/tcp, 49153/udpを指定しています。

mountdの使用するポートの固定

/etc/init.d/nfs-kernel-server

  • 中略-
log_progress_msg "mountd" start-stop-daemon --start --oknodo --quiet --exec $PREFIX/sbin/rpc.mountd -- $RPCMOUNTDOPTS -p 49154 if [ $? != 0 ]; then
  • 後略-

nfs-kernel-serverの起動スクリプト中でポート番号の指定を書き加えます。
上記の例では49154番ポートを利用するように指定しています。

*1 : 49152~65535

*2 : 同じポートを指定すると正常に動作しない

確認する

設定が完了したら、nfs-kernel-serverの場合nlockmgrのポートの選定は起動時に行われるため、再起動が必要です*3。再起動後に、以下のコマンドでどのポートが利用されているかを確認することができます。

# rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100021    1   udp  49153  nlockmgr
    100021    3   udp  49153  nlockmgr
    100021    4   udp  49153  nlockmgr
    100021    1   tcp  49153  nlockmgr
    100021    3   tcp  49153  nlockmgr
    100021    4   tcp  49153  nlockmgr
    100024    1   udp  49152  status
    100024    1   tcp  49152  status
    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  49154  mountd
    100005    1   tcp  49154  mountd
    100005    2   udp  49154  mountd
    100005    2   tcp  49154  mountd
    100005    3   udp  49154  mountd
    100005    3   tcp  49154  mountd

参考

*3 : nfs-user-serverではどうだかわかりません