Exatamente o que o rpcbind faz?

34

De acordo com a documentação:

The rpcbind[3] utility maps RPC services to the ports on which they listen. RPC processes notify rpcbind when they start, registering the ports they are listening on and the RPC program numbers they expect to serve. The client system then contacts rpcbind on the server with a particular RPC program number. The rpcbind service redirects the client to the proper port number so it can communicate with the requested service

Para testar isso, eu configurei um servidor e um cliente NFS e monitorou o tráfego entre eles. Pelo que vi, o cliente já sabia que o serviço NFS no servidor estava escutando na porta 2049.

Então, quando o rcpbind entra em ação? Quando eu faço rpcinfo no servidor, recebo o seguinte:

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

o que significa 0.0.0.0.8.1 neste caso? E como isso se traduz na porta 2049?

    
por SivaDotRender 06.10.2015 / 00:16

1 resposta

21

rpcbind é um análogo aproximado do BIND ou, na verdade, de qualquer servidor DNS. Se bem me lembro, você escolhe ou recebe um número de protocolo quando compila a declaração da interface RPC no código stub do servidor e do cliente com rpcgen .

Quando um cliente se inscreve em uma determinada interface em um determinado host, geralmente com uma chamada clnt_create() , o código stub pergunta a rpcbind nesse host uma pergunta, algo como "em qual porta UDP ou TCP é o número do protocolo X ouvindo? rpcbind , diferentemente da maioria dos outros serviços ONC, escuta na porta TCP e UDP 111, então, dado um nome de host ou endereço IP, um programa pode apenas perguntar a rpcbind nesse host ou endereço IP. rpcbind responde com o número da porta apropriado, se um servidor tiver se registrado com ele nesse host. Esse registro é feito pelo processo do servidor quando ele chama svc_create() .

No seu exemplo, o 100003 é o número do protocolo do NFS. Alguns processos foram registrados com rpcbind , fornecendo seu número de protocolo (100003) e qualquer porta TCP ou UDP que eles adquiriram. É até rpcbind para dar corretamente esse número de porta, 2049 no seu caso, para qualquer chamada sobre ele para "qual porta devo usar para o número de protocolo 100003".

Agora estamos entrando em território mais estranho. O "0.0.0.0.8.1" está na coluna "endereço" de rpcinfo output. Como esse é o "endereço universal" do processo do servidor NFS, aposto que o prefixo "0.0.0.0" é o endereço IP (INADDR_ANY neste caso) que o servidor usou na chamada do sistema bind() ao obter um número de porta. Eu não tenho certeza do que é o sufixo "8.1", mas olhando para rpcinfo output, ele tem que ter algo a ver com o servidor NFS sendo basicamente um thread do kernel.

    
por 06.10.2015 / 00:43

Tags