iptables(或其他防火墙)中的 NFS 支持

iptables(或其他防火墙)中的 NFS 支持

如何使用具有 DROP 策略的 iptables 启用 NFS 挂载/共享?

NFS 使用动态分配的端口,因此很难与防火墙一起使用。我有一个 NFS 服务器和几个客户端。我想只接受 NFS 工作所需的端口上的流量。我已将 NFS 服务器配置为使用静态端口 (4000-4004)。

然而,问题是客户端仍然选择一个随机端口 - 并且因为它是 UDP,所以只有我接受来自服务器的所有 UDP 流量才能使其工作。

我找到了一些文档,其中描述了如何设置 /sys 变量,以限制客户端使用 NFS 的静态端口范围,但我似乎无法使其工作。提到的 /sys 变量是:

/sys/module/sunrpc/parameters/max_resvport 
/sys/module/sunrpc/parameters/min_resvport
/sys/module/lockd/parameters/nlm_tcpport
/sys/module/lockd/parameters/nlm_udpport
/sys/module/nfs/parameters/callback_tcpport 

我无法完成这项工作。也许我的方法不对?我原以为这是一项简单的任务,但结果却不必要地复杂化了。

我在 Debian 和 Ubuntu 上使用 NFS。

答案1

尽管正如您所说,服务器端端口的可变性是个问题,但客户端端口的短暂性并不是问题。

假设您已成功指示服务器仅为 nfsd 使用端口 4000-4004,那么您有三个问题:客户端必须能够与服务器上的 RPC 端口映射器、挂载守护程序和 NFS 服务通信。

对于 NFS 服务

假设你修改 NFS 服务以监听 4000-4004 的说法是正确的,那么客户端应该添加

iptables -A INPUT  -d se.rv.er.ip -p udp --dport 4000:4004 -j ACCEPT
iptables -A OUTPUT -s se.rv.er.ip -p udp --sport 4000:4004 -j ACCEPT

而服务器应该添加

iptables -A INPUT  -p udp --dport 4000:4004 -j ACCEPT
iptables -A OUTPUT -p udp --sport 4000:4004 -j ACCEPT

如果您想要允许通过 TCP 进行 NFS,请使用-p tcp而不是重复这些规则-p udp

对于端口映射器

客户应添加

iptables -A INPUT  -d se.rv.er.ip -p udp --dport 111 -j ACCEPT
iptables -A OUTPUT -s se.rv.er.ip -p udp --sport 111 -j ACCEPT

而服务器应该添加

iptables -A INPUT  -p udp --dport 111 -j ACCEPT
iptables -A OUTPUT -p udp --sport 111 -j ACCEPT

您可能还需要添加规则对-p tcp,因为端口映射器通常也支持 TCP。检查您的拒绝日志以查看正在被DROP拒绝的内容并进行相应调整。

对于挂载守护进程

您需要找出服务器上运行的端口server% rpcinfo -p | grep mount;在我的服务器上,它是 UDP/32775 和 TCP/32769。要允许这些端口,客户端应添加

iptables -A INPUT  -d se.rv.er.ip -p udp --dport 32775 -j ACCEPT
iptables -A OUTPUT -s se.rv.er.ip -p udp --sport 32775 -j ACCEPT

而服务器应该添加

iptables -A INPUT  -p udp --dport 32775 -j ACCEPT
iptables -A OUTPUT -p udp --sport 32775 -j ACCEPT

以及两对相似的对-p tcp --[ds]port 32769

这是你的责任将这些线放在INPUTOUTPUT链中的正确位置;靠近开始处可能是个好主意。

编辑:根据您下面的回答,我更新了上述规则。

答案2

我发现这一页其中显示了有关如何打开 NFS 端口的几个 iptables 规则。

还,这一页建议您可以在使用以下命令(NFS v4)挂载 NFS 共享时选择协议/端口:

# mount -t nfs4 -o proto=tcp,port=2049 nfs-server:/data /mnt/data

其他几个页面正在讨论开放这三个端口:32771、111 和 2049

您可以尝试一下,如果不奏效,您可以尝试仅在您信任客户端 IP 的情况下打开所有 UDP 端口,看看是否可行。

相关内容