ドキュメントによると:
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
に「どの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サーバーと何らかの関係がある必要があります。