Cosa fa esattamente rpcbind?


39

Secondo la documentazione:

L'utility rpcbind [3] associa i servizi RPC alle porte su cui ascoltano. I processi RPC avvisano rpcbind all'avvio, registrando le porte su cui sono in ascolto e i numeri di programma RPC che prevedono di servire. Il sistema client quindi contatta rpcbind sul server con un determinato numero di programma RPC. Il servizio rpcbind reindirizza il client al numero di porta corretto in modo che possa comunicare con il servizio richiesto

Per verificarlo, ho impostato un server e un client NFS e monitorato il traffico tra di loro. Da quello che ho visto, il client sapeva già che il servizio NFS sul server era in ascolto sulla porta 2049.

Quindi quando entra in gioco rcpbind? Quando lo faccio rpcinfosul server, ottengo quanto segue:

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

cosa 0.0.0.0.8.1significa in questo caso? E come si traduce nella porta 2049?

Risposte:


23

rpcbindè un analogo stretto di BIND, o in realtà, di qualsiasi server DNS. Se ricordo bene, scegli o ti viene dato un numero di protocollo quando compili la dichiarazione dell'interfaccia RPC in codice stub server e client con rpcgen.

Quando un client si registra per una determinata interfaccia su un determinato host, di solito con una clnt_create()chiamata, il codice stub pone rpcbinduna domanda su quell'host, qualcosa del tipo "su quale porta UDP o TCP è in ascolto il numero di protocollo X?" rpcbind, a differenza della maggior parte degli altri servizi ONC, è in ascolto sulla porta 111 e TCP UDP, quindi, dato un nome host o un indirizzo IP, un programma può semplicemente chiedere rpcbindsu quell'host o indirizzo IP. rpcbindrisponde con il numero di porta appropriato, se un server si è registrato con esso su quell'host. Tale registrazione viene eseguita dal processo del server quando chiama svc_create().

Nel tuo esempio, 100003 è il numero di protocollo per NFS. Alcuni processi si sono registrati rpcbind, fornendo il loro numero di protocollo (100003) e qualunque porta TCP o UDP abbiano acquisito. Sta rpcbinda dare correttamente quel numero di porta, 2049 nel tuo caso, a qualsiasi chiamata su di esso per "quale porta dovrei usare per il numero di protocollo 100003".

Ora stiamo entrando in un territorio più strano. "0.0.0.0.8.1" si trova nella colonna "address" rpcinfodell'output. Poiché questo è l '"indirizzo universale" del processo del server NFS, scommetto che il prefisso "0.0.0.0" è l'indirizzo IP (INADDR_ANY in questo caso) che il server ha usato nella bind()chiamata di sistema quando riceve un numero di porta. Non sono sicuro di cosa sia il suffisso "8.1", ma guardando l' rpcinfooutput, ha a che fare con il server NFS che è fondamentalmente un thread del kernel.


Il problema più grande nel mio caso è stato che II non ha visto una query a rcpbind sul server da parte del client durante il monitoraggio del traffico di rete. Sai quando si verifica questa query per il numero di porta?
SivaDotRender il

@SivaDotRender - Non sono sicuro al 100%, ma credo quando il codice client chiama clnt_create () per ottenere un handle per il protocollo e l'host. Probabilmente verrà eseguito tramite UDP, a meno che tu non abbia impostato tutto per utilizzare TCP.
Bruce Ediger,

29
"8.1" è i due byte del numero di porta. 2049 = (8 * 256) + 1.
Kenster

Attenersi al termine "num programma". Come fa la pagina man
炸鱼 薯条 德里克
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.