¿Qué hace exactamente rpcbind?

39

De acuerdo con la documentación:

La utilidad rpcbind [3] asigna los servicios RPC a los puertos en los que escuchan. Los procesos RPC notifican a rpcbind cuando comienzan, registrando los puertos que están escuchando y los números de programa RPC que esperan servir. El sistema del cliente luego contacta a rpcbind en el servidor con un número de programa RPC particular. El servicio rpcbind redirige al cliente al número de puerto adecuado para que pueda comunicarse con el servicio solicitado.

Para probar esto, configuré un servidor NFS y un cliente y monitoreé el tráfico entre ellos. Por lo que vi, el cliente ya sabía que el servicio NFS en el servidor estaba escuchando en el puerto 2049.

Entonces, ¿cuándo entra en juego rcpbind? Cuando lo hago rpcinfoen el servidor, obtengo lo siguiente:

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é 0.0.0.0.8.1significa en este caso? ¿Y cómo se traduce esto al puerto 2049?

SivaDotRender
fuente

Respuestas:

23

rpcbindes un análogo cercano de BIND, o realmente, cualquier servidor DNS. Si recuerdo correctamente, usted elige o recibe un número de protocolo cuando compila la declaración de la interfaz RPC en el código auxiliar del servidor y del cliente con rpcgen.

Cuando un cliente se registra para una interfaz determinada en un host en particular, generalmente con una clnt_create()llamada, el código auxiliar hace rpcbinduna pregunta en ese host, algo así como "¿en qué puerto UDP o TCP está escuchando el protocolo número X?" rpcbind, a diferencia de la mayoría de los otros servicios ONC, escucha en el puerto TCP y UDP 111, por lo que, dado un nombre de host o una dirección IP, un programa puede preguntar rpcbinden ese host o dirección IP. rpcbindresponde con el número de puerto apropiado, si un servidor se ha registrado con él en ese host. Ese registro lo realiza el proceso del servidor cuando llama svc_create().

En su ejemplo, el 100003 es el número de protocolo para NFS. Algunos procesos se han registrado rpcbind, dando su número de protocolo (100003) y cualquier puerto TCP o UDP que hayan adquirido. Es hasta rpcbinddar con razón, que el número de puerto de 2049, en su caso, a cualquier llamada de él para "qué puerto debo utilizar para el protocolo número 100003".

Ahora estamos entrando en territorio más extraño. El "0.0.0.0.8.1" está en la columna de "dirección" de rpcinfosalida. Dado que esa es la "dirección universal" del proceso del servidor NFS, apuesto a que el prefijo "0.0.0.0" es la dirección IP (INADDR_ANY en este caso) que el servidor utilizó en la bind()llamada del sistema al obtener un número de puerto. No estoy seguro de cuál es el sufijo "8.1", pero mirando la rpcinfosalida, tiene que tener algo que ver con que el servidor NFS sea básicamente un hilo del núcleo.

Bruce Ediger
fuente
El mayor problema en mi caso fue que no vi una consulta para rcpbind en el servidor por parte del cliente cuando estaba monitoreando el tráfico de red. ¿Sabes cuándo ocurre esta consulta para el número de puerto?
SivaDotRender
@SivaDotRender: no estoy 100% seguro, pero creo que cuando el código del cliente llama a clnt_create () para obtener un identificador para el protocolo y el host. Probablemente se hará a través de UDP, a menos que configure todo para usar TCP.
Bruce Ediger
29
"8.1" son los dos bytes del número de puerto. 2049 = (8 * 256) + 1.
Kenster
Apéguese al término "programa num". Como lo hace la página man
炸鱼 薯条 德里克