如何使用具有 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
。
这是你的责任将这些线放在INPUT
和OUTPUT
链中的正确位置;靠近开始处可能是个好主意。
编辑:根据您下面的回答,我更新了上述规则。