Что именно делает 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?

SivaDotRender
источник

Ответы:

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-страница делает
德里克 薯条 德里克