rpcbind究竟是做什么的?


39

根据文档:

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

0.0.0.0.8.1在这种情况下是什么意思?以及如何转换为端口2049?

Answers:


23

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服务器基本上是内核线程有关。


我遇到的最大问题是,当我监视网络流量时,II没有看到客户端在服务器上对rcpbind的查询。您知道何时查询端口号吗?
SivaDotRender 2015年

@SivaDotRender-我不确定100%,但是我相信当客户端代码调用clnt_create()来获取协议和主机的句柄时。除非您将整个过程设置为使用TCP,否则可能会通过UDP完成。
布鲁斯·埃迪格

29
“ 8.1”是端口号的两个字节。2049 =(8 * 256)+
1。– Kenster

请坚持使用“程序编号”一词。正如手册页所做的那样
炸鱼薯条德里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.