Що саме робить rpcbind?


39

Відповідно до документації:

Утиліта rpcbind [3] відображає послуги RPC у порти, на яких вони слухають. Процеси RPC повідомляють rpcbind при їх запуску, реєструючи порти, які вони прослуховують, та номери програм RPC, які вони очікують, щоб вони обслуговувалися. Потім клієнтська система зв'язується з rpcbind на сервері з певним номером програми RPC. Служба 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?

Відповіді:


23

rpcbindє близьким аналогом BIND або насправді будь-якого DNS-сервера. Якщо я пам'ятаю правильно, ви вибираєте або надаєте номер протоколу, коли компілюєте декларацію інтерфейсу RPC у код сервера та клієнтського заглушки rpcgen.

Коли клієнт підписується на даний інтерфейс на певному хості, як правило, під час clnt_create()дзвінка, код заглушки задає rpcbindцьому хосту запитання, як-от на кшталт "на якому UDP або TCP-портах прослуховується номер протоколу X?" rpcbindНа відміну від більшості інших служб ONC, прослуховує порт TCP та UDP 111, тому, задавши ім'я хоста або IP-адресу, програма може просто запитати rpcbindцей хост або IP-адресу. rpcbindвідповідає відповідним номером порту, якщо сервер зареєстрував його на цьому хості. Ця реєстрація проводиться серверним процесом під час дзвінка svc_create().

У вашому прикладі 100003 - номер протоколу для NFS. Деякі процеси зареєструвались rpcbind, вказавши номер свого протоколу (100003) та будь-який порт TCP або UDP, який вони придбали. Це rpcbindналежним чином правильно вказати номер порту, у вашому випадку, 2049 для будь-якого дзвінка на нього за тим, "який порт я повинен використовувати для номера протоколу 100003".

Тепер ми потрапляємо на більш дивні території. "0.0.0.0.8.1" знаходиться у стовпці "адреса" rpcinfoвиводу. Оскільки це "універсальна адреса" процесу сервера NFS, я ставлю на облік префікс "0.0.0.0" - це IP-адреса (INADDR_ANY в цьому випадку), яку сервер використовував у bind()системному виклику при отриманні номера порту. Я не впевнений, що таке суфікс "8.1", але дивлячись на rpcinfoвихід, він повинен мати щось спільне з сервером NFS, в основному це нитка ядра.


Найбільша проблема в моєму випадку полягала в тому, що я не бачив клієнта запит на rcpbind на сервері, коли я контролював мережевий трафік. Чи знаєте ви, коли цей запит на номер порту трапляється?
SivaDotRender

@SivaDotRender - Я не впевнений на 100%, але я вважаю, що код клієнта викликає clnt_create (), щоб отримати обробку для протоколу та хоста. Це, ймовірно, буде зроблено через UDP, якщо ви не налаштуєте все, щоб використовувати TCP.
Брюс Едігер

29
"8.1" - це два байти номера порту. 2049 = (8 * 256) + 1.
Кенстер

Будь ласка, дотримуйтесь терміна "число програми". Як це робить сторінка man
炸鱼 薯条 德里克
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.