![rpcbind - 真的没有办法将 tcp 端口绑定到特定接口吗/没有 rpcbind 是否可以运行 nfs?](https://linux22.com/image/595628/rpcbind%20-%20%E7%9C%9F%E7%9A%84%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%B0%86%20tcp%20%E7%AB%AF%E5%8F%A3%E7%BB%91%E5%AE%9A%E5%88%B0%E7%89%B9%E5%AE%9A%E6%8E%A5%E5%8F%A3%E5%90%97%2F%E6%B2%A1%E6%9C%89%20rpcbind%20%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%BF%90%E8%A1%8C%20nfs%EF%BC%9F.png)
我们希望从sshfs
转向nfs
。
阻碍我们前进的最后一件事是rpcbind
(我认为这是nfs
工作所必需的)不允许您指定它绑定到的TCP
(非)IP。UDP
有-h
标志,但这仅适用于它打开的 UDP 端口。这不会影响 TCP 端口,它们仍然打开0.0.0.0:...
有人知道我们如何rpcbind
通过不将其暴露给我们的公共界面来确保安全吗?
或者甚至更好,有没有办法nfs
不用rpcbind
?
谢谢!
答案1
rpcbind 需要将 RPC 服务映射到网络(读取 TCP 或 UDP)地址和端口。NFS 版本 2 和 3 需要额外的服务 mountd 来允许客户端获取初始文件句柄。虽然 nfs 有一个众所周知的端口号 2049,但 mountd 没有。换句话说,如果您想使用 NFSv3,您还需要运行 rpcbind(嗯,可能有一些挂载选项可以告诉 mound 在哪里运行)。与 v3 相反,NFSv4 只需要单个端口 2049 并且根本不需要 mountd。这使得无 rpcbind NFS 设置成为可能。请注意,即使对于 v4,一些(旧)客户端仍可能尝试与 rpcbind 通信。
现在,关于 rpcbind。为什么要保护它?如果客户端无法使用,那么它们就无法挂载?保护的唯一原因是限制可以进行更新的客户端数量。但这已经到位,因为 rpcbind 使用 unix 域套接字并禁止任何远程客户端执行更新。即使在本地主机上,您也需要 root 身份才能进行更新。如果您只想保护某些客户端,那么 iptables 就是您的朋友(或您的操作系统拥有的任何防火墙):
# iptables -A INPUT -s 10.1.2.0/24 -p tcp --dport 111 -j ACCEPT
# iptables -A INPUT -s 10.1.3.0/24 -p udp --dport 111 -j ACCEPT
# iptables -A INPUT -p tcp --dport 111 -j DROP
# iptables -A INPUT -p udp --dport 111 -j DROP
答案2
对于任何在 2019 年寻求答案的人来说,无需添加防火墙规则。
rpcbind
需要选项。将其添加到(Red Hat, Fedora, SLES, openSUSE) 或(Debian, Ubuntu)-h IP
即可。/etc/sysconfig/rpcbind
/etc/default/rpcbind
答案3
服务端口的查找被嵌入到 RPC 协议中,因此您必须做一些非常特殊的事情来避免在运行 NFS 时出现 rpcbind。
您可以使用 iptables 来阻止来自特定地址或接口的连接;使用 tcpwrappers(/etc/hosts.allow、/etc/hosts.deny);或者 - 对于喜欢冒险的人来说 - 使用 SELinux。
如果“ldd /sbin/rpcbind”显示 libwrap 链接,则 tcpwrappers 本机可用,否则您需要抑制通常的启动,而是通过 tcpd 从 inetd/xinetd 运行它。我自己还没有尝试过。
答案4
无需再设置防火墙规则。使用最新的 Linux 发行版(其中 /etc/hosts.deny/allow 可用),您只需执行以下操作:
echo "portmap: 10.0.0.0/16" >> /etc/hosts.allow
echo "rpcbind: 10.0.0.0/16" >> /etc/hosts.allow
echo "portmap: ALL" >> /etc/hosts.deny
echo "rpcbind: ALL" >> /etc/hosts.deny
(假设 10.0.0.0/16 是您的私人网络)。
NFS 的最新版本使用 rpcbind,但旧版本使用 portmap,因此这取决于您的操作系统。