rpcbind는 정확히 무엇을합니까?


39

설명서에 따르면 :

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로 변환됩니까?

답변:


23

rpcbindBIND 또는 DNS 서버와 매우 유사합니다. 올바르게 기억한다면,를 사용하여 RPC 인터페이스 선언을 서버 및 클라이언트 스텁 코드로 컴파일 할 때 프로토콜 번호를 선택하거나 제공합니다 rpcgen.

클라이언트가 특정 호스트에서 특정 인터페이스, 일반적으로 clnt_create()호출로 서명 하면 스텁 코드는 rpcbind해당 호스트에서 "프로토콜 번호 X 수신 대기중인 UDP 또는 TCP 포트는 무엇입니까?"와 같은 질문을합니다. rpcbind대부분의 다른 ONC 서비스와 달리 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 서버와 기본적으로 커널 스레드와 관련이 있습니다.


필자의 경우 가장 큰 문제는 네트워크 트래픽을 모니터링 할 때 II 클라이언트가 서버에서 rcpbind에 대한 쿼리를 보지 못했다는 것입니다. 포트 번호에 대한이 쿼리가 언제 발생하는지 알고 있습니까?
SivaDotRender

@SivaDotRender-100 % 확실하지는 않지만 클라이언트 코드가 clnt_create ()를 호출하여 프로토콜 및 호스트에 대한 핸들을 가져올 때 믿습니다. TCP를 사용하도록 모든 것을 설정하지 않으면 UDP를 통해 수행됩니다.
Bruce Ediger

29
"8.1"은 포트 번호의 2 바이트입니다. 2049 = (8 * 256) + 1.
Kenster

"프로그램 번호"라는 용어를 사용하십시오. 매뉴얼 페이지처럼
炸鱼 薯条 德里克
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.