文書によると:
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
rpcbind
BINDまたは実際にすべての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」サフィックスが何であるかはわかりませんが、出力から見ると、rpcinfo
NFSサーバー(デフォルトではカーネルスレッド)に関連しているようです。