Tam olarak rpcbind ne yapar?


39

Belgelere göre:

Rpcbind [3] yardımcı programı, RPC hizmetlerini dinledikleri bağlantı noktalarına eşler. RPC işlemleri, başladığında, dinlemekte oldukları bağlantı noktalarını ve hizmet vermeyi bekledikleri RPC program numaralarını kaydettiklerinde rpcbind'i bilgilendirir. İstemci sistemi daha sonra belirli bir RPC program numarası ile sunucudaki rpcbind ile bağlantı kurar. Rpcbind servisi, istemciyi istenen port ile iletişim kurabilmesi için uygun port numarasına yönlendirir.

Bunu test etmek için bir NFS sunucusu ve istemcisi kurdum ve aralarındaki trafiği izledim. Gördüğüm kadarıyla, istemci sunucudaki NFS hizmetinin 2049 numaralı bağlantı noktasını dinlediğini zaten biliyordu.

Peki rcpbind ne zaman devreye giriyor? Ben ne zaman rpcinfosunucuda, ben aşağıdaki alıyorum:

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.1bu durumda ne anlama geliyor? Ve bu nasıl 2049 limanına çevriliyor?

Yanıtlar:


23

rpcbindBIND veya gerçekten herhangi bir DNS sunucusunun yakın bir analogudur. Doğru hatırlıyorsam, RPC arabiriminin bildirimini sunucu ve istemci saplama koduyla birlikte derlerken bir protokol numarası seçersiniz veya verilir rpcgen.

Bir müşteri belirli bir ana bilgisayar üzerinde belirli bir arabirim için, genellikle bir clnt_create()çağrı ile kaydolurken , saplama kodu rpcbind, bu ana makineye bir soru sorar ; "hangi UDP veya TCP bağlantı noktasının protokol numarası X dinliyordur?" rpcbinddiğer pek çok ONC servisinin aksine, TCP ve UDP 111 numaralı bağlantı noktasını dinler; böylece bir ana bilgisayar adı veya IP adresi verilir, bir program sadece rpcbindbu ana bilgisayar veya IP adresini sorabilir . rpcbindBir sunucu bu ana bilgisayara kaydettiyse, uygun bağlantı noktası numarasıyla yanıt verir. Bu kayıt, çağrıldığında sunucu işlemi tarafından yapılır svc_create().

Örnekte, 100003, NFS için protokol numarasıdır. Bazı işlemler rpcbindprotokol numaralarını (100003) ve edindikleri TCP veya UDP portlarını vererek kayıt yaptırmışlardır . Bu rpcbinddurumda, 2049 numaralı bu bağlantı noktası numarasını, "100003 protokol numarası için hangi bağlantı noktasını kullanmalıyım" için yapılan herhangi bir çağrıya doğru şekilde vermektir.

Şimdi daha garip bölgeye giriyoruz. "0.0.0.0.8.1" çıktının "adres" sütununda rpcinfo. NFS sunucu işleminin "evrensel adresi" olduğundan, "0.0.0.0" önekine bahse girerim ki, sunucunun bind()bir port numarası alırken sistemde kullandığı IP adresidir (bu durumda INADDR_ANY) . "8.1" sonekinin ne olduğundan emin değilim ama rpcinfoçıktıya bakıldığında, NFS sunucusuyla temelde bir çekirdek iş parçacığı olması gerekir.


Benim durumumdaki en büyük sorun, II ağ trafiğini izlerken istemci tarafından sunucu üzerinde rcpbind için bir sorgu görmemesiydi. Bağlantı noktası numarası için bu sorgunun ne zaman olacağını biliyor musunuz?
SivaDotRender

@SivaDotRender -% 100 emin değilim, ancak istemci kodu protokol ve ana bilgisayar için bir tanıtıcı elde etmek için clnt_create () öğesini çağırdığında inanıyorum. TCP kullanmak için her şeyi ayarlamadıysanız, muhtemelen UDP üzerinden yapılacaktır.
Bruce Ediger

29
"8.1", bağlantı noktası numarasının iki baytıdır. 2049 = (8 * 256) + 1.
Kenster

Lütfen "program num" terimine bağlı kalın. Adam sayfası yaptığı gibi
炸鱼薯条德里克
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.