rpcbind는 정확히 무엇을 하는가?

rpcbind는 정확히 무엇을 하는가?

문서에 따르면:

rpcbind[3] 유틸리티는 RPC 서비스를 해당 서비스가 수신하는 포트에 매핑합니다. RPC 프로세스는 시작할 때 rpcbind에 알리고 수신 중인 포트와 서비스할 것으로 예상되는 RPC 프로그램 번호를 등록합니다. 그런 다음 클라이언트 시스템은 특정 RPC 프로그램 번호를 사용하여 서버의 rpcbind에 연결합니다. rpcbind 서비스는 요청된 서비스와 통신할 수 있도록 클라이언트를 올바른 포트 번호로 리디렉션합니다.

이를 테스트하기 위해 NFS 서버와 클라이언트를 설정하고 이들 사이의 트래픽을 모니터링했습니다. 내가 본 바에 따르면 클라이언트는 서버의 NFS 서비스가 포트 2049에서 수신 대기 중이라는 것을 이미 알고 있습니다.

그러면 rcpbind는 언제 작동합니까? rpcinfo서버에서 이 작업을 수행 하면 다음과 같은 결과가 나타납니다.

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

0.0.0.0.8.1이 경우에는 무엇을 의미합니까? 이것이 포트 2049로 어떻게 변환됩니까?

답변1

rpcbindBIND 또는 실제로 모든 DNS 서버를 긴밀하게 에뮬레이션합니다. 내 기억이 맞다면 rpcgen.

클라이언트가 특정 호스트에 특정 인터페이스를 등록하면(보통 호출을 통해 clnt_create()) 스텁 코드는 " 대부분의 다른 ONC 서비스와 마찬가지로 rpcbind프로토콜 번호 X가 수신 대기하는 UDP 또는 TCP 포트는 무엇입니까?"와 같은 질문을 해당 호스트에 묻습니다. rpcbind, TCP 및 UDP 포트 111에서 수신 대기하므로 호스트 이름이나 IP 주소가 주어지면 프로그램은 rpcbind해당 호스트나 IP 주소만 요청하면 됩니다. rpcbind서버가 이 호스트에 이미 등록되어 있는 경우 적절한 포트 번호로 응답합니다. 이 등록은 호출될 때 서버 프로세스에 의해 수행됩니다 svc_create().

귀하의 예에서 100003은 NFS의 프로토콜 번호입니다. 일부 프로세스는 rpcbind프로토콜 번호(100003)와 획득한 TCP 또는 UDP 포트를 고려하여 에 등록됩니다. rpcbind"프로토콜 번호 100003에 사용할 포트는 무엇입니까?"에 대한 호출에 대해 해당 포트 번호(귀하의 경우 2049)를 올바르게 제공하십시오 .

이제 우리는 더 이상한 영역으로 들어갑니다. "0.0.0.0.8.1"은 출력의 "주소" 열에 있습니다 rpcinfo. 이는 NFS 서버 프로세스의 "범용 주소"이므로 "0.0.0.0" 접두사는 bind()서버가 포트 번호를 가져올 때 시스템 호출에서 사용하는 IP 주소(이 경우 INADDR_ANY)일 것이라고 확신합니다. . "8.1" 접미사가 무엇인지는 잘 모르겠지만 rpcinfo출력에서 ​​보면 NFS 서버(기본적으로 커널 스레드)와 관련된 것으로 보입니다.

관련 정보