web-dev-qa-db-fra.com

Que fait exactement rpcbind?

Selon la documentation:

L'utilitaire rpcbind [3] mappe les services RPC aux ports sur lesquels ils écoutent. Les processus RPC informent rpcbind lorsqu'ils démarrent, enregistrant les ports qu'ils écoutent et les numéros de programme RPC qu'ils s'attendent à desservir. 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 et un client NFS 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 sur le port 2049.

Alors, quand rcpbind entre-t-il en jeu? Lorsque je fais rpcinfo sur le serveur, j'obtiens 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 0.0.0.0.8.1 signifie dans ce cas? Et comment cela se traduit-il sur le port 2049?

45
SivaDotRender

rpcbind est un proche analogue de BIND, ou vraiment, 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 serveur et client avec rpcgen.

Lorsqu'un client s'inscrit pour une interface donnée sur un hôte particulier, généralement avec un appel clnt_create(), le code de raccord demande à rpcbind sur cet hôte une question, quelque chose comme "sur quoi UDP ou = TCP port est le protocole numéro X à l'écoute? "rpcbind, contrairement à la plupart des autres services ONC, écoute sur TCP et le port UDP 111, donc étant donné un Nom d'hôte ou adresse IP, un programme peut simplement demander rpcbind sur cet hôte ou cette adresse IP. rpcbind répond avec le numéro de port approprié, si un serveur s'est enregistré avec lui sur cet hôte. Cet enregistrement est effectué par le processus serveur quand il appelle svc_create().

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

Maintenant, nous entrons dans un territoire plus étrange. Le "0.0.0.0.8.1" se trouve dans la colonne "adresse" de la sortie rpcinfo. 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) que le serveur a utilisé dans l'appel système bind() lors de l'obtention d'un numéro de port. Je ne suis pas sûr de ce qu'est le suffixe "8.1", mais en regardant la sortie rpcinfo, cela doit avoir quelque chose à voir avec le serveur NFS étant essentiellement un thread noyau.

26
Bruce Ediger