Was genau macht rpcbind?

39

Nach der Dokumentation:

Das Dienstprogramm rpcbind [3] ordnet RPC-Dienste den Ports zu, an denen sie empfangsbereit sind. RPC-Prozesse benachrichtigen rpcbind beim Start und registrieren die Ports, die sie abhören, und die RPC-Programmnummern, die sie voraussichtlich bedienen. Das Client-System kontaktiert dann rpcbind auf dem Server mit einer bestimmten RPC-Programmnummer. Der rpcbind-Dienst leitet den Client an die richtige Portnummer weiter, damit er mit dem angeforderten Dienst kommunizieren kann

Um dies zu testen, habe ich einen NFS-Server und einen Client eingerichtet und den Datenverkehr zwischen ihnen überwacht. Nach allem, was ich gesehen habe, wusste der Client bereits, dass der NFS-Dienst auf dem Server Port 2049 überwacht.

Wann kommt rcpbind ins Spiel? Wenn ich rpcinfoauf dem Server mache , bekomme ich Folgendes:

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

was 0.0.0.0.8.1heißt in diesem fall Und wie heißt das für Port 2049?

SivaDotRender
quelle

Antworten:

23

rpcbindist ein enges Analogon von BIND oder wirklich jedem DNS-Server. Wenn ich mich richtig erinnere, wählen Sie oder erhalten eine Protokollnummer, wenn Sie die Deklaration der RPC-Schnittstelle in Server- und Client-Stubcode mit kompilieren rpcgen.

Wenn sich ein Client für eine bestimmte Schnittstelle auf einem bestimmten Host anmeldet, in der Regel mit einem clnt_create()Anruf, stellt der Stub-Code rpcbindauf diesem Host eine Frage wie "Auf welchem ​​UDP- oder TCP-Port lauscht das Protokoll Nummer X?" rpcbindIm Gegensatz zu den meisten anderen ONC-Diensten überwacht TCP und UDP Port 111, sodass ein Programm bei einem Hostnamen oder einer IP-Adresse nur rpcbindnach diesem Host oder dieser IP-Adresse fragen kann . rpcbindantwortet mit der entsprechenden Portnummer, wenn sich ein Server auf diesem Host registriert hat. Diese Registrierung erfolgt durch den Serverprozess, wenn er aufruft svc_create().

In Ihrem Beispiel ist 100003 die Protokollnummer für NFS. Einige Prozesse haben sich mit rpcbindder Protokollnummer (100003) und dem von ihnen erworbenen TCP- oder UDP-Port registriert . Es ist an rpcbindder Zeit, diese Portnummer, in Ihrem Fall 2049, korrekt anzugeben, um zu erfahren, "welchen Port ich für die Protokollnummer 100003 verwenden soll".

Jetzt betreten wir ein seltsameres Gebiet. Die "0.0.0.0.8.1" befindet sich in der rpcinfoAusgabespalte "Adresse" . Da dies die "universelle Adresse" des NFS-Serverprozesses ist, wette ich, dass das Präfix "0.0.0.0" die IP-Adresse (in diesem Fall INADDR_ANY) ist, die der Server bind()beim Abrufen einer Portnummer für den Systemaufruf verwendet . Ich bin mir nicht sicher, was das Suffix "8.1" ist, aber was die rpcinfoAusgabe betrifft, hat dies etwas damit zu tun, dass der NFS-Server im Grunde genommen ein Kernel-Thread ist.

Bruce Ediger
quelle
Das größte Problem in meinem Fall war, dass ich keine Abfrage zum rcpbind auf dem Server durch den Client sah, als ich den Netzwerkverkehr überwachte. Wissen Sie, wann diese Abfrage nach der Portnummer erfolgt?
SivaDotRender
@SivaDotRender - Ich bin nicht zu 100% sicher, aber ich glaube, wenn der Client-Code clnt_create () aufruft, um ein Handle für das Protokoll und den Host zu erhalten. Dies wird wahrscheinlich über UDP erfolgen, es sei denn, Sie haben das Ganze für die Verwendung von TCP eingerichtet.
Bruce Ediger
29
"8.1" sind die zwei Bytes der Portnummer. 2049 = (8 * 256) + 1.
Kenster
Bitte halten Sie sich an den Begriff "Programmnummer". Wie die Manpage es tut
炸鱼 薯条 德里克