web-dev-qa-db-ja.com

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に変換されますか?

45
SivaDotRender

rpcbindは、BIND、または実際には、任意のDNSサーバーによく似ています。私が正しく思い出すと、RPCインターフェイスの宣言をrpcgenを使用してサーバーとクライアントのスタブコードにコンパイルするときに、プロトコル番号を選択するか、与えられます。

クライアントが特定のホストの特定のインターフェースにサインアップすると、通常はclnt_create()呼び出しで、スタブコードはそのホストのrpcbindに「どのUDPまたはTCPポートはプロトコル番号Xリスニングですか? "rpcbind、他のほとんどのONCサービスとは異なり、TCPおよびUDPポート111でリッスンするため、ホスト名またはIPアドレスを指定すると、プログラムはそのホストまたはIPアドレスでrpcbindに尋ねます。サーバーがそのホストに登録されている場合、rpcbindは適切なポート番号で応答します。この登録は、サーバープロセスがsvc_create()を呼び出すときに行われます。

あなたの例では、100003はNFSのプロトコル番号です。一部のプロセスはrpcbindに登録されており、プロトコル番号(100003)および取得したすべてのTCPまたはUDPポートを提供します。そのポート番号2049を正しく指定するのはrpcbindまでですあなたのケースでは、「プロトコル番号100003にどのポートを使用すればよいか」を要求することになります。

今、私たちは奇妙な領域に入っています。 「0.0.0.0.8.1」は、rpcinfo出力の「アドレス」列にあります。これはNFSサーバープロセスの「ユニバーサルアドレス」であるため、「0.0.0.0」プレフィックスは、サーバーがbind()システムコールで使用したIPアドレス(この場合はINADDR_ANY)であると思います。ポート番号。 「8.1」というサフィックスが何かはわかりませんが、rpcinfoの出力を見ると、基本的にカーネルスレッドであるNFSサーバーと何らかの関係がある必要があります。

26
Bruce Ediger