Que fait exactement rpcbind?

39

Selon la documentation:

L'utilitaire rpcbind [3] mappe les services RPC aux ports sur lesquels ils écoutent. Les processus RPC informent rpcbind de leur démarrage, en enregistrant les ports sur lesquels ils sont en train d'écouter et les numéros de programme RPC qu'ils s'attendent à servir. Le système client contacte ensuite rpcbind sur le serveur avec un numéro de programme RPC particulier. Le service rpcbind redirige le client vers le numéro de port approprié afin qu'il puisse communiquer avec le service demandé.

Pour tester cela, j'ai configuré un serveur NFS et un client et surveillé le trafic entre eux. D'après ce que j'ai vu, le client savait déjà que le service NFS sur le serveur écoutait le port 2049.

Alors, quand rcpbind entre en jeu? Lorsque je le fais rpcinfosur le serveur, je reçois ce qui suit:

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

qu'est-ce que cela 0.0.0.0.8.1signifie dans ce cas? Et comment cela se traduit-il sur le port 2049?

SivaDotRender
la source

Réponses:

23

rpcbindest un analogue proche de BIND, ou en réalité de tout serveur DNS. Si je me souviens bien, vous choisissez ou recevez un numéro de protocole lorsque vous compilez la déclaration de l'interface RPC en code de stub de serveur et de client avec rpcgen.

Lorsqu'un client s'inscrit pour une interface donnée sur un hôte particulier, généralement avec un clnt_create()appel, le code de raccord demande rpcbindà cet hôte une question du type "sur quel port UDP ou TCP le numéro de protocole X est-il en écoute?" rpcbind, contrairement à la plupart des autres services ONC, écoute sur les ports TCP et UDP 111; ainsi, à partir du nom d’hôte ou de l’adresse IP, un programme peut simplement demander rpcbindà cet hôte ou à cette adresse IP. rpcbindrépond avec le numéro de port approprié, si un serveur s'est enregistré avec sur cet hôte. Cet enregistrement est effectué par le processus serveur lorsqu’il appelle svc_create().

Dans votre exemple, 100003 correspond au numéro de protocole de NFS. Certains processus se sont enregistrés avec rpcbind, en indiquant leur numéro de protocole (100003) et le port TCP ou UDP qu'ils ont acquis. C'est à vous rpcbindde donner correctement ce numéro de port, le 2049 dans votre cas, à tout appel sur lui pour "quel port dois-je utiliser pour le numéro de protocole 100003".

Nous entrons maintenant dans un territoire plus étrange. "0.0.0.0.8.1" se trouve dans la colonne "adresse" de la rpcinfosortie. Puisque c’est «l’adresse universelle» du processus du serveur NFS, je parie que le préfixe «0.0.0.0» est l’adresse IP (INADDR_ANY dans ce cas) utilisée par le serveur dans l’ bind()appel système pour obtenir un numéro de port. Je ne suis pas sûr de ce que le suffixe "8.1" est, mais en regardant la rpcinfosortie, il doit y avoir quelque chose à voir avec le serveur NFS étant fondamentalement un thread du noyau.

Bruce Ediger
la source
Le plus gros problème dans mon cas était que II ne voyait pas une requête de rcpbind sur le serveur par le client lorsque je surveillais le trafic réseau. Savez-vous quand cette requête pour le numéro de port se produit?
SivaDotRender
@SivaDotRender - Je ne suis pas certain à 100%, mais je crois que le code du client appelle clnt_create () pour obtenir un descripteur du protocole et de l'hôte. Cela se fera probablement via UDP, sauf si vous configurez le tout pour utiliser TCP.
Bruce Ediger
29
"8.1" est les deux octets du numéro de port. 2049 = (8 * 256) + 1.
Kenster
Veuillez vous en tenir au terme "programme num". Comme la page de
manuel