根据文档:
rpcbind[3] 实用程序将 RPC 服务映射到它们侦听的端口。RPC 进程在启动时会通知 rpcbind,注册它们正在侦听的端口以及它们期望服务的 RPC 程序编号。然后,客户端系统使用特定的 RPC 程序编号联系服务器上的 rpcbind。rpcbind 服务将客户端重定向到正确的端口号,以便它可以与请求的服务进行通信
为了对此进行测试,我设置了 NFS 服务器和客户端并监控它们之间的流量。从我看到的情况来看,客户端已经知道服务器上的 NFS 服务正在监听 2049 端口。
那么 rcpbind 什么时候开始发挥作用呢?当我rpcinfo在服务器上这样做时,我得到以下信息:
100003 2 udp 0.0.0.0.8.1 nfs superuser
100003 3 udp 0.0.0.0.8.1 nfs superuser
100003 2 udp6 ::.8.1 nfs superuser
100003 3 udp6 ::.8.1 nfs superuser
100003 2 tcp 0.0.0.0.8.1 nfs superuser
100003 3 tcp 0.0.0.0.8.1 nfs superuser
100003 2 tcp6 ::.8.1 nfs superuser
100003 3 tcp6 ::.8.1 nfs superuser
Run Code Online (Sandbox Code Playgroud)
0.0.0.0.8.1在这种情况下是什么意思?这如何转换为端口 2049?
Bru*_*ger 30
rpcbind是 BIND 的近似模拟,或者实际上是任何 DNS 服务器。如果我没记错的话,当您将 RPC 接口的声明编译为带有rpcgen.
当客户端在特定主机上注册给定接口时,通常是通过clnt_create()调用,存根代码会rpcbind在该主机上询问一个问题,例如“协议编号 X 在哪个 UDP 或 TCP 端口上侦听?” rpcbind与大多数其他 ONC 服务不同,它侦听 TCP 和 UDP 端口 111,因此给定主机名或 IP 地址,程序可以只询问rpcbind该主机或 IP 地址。rpcbind如果服务器已在该主机上注册,则以适当的端口号响应。该注册由服务器进程在调用 时完成svc_create()。
在您的示例中,100003 是 NFS 的协议号。一些进程已经注册rpcbind,给出了它们的协议号 (100003) 以及它们获得的任何 TCP 或 UDP 端口。这取决于rpcbind正确地给出该端口号,在您的情况下为 2049,任何对它的调用“我应该为协议号 100003 使用哪个端口”。
现在我们进入了更奇怪的领域。“0.0.0.0.8.1”在rpcinfo输出的“地址”列中。由于这是 NFS 服务器进程的“通用地址”,我敢打赌“0.0.0.0”前缀是服务器在bind()获取端口号时在系统调用中使用的 IP 地址(在本例中为 INADDR_ANY)。我不确定“8.1”后缀是什么,但是查看rpcinfo输出,它必须与 NFS 服务器基本上是内核线程有关。