Exatamente o que o rpcbind faz?

39

De acordo com a documentação:

O utilitário rpcbind [3] mapeia os serviços RPC para as portas nas quais eles escutam. Os processos RPC notificam o rpcbind quando iniciam, registrando as portas nas quais estão ouvindo e os números do programa RPC que esperam servir. O sistema do cliente entra em contato com rpcbind no servidor com um número de programa RPC específico. O serviço rpcbind redireciona o cliente para o número de porta apropriado para que ele possa se comunicar com o serviço solicitado

Para testar isso, configurei um servidor e cliente NFS e monitorei 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 rpcinfono 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 0.0.0.0.8.1significa neste caso? E como isso se traduz na porta 2049?

SivaDotRender
fonte

Respostas:

23

rpcbindé um análogo próximo do BIND, ou realmente, de qualquer servidor DNS. Se bem me lembro, você escolhe ou recebe um número de protocolo ao compilar a declaração da interface RPC no código de stub do servidor e do cliente rpcgen.

Quando um cliente se inscreve para uma determinada interface em um host específico, geralmente com uma clnt_create()chamada, o código do stub faz rpcbinduma pergunta ao host, algo como "em qual porta UDP ou TCP o número de protocolo X está escutando?" rpcbind, diferente da maioria dos outros serviços ONC, escuta na porta 111 TCP e UDP, portanto, dado um nome de host ou endereço IP, um programa pode simplesmente perguntar rpcbindnesse host ou endereço IP. rpcbindresponde 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 rpcbind, fornecendo seu número de protocolo (100003) e qualquer porta TCP ou UDP que eles adquiriram. É rpcbindpossível fornecer corretamente esse número da porta, 2049 no seu caso, para qualquer solicitação de "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" da rpcinfosaída. 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 nesse caso) que o servidor usado no bind()sistema chama ao obter um número de porta. Não sei ao certo qual é o sufixo "8.1", mas olhando para a rpcinfosaída, ele tem algo a ver com o servidor NFS basicamente sendo um thread do kernel.

Bruce Ediger
fonte
O maior problema no meu caso foi que eu não vi uma consulta para rcpbind no servidor pelo cliente quando eu estava monitorando o tráfego de rede. Você sabe quando esta consulta para o número da porta acontece?
SivaDotRender
@SivaDotRender - Não tenho 100% de certeza, mas acredito que quando o código do cliente chama clnt_create () para obter um identificador para o protocolo e o host. Provavelmente será feito via UDP, a menos que você configure tudo para usar o TCP.
Bruce Ediger
29
"8.1" são os dois bytes do número da porta. 2049 = (8 * 256) + 1.
Kenster 6/10/2015
Por favor, atenha-se ao termo "program num". Como a página do
manual