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 埠?
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 伺服器基本上是一個核心執行緒有關。