문서에 따르면:
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
rpcbind
BIND 또는 실제로 모든 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 서버(기본적으로 커널 스레드)와 관련된 것으로 보입니다.