Dokładnie co robi rpcbind?

39

Zgodnie z dokumentacją:

Narzędzie rpcbind [3] mapuje usługi RPC na porty, na których nasłuchują. Procesy RPC powiadamiają rpcbind o uruchomieniu, rejestrując porty, na których nasłuchują, oraz numery programów RPC, które mają obsługiwać. System klienta następnie kontaktuje się z serwerem rpcbind na serwerze z określonym numerem programu RPC. Usługa rpcbind przekierowuje klienta do odpowiedniego numeru portu, aby mógł komunikować się z żądaną usługą

Aby to przetestować, skonfigurowałem serwer i klient NFS i monitorowałem ruch między nimi. Z tego, co widziałem, klient wiedział już, że usługa NFS na serwerze nasłuchuje na porcie 2049.

Kiedy więc rcpbind wchodzi w grę? Gdy robię to rpcinfona serwerze, otrzymuję:

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

co 0.0.0.0.8.1znaczy w tym przypadku? Jak to się przekłada na port 2049?

SivaDotRender
źródło

Odpowiedzi:

23

rpcbindjest bliskim analogiem BIND, a właściwie dowolnego serwera DNS. Jeśli dobrze pamiętam, wybierasz lub otrzymujesz numer protokołu, kiedy kompilujesz deklarację interfejsu RPC z kodem pośredniczącym serwera i klienta rpcgen.

Kiedy klient rejestruje się w danym interfejsie na określonym hoście, zwykle za pomocą clnt_create()połączenia, kod pośredniczący zadaje rpcbindtemu hostowi pytanie, coś w rodzaju „na jakim porcie UDP lub TCP nasłuchuje protokół X?” rpcbind, w przeciwieństwie do większości innych usług ONC, nasłuchuje na porcie TCP i UDP 111, więc biorąc pod uwagę nazwę hosta lub adres IP, program może po prostu zapytać rpcbindna tym hoście lub adresie IP. rpcbindodpowiada odpowiednim numerem portu, jeśli serwer zarejestrował się na nim na tym hoście. Rejestracja jest wykonywana przez proces serwera podczas jego wywoływania svc_create().

W twoim przykładzie 100003 jest numerem protokołu dla NFS. Niektóre procesy zostały zarejestrowane rpcbind, podając numer protokołu (100003) i uzyskany port TCP lub UDP. rpcbindPrawidłowe podanie tego numeru portu, w twoim przypadku 2049, zależy od każdego wywołania „jakiego portu powinienem użyć dla numeru protokołu 100003”.

Teraz wchodzimy na terytorium dziwniejsze. „0.0.0.0.8.1” znajduje się w kolumnie „adres” rpcinfowyjścia. Ponieważ jest to „uniwersalny adres” procesu serwera NFS, założę się, że prefiksem „0.0.0.0” jest adres IP (w tym przypadku INADDR_ANY), którego serwer używał w bind()wywołaniu systemowym podczas uzyskiwania numeru portu. Nie jestem pewien, co to jest przyrostek „8.1”, ale patrząc na rpcinfodane wyjściowe, musi to mieć coś wspólnego z tym, że serwer NFS jest po prostu wątkiem jądra.

Bruce Ediger
źródło
Największym problemem w moim przypadku było to, że II nie widziałem zapytania do rcpbind na serwerze przez klienta, gdy monitorowałem ruch sieciowy. Czy wiesz, kiedy nastąpi zapytanie o numer portu?
SivaDotRender
@SivaDotRender - Nie jestem w 100% pewien, ale uważam, że gdy kod klienta wywołuje funkcję clnt_create (), aby uzyskać obsługę protokołu i hosta. Prawdopodobnie będzie to zrobione za pomocą UDP, chyba że skonfigurujesz wszystko do korzystania z TCP.
Bruce Ediger,
29
„8.1” to dwa bajty numeru portu. 2049 = (8 * 256) + 1.
Kenster,
Proszę trzymać się terminu „numer programu”. Jak robi strona
podręcznika