|
Bog BOS: RPC (Remote Procedure Call)) |
Последние изменения: |
Последнее изменение файла: 2008.06.26
Скопировано с www.bog.pp.ru: 2024.11.21
В статье описываются протоколы XDR, RPC, аутентификация, rpcbind (portmap) и особенности реализации в Linux (FC5).
XDR - External Data Representation Standard (старый RFC 1832, новый RFC 4506 или STD 67) - определяет формат представления данных в RPC (а стало быть и в NIS и NFS), что необходимо при обмене между компьютерами с различной архитектурой (предполагется, что в байте 8 бит и их порядок фиксирован, блоки данных дополняются до длины кратной 4 байтам): целые (32 бита), целые без знака, перечислимые, булевские, длинные целые (64 бита), длинные целые без знака, числа с плавающей точкой (32 бита, 64 бита, 128 бит), последовательности байт фиксированной и переменной длины (длина - 32 бита), строки ASCII переменной длины (длина - 32 бита), массивы элементов фиксированной и переменной длины (длина - 32 бита), структуры, объединения по определителю типа, void (0 байт). Подозрительно похоже на описания данных из языка C (ещё есть const и typedef), нет только указателей (этот синтаксис задействован под опциональные объединения). По назначению аналогичен ISO X.409 (ASN), но попроще (внешнее описание типов).
Протокол ONC RPC (Open Network Computing Remote Procedure Call) используется в NFS и NIS, подарен фирмой Sun интернет сообществу, описан в RFC 1831 (версия 2). При описании используется стандарт XDR. Протокол определяет взаимодействием между клиентом и сервером при выполнении запросов. Когда клиентская программа вызывает удалённую процедуру, то на самом деле на клиентском компьютере выполняется библиотечная функция, которая создаёт RPC пакет, записывает в него аргументы процедуры и посылает пакет на сервер. Библиотечная программа на сервере извлекает параметры из пакета, вызывает соответствующую прикладную процедуру. Результат работы процедуры оформляется в аналогичный пакет и посылается на клиентский компьютер. Данный подход упрощает программирование. В качестве транспортного уровня может использоваться TCP или UDP. На сервере может выполняться несколько служб (программ), определяемых уникальным номером (номера перечислены в /etc/rpc (rpc(5)), первые 536870912 номеров распределяются специальной службой фирмы Sun), например:
Каждая служба (программа) определяет набор процедур, которые клиент может вызвать. Т.е. при вызове клиент указывает версию RPC, номер программы, версию и номер процедуры, передаёт список параметров. Сервер выполняет требуемую процедуру и возвращает результат. Процедура 0 обычно не требует параметров, ничего не делает и возвращает результат нулевой длины, используется для тестирования наличия службы (а также для реализации RPCSEC_GSS). Имеется возможность пакетного режима работы (ответ только на последний запрос) и широковещательных запросов. RPC не имеет отношения к транспортной службе (UDP или TCP), т.е. обработка потерь запросов и двойных вызовов лежит на прикладном уровне (хотя имеется поле идентификатора запроса - XID, которое копируется в ответном сообщении, его можно использовать для проверки дубликатов). При использовании поточного транспорта (TCP) сообщения передаются в виде записей, разделённых на фрагменты переменной длины (в начале каждого фрагмента передаётся его длина и признак последнего фрагмента в записи).
Протокол RPC имеет встроенные средства аутентификации: запрос содержит "credential" (идентификатор клиента) и "verifier", ответ содержит "verifier" сервера. Предусмотрены различные типы аутентификации:
Служба (программа) rpcbind (portmapper) является неотъемлемой частью RPC, хотя и не является частью стандарта. Она принимает запросы на порту 111 (TCP или UDP) и выдаёт номер порта требуемой RPC службы (программы) по номеру службы (программы) и номеру версии. Протокол для обращения к rpcbind для регистрации программ и получения информации определяется в RFC 1833. Номер службы rpcbind - 100000. Версия 2 (Port Mapper Program Protocol), возвращает непосредственно номер порта TCP или UDP по номеру службы, номеру версии и типу протокола (TCP или UDP), процедуры:
Версии 3 и 4 (RPCBIND Program Protocol) используют "универсальный формат адреса" (текстовая строка, формат которой определяется отдельно для каждого типа транспорта), позволяют использовать широковещательные запросы, в реальном мире TCP/IP не используется (это была попытка фирмы Sun расширить TCP/IP сервисы на appletalk, decnet, sna, x25 и пр.). Процедуры (привязка по тройке: номер программы, номер версии, сетевой идентификатор; SET и UNSET должен использовать только локальный интерфейс (127.0.0.1)):
В FC5 служба rpcbind реализована пакетом portmap (версия протокола 2), в Fedora 7 пакет и служба переименованы в rpcbind. Демон portmap (portmap(8)) запускается скриптом /etc/rc.d/init.d/portmap (можно использовать стандартные утилиты chkconfig и service), ключи:
Для ограничения доступа с других хостов используется tcpwrapper (/etc/hosts.allow), имя программы: portmap, можно использовать только IP адреса, не забыть про широковещательные запросы (PC-NFS), должен быть доступен на чтение всем. Запросы на изменение таблиц принимаются только с локального компьютера. Запросы на изменение таблиц, связанные с привилигированными портами (< 1024) принимаются только с привилигированных портов. Перенаправление (?) запросов (с непривилигированного порта) с некоторыми ограничениями. Сигнал SIGINT включает (выключает) журналирование всех запросов на syslog (почему-то в auth).
Утилита pmap_dump выдаёт список всех зарегистрированных RPC программ (номер программы, номер версии, тип транспорта, номер порта). Утилита pmap_set позволяет "вручную" заполнить таблицы соответствия RPC программ и портов. При перезапуске portmap необходимо сохранить текущую таблицу в файл с помощью pmap_dump, перезапустить portmap, затем восстановить таблицу из файла с помощью pmap_set.
Утилита rpcinfo (входит в пакет glibc-common) делает RPC запросы на указанный хост и сообщает добытую информацию:
|
Bog BOS: RPC (Remote Procedure Call)) |
Последние изменения: |