Apa yang dilakukan rpcbind?

39

Menurut dokumentasi:

Utilitas rpcbind [3] memetakan layanan RPC ke port tempat mereka mendengarkan. Proses RPC memberi tahu rpcbind ketika mereka mulai, mendaftarkan port yang mereka dengarkan dan nomor program RPC yang mereka harapkan untuk dilayani. Sistem klien kemudian menghubungi rpcbind di server dengan nomor program RPC tertentu. Layanan rpcbind mengarahkan klien ke nomor port yang sesuai sehingga dapat berkomunikasi dengan layanan yang diminta

Untuk menguji ini, saya menyiapkan server dan klien NFS dan memantau lalu lintas di antara mereka. Dari apa yang saya lihat, klien sudah tahu bahwa layanan NFS di server mendengarkan pada port 2049.

Jadi kapan rcpbind ikut bermain? Ketika saya melakukannya rpcinfodi server, saya mendapatkan yang berikut ini:

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

apa 0.0.0.0.8.1artinya dalam hal ini? Dan bagaimana ini diterjemahkan ke port 2049?

SivaDotRender
sumber

Jawaban:

23

rpcbindadalah analog dekat BIND, atau benar-benar, server DNS mana pun. Jika saya ingat dengan benar, Anda memilih atau diberi nomor protokol ketika Anda mengkompilasi deklarasi antarmuka RPC ke dalam server dan kode tulisan rintisan klien rpcgen.

Ketika klien mendaftar untuk antarmuka yang diberikan pada host tertentu, biasanya dengan clnt_create()panggilan, kode rintisan bertanya rpcbindpada host itu pertanyaan, sesuatu seperti "pada apa port UDP atau TCP adalah protokol nomor X mendengarkan?" rpcbind, tidak seperti kebanyakan layanan ONC lainnya, mendengarkan pada port TCP dan UDP 111, sehingga diberi nama host atau alamat IP, sebuah program bisa menanyakan rpcbindpada host atau alamat IP tersebut. rpcbindmerespons dengan nomor port yang sesuai, jika server telah mendaftarkannya pada host itu. Registrasi itu dilakukan oleh proses server ketika ia memanggil svc_create().

Dalam contoh Anda, 100003 adalah nomor protokol untuk NFS. Beberapa proses telah terdaftar rpcbind, memberikan nomor protokol mereka (100003) dan port TCP atau UDP apa pun yang telah mereka peroleh. Terserah dengan rpcbindbenar memberikan nomor port, 2049 dalam kasus Anda, untuk panggilan apa pun untuk "port apa yang harus saya gunakan untuk nomor protokol 100003".

Sekarang kita memasuki wilayah yang lebih aneh. "0.0.0.0.8.1" ada di kolom "address" rpcinfooutput. Karena itulah "alamat universal" dari proses server NFS, saya yakinkan awalan "0.0.0.0" adalah alamat IP (INADDR_ANY dalam hal ini) yang digunakan server dalam bind()panggilan sistem ketika mendapatkan nomor port. Saya tidak yakin apa akhiran "8.1" itu, tetapi melihat rpcinfooutput, itu harus ada hubungannya dengan server NFS pada dasarnya menjadi thread kernel.

Bruce Ediger
sumber
Masalah terbesar dalam kasus saya adalah bahwa saya tidak melihat permintaan untuk rcpbind di server oleh klien ketika saya sedang memonitor lalu lintas jaringan. Apakah Anda tahu kapan kueri untuk nomor port ini terjadi?
SivaDotRender
@SivaDotRender - Saya tidak 100% yakin, tapi saya percaya ketika kode klien memanggil clnt_create () untuk mendapatkan pegangan untuk protokol dan host. Mungkin akan dilakukan melalui UDP, kecuali jika Anda mengatur semuanya untuk menggunakan TCP.
Bruce Ediger
29
"8.1" adalah dua byte dari nomor port. 2049 = (8 * 256) + 1.
Kenster
Harap tetap pada istilah "program num". Seperti halnya halaman manual
炸鱼 薯条 德里克