![访问/挂载远程 NFS 服务器的 iptables 规则](https://linux22.com/image/89761/%E8%AE%BF%E9%97%AE%2F%E6%8C%82%E8%BD%BD%E8%BF%9C%E7%A8%8B%20NFS%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%20iptables%20%E8%A7%84%E5%88%99.png)
实际上,当 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(
portmapper
或rpcbind
)、TCP 和/或 UDP。 - NFS 文件锁定服务的端口(
lockd
或nlockmgr
),通常为 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.statd
NFSv3 或 NFSv2 设置至关重要。了解您的发行版如何启动守护进程,如果没有更具体的方法来执行此操作,请添加-p 4046
到rpc.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-common
STATDOPTS
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