rpcbindは丁度何をするか。

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

答え1

rpcbindBINDまたは実際にすべてのDNSサーバーを緊密にエミュレートします。私の記憶が正しい場合rpcgen

クライアントが特定のホストに特定のインターフェイスを登録した場合(通常はコールを介してclnt_create())、スタブコードは「他のほとんどのONCサービスと同様に、rpcbindプロトコル番号XがリッスンするUDPまたはTCPポートは何ですか?」などの質問をそのホストに聞きます。rpcbind、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」サフィックスが何であるかはわかりませんが、出力から見ると、rpcinfoNFSサーバー(デフォルトではカーネルスレッド)に関連しているようです。

関連情報