@ Карта сайта News Автора!

Bog BOS: RPC (Remote Procedure Call))

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL

Последнее изменение файла: 2008.06.26
Скопировано с www.bog.pp.ru: 2024.11.23

Bog BOS: RPC (Remote Procedure Call))

В статье описываются протоколы XDR, RPC, аутентификация, rpcbind (portmap) и особенности реализации в Linux (FC5).

XDR

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), но попроще (внешнее описание типов).

RPC

Протокол 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

Протокол RPC имеет встроенные средства аутентификации: запрос содержит "credential" (идентификатор клиента) и "verifier", ответ содержит "verifier" сервера. Предусмотрены различные типы аутентификации:

rpcbind (portmap)

Служба (программа) 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)):

Особенности RPC в Linux

В 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 запросы на указанный хост и сообщает добытую информацию:

Ссылки

@ Карта сайта News Автора!

Bog BOS: RPC (Remote Procedure Call))

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru