访问/挂载远程 NFS 服务器的 iptables 规则

访问/挂载远程 NFS 服务器的 iptables 规则

实际上,当 iptables 规则未清除时,尝试挂载远程 NFS 共享会因超时而失败。重置 iptables 规则后,我可以正确安装 NFS 远程服务器。

允许访问远程 NFS 服务器的 iptables 规则是什么?

我用作rw,_netdev,mountproto=tcp安装选项。

答案1

如果您使用的是 NFSv4,则唯一需要允许的端口是 2049/TCP(或 SCTP,如果两端都支持并且您选择使用它)。

所以客户端的 iptables 规则是:

-A INPUT -s <NAS_SERVER_IP_ADDR>/32 -p tcp --sport 2049 -j ACCEPT
-A OUTPUT -d <NAS_SERVER_IP_ADDR>/32 -p tcp --dport 2049 -j ACCEPT

如果使用 NFSv3 或更早版本,您将需要允许许多其他端口:

  • 端口 111(portmapperrpcbind)、TCP 和/或 UDP。
  • NFS 文件锁定服务的端口(lockdnlockmgr),通常为 4045,但可能有所不同
  • 用于 NFS 状态/恢复服务的端口 ( rpc.statd)
  • NFS 安装守护程序的端口 ( rpc.mountd)

后三个的问题在于,过去这些端口号通常是动态分配的,端口 111 中的portmapper/rpcbind服务用于定位它们。这使得设置防火墙变得很困难,因此现代 Linux 系统将允许为这些服务配置固定端口号。其中大部分需要在NFS服务器端进行配置,但rpc.statd需要同时位于 NFS 客户端和服务器上。

在Linux上,文件锁定服务通常由lockd内核模块处理,因此其端口配置采用内核模块选项的形式。如果您的发行版尚未包含更具体的配置方法,您始终可以创建一个文件/etc/modprobe.d/nfs-options.conf并在其中键入以下行:

options lockd nlm_udpport=4045 nlm_tcpport=4045

(至少 HP-UX 11.31 和 Solaris 默认使用端口 4045 进行 NFS 锁定,因此这是标准化端口号 4045 的另一个原因。)

如果您希望 NFS 安装能够正常处理服务器或客户端重新启动,那么允许rpc.statdNFSv3 或 NFSv2 设置至关重要。了解您的发行版如何启动守护进程,如果没有更具体的方法来执行此操作,请添加-p 4046rpc.statd用于启动守护进程的命令行以使其使用固定端口号。

rpc.mountd是 NFSv3 或 NFSv2 的另一项重要服务。还可以通过添加-p 4047到启动守护程序的命令行来将其配置为使用固定端口,除非您的发行版有更具体的方法来配置 NFS 服务。由于您已经指定了mountproto=tcp挂载选项,因此无需覆盖 UDP 情况。

RedHat 将所有 NFS 端口设置集中到位于/etc/sysconfig/network.在 RHEL 和相关发行版中,您只需将这些行添加到即可实现所有这些设置/etc/sysconfig/network

LOCKD_TCPPORT=4045
LOCKD_UDPPORT=4045
STATD_PORT=4046
MOUNTD_PORT=4047

在 Debian 及其相关产品上,您可以通过设置变量来指定rpc.statd文件中的端口:/etc/default/nfs-commonSTATDOPTS

STATDOPTS="-p 4046"

rpc.mountd同样,您可以通过设置以下RPCMOUNTDOPTS变量来配置端口号/etc/default/nfs-kernel-server

RPCMOUNTDOPTS="-p 4047"

经过这些配置后,必要的 NFS 客户端 iptables 规则将是:

-A INPUT -s <NAS_SERVER_IP_ADDR>/32 -p tcp --dport 111 -j ACCEPT # incoming portmapper requests
-A INPUT -s <NAS_SERVER_IP_ADDR>/32 -p tcp --sport 2049 -j ACCEPT # incoming NFS protocol
-A INPUT -s <NAS_SERVER_IP_ADDR>/32 -p tcp --dport 4046 -j ACCEPT # for reboot detection and file lock recovery
-A OUTPUT -d <NAS_SERVER_IP_ADDR>/32 -p tcp --dport 111 -j ACCEPT # outgoing portmapper requests
-A OUTPUT -d <NAS_SERVER_IP_ADDR>/32 -p tcp --dport 2049 -j ACCEPT # main NFS port
-A OUTPUT -d <NAS_SERVER_IP_ADDR>/32 -p tcp --dport 4045:4047 -j ACCEPT # lockd, statd, mountd

如您所见,NFSv4 比 NFSv3 及更早版本更容易通过防火墙。

实际上,您可能希望避免使用 NFSv2,因为它固有的文件大小限制为 2 GB,这对于许多现代用途来说太小了。

答案2

解决方案是在文件中添加 2 行/etc/iptables.rules

就在该ICMP部分下方:

#### NAS [IN,OUT]
-A INPUT  -i eth0 -s NAS_SERVER_IP_ADDR/32 -j ACCEPT
-A OUTPUT -o eth0 -d NAS_SERVER_IP_ADDR/32 -j ACCEPT

相关内容