Remote

rpcbind 到底是做什麼的?

  • April 21, 2019

根據文件:

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 埠?

rpcbind是 BIND 的近似模擬,或者實際上是任何 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 伺服器基本上是一個核心執行緒有關。

引用自:https://unix.stackexchange.com/questions/234154