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正しく「どのポートIは、プロトコル番号100003のために使用すべきである」ためにその上に任意のコールに、あなたのケースでは、そのポート番号、2049を得ました。

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


私の場合の最大の問題は、ネットワークトラフィックを監視しているときに、クライアントがサーバー上のrcpbindへのクエリをIIで見られなかったことです。このポート番号のクエリがいつ発生するか知っていますか?
-SivaDotRender

@SivaDotRender-私は100%確信していませんが、クライアントコードがclnt_create()を呼び出してプロトコルとホストのハンドルを取得すると信じています。TCPを使用するように全体を設定しない限り、おそらくUDPを介して行われます。
ブルースエディガー

29
「8.1」はポート番号の2バイトです。2049 =(8 * 256)+ 1.
ケンスター

「プログラム番号」という用語に固執してください。manページが行うように
炸鱼薯条德里克
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.