.. _netconfgl: Служба netconf ============== В ПАК “Фортикс” реализована возможность удалённого управления узлом по протоколу NETCONF (Network Configuration Protocol) (см. RFC 6241). Протокол NETCONF реализует обмен управляющими XML-сообщениями и работает по принципу “клиент-сервер”. ПАК “Фортикс” выступает в роли сервера. Аавторизованные клиенты NETCONF имеют возможность запрашивать/изменять конфигурацию ПАК “Фортикс” и инициировать выполнение определённых RPC-процедур (Remote Procedure Call) на ПАК. В ПАК “Фортикс” в качестве транспорта протокола NETCONF используется протокол SSH (см. RFC 6242). Протокол NETCONF работает в двух режимах: ``listen`` и ``call-home``. Режим ``listen`` – стандартный режим сервера. ПАК “Фортикс” ожидает на сокете и принимает SSH-соединения от клиентов. По умолчанию используется TCP-порт 830. В случае успешной идентификации и аутентификации пользователя SSH, ему разрешаются операции с конфигурацией и RPC-процедуры согласно его ролевой группе, то есть (при включённом NACM) к операциям NETCONF применяются ограничения согласно настройкам ролевой модели (см. раздел :numref:`{number} {name} `). Режим ``call-home`` (см. RFC 8071) применим в случае, если IP-адрес узла заранее неизвестен или ПАК “Фортикс” находится за областью NAT. В режиме ``call-home`` ПАК “Фортикс” первый инициирует TCP-соединение с клиентом (с периодичностью, согласно собственным настройкам). Далее клиент по данному TCP-соединению инициирует транспортную сессию (например, SSH) с идентификацией/аутентификацией и начинает обмен NETCONF-процедурами. Таким образом, ПАК “Фортикс” самостоятельно “звонит домой” (от названия режима) клиенту NETCONF для получения от него команд управления. Краткое описание настроек службы netconf ---------------------------------------- Настройка режима listen ~~~~~~~~~~~~~~~~~~~~~~~ Настройка режима ``listen`` осуществляются на следующем уровне конфигурации: :: [edit netconf-server listen] На данном уровне конфигурации доступны следующие настройки: - ``idle-timeout `` – указать тайм-аут автоматического закрытия сессии NETCONF при отсутствии запросов от клиента, где ```` – число секунд, по умолчанию – 180; - ``endpoints endpoint ssh`` – перейти на уровень конфигурации именованной группы настроек одного слушающего сокета протокола NETCONF/SSH, где ```` – строка, возможно определение нескольких именнованных групп на данном уровне конфигурации: - ``tcp-server-parameters`` – перейти на уровень конфигурации TCP-соединений для ожидающего и принимающего сокета: - ``local-address
`` – указать IP-адрес, на котором ожидаются и принимаются входящие соединения, где ``
`` – IPv4-адрес в формате ``A.B.C.D``; - ``local-port `` – указать TCP-порт, на котором ожидаются и принимаются входящие соединения, где ```` – число от 1 до 65535, по умолчанию – 830; - ``keepalives`` – перейти на уровень конфигурации политики пересылки пакетов, поддерживающих соединение (см. RFC 9293, п. 3.8.4): - ``idle-time `` – указать период отсутствия трафика по TCP-соединению, по истечении которого начинается передача пакетов “TCP keep-alive”, где ```` – число секунд, по умолчанию – 7200; - ``max-probe `` – указать максимальное количество переданных подряд пакетов “keep-alive”, оставленных без ответа, до определения TCP-соединения как потерянного, где ```` – число от 1 до 65535, по умолчанию – 9; - ``probe-interval `` – указать интервал между передачей пакетов “keep-alive”, оставленных без ответа, где ```` – число секунд, по умолчанию – 75; - ``ssh-server-parameters`` – перейти на уровень конфигурации SSH-сервера для слушающего сокета: - ``server-identity host-key public-key`` – перейти на уровень конфигурации именованной ассоциации ключевой пары, использующейся для аутентификации сервера SSH, где ```` – строка, возможно определение нескольких именнованных ассоциаций на данном уровне конфигурации: - ``central-keystore-reference `` – указать ссылку на ключевую пару, хранящуюся на глобальном уровне конфигурации ``[edit keystore]``, где ```` – строка (см. ниже); - ``inline-definition`` – перейти на уровень конфигурации непосредственного хранения ключевой пары, без ссылок на другие хранилища (см. ниже); - ``client-authentication`` – перейти на уровень конфигурации аутентификации клиентов NETCONF/SSH: - ``auth-timeout `` – указать тайм-аут аутентификации, где ```` – число секунд, по умолчанию – 30; - ``endpoint-reference `` – использовать помимо собственных методы аутентификации клиентов из другой именованной группы настроек ``endpoint``, где ```` – имя существующей именованной группы настроек ``endpoint``; - ``transport-params`` – перейти на уровень конфигурации транспортного уровня SSH: - ``encryption encryption-alg `` – указать приоритетный список алгоритмов шифрования, где ```` – алгоритм(ы) из предложенного в командной строке списка (если настройка не задана, используются алгоритмы по умолчанию); - ``host-key host-key-alg `` – указать приоритетный список алгоритмов подписи, где ```` – алгоритм(ы) из предложенного в командной строке списка; - ``key-exchange key-exchange-alg `` – указать приоритетный список алгоритмов выработки общего секрета, где ```` – алгоритм(ы) из предложенного в командной строке списка; - ``mac mac-alg `` – указать приоритетный список алгоритмов имитозащиты, где ```` – алгоритм(ы) из предложенного в командной строке списка. На уровне конфигурации ``[edit netconf-server listen endpoints endpoint ssh ssh-server-parameters server-identity host-key public-key inline-definition]`` доступны следующие настройки: - ``public-key-format`` – перейти на уровень конфигурации формата открытого ключа: - ``ssh-public-key-format`` – использовать формат открытого ключа SSH (см. RFC 4253, п.6); - ``subject-public-key-info-format`` – использовать ASN.1-кодировку структуры ``SubjectPublicKeyInfo`` (см. RFC 5280); - ``public-key `` – определить значение открытого ключа, где ```` – строка в представлении BASE64; - ``private-key-format`` – перейти на уровень конфигурации формата закрытого ключа: - ``ec-private-key-format`` – использовать ASN.1-кодировку структуры ``ECPrivateKey`` (см. RFC 5915); - ``one-asymmetric-key-format`` – использовать ASN.1-кодировку структуры ``OneAsymmetricKey`` (см. RFC 5958); - ``openssh-private-key-format`` – использовать формат закрытого ключа OpenSSH; - ``private-key-info-format`` – использовать ASN.1-кодировку структуры ``PrivateKeyInfo`` (см. RFC 5208, PKCS #8); - ``rsa-private-key-format`` – использовать ASN.1-кодировку структуры ``RSAPrivateKey`` (см. RFC 3447); - ``cleartext-private-key `` – определить значение закрытого ключа, где ```` – строка в представлении BASE64. Настройка режима call-home ~~~~~~~~~~~~~~~~~~~~~~~~~~ Настройка режима call-home осуществляется на следующем уровне конфигурации: :: [edit netconf-server call-home] На данном уровне конфигурации доступны следующие настройки: - ``netconf-client `` – перейти на уровень конфигурации именованной группы настроек, относящейся к одному клиенту NETCONF, где ```` – строка, возможно определение нескольких именнованных групп на данном уроне конфигурации: - ``connection-type`` – перейти на уровень конфигурации политики соединения: - ``persistent`` – использовать постоянное соединение (в случае отсутствия, закрытия или потери соединения сервер повторяет попытку соединения с периодичностью, указанной в настройке ``max-wait``); - ``periodic`` – перейти на уровень конфигурации периодичного соединения (настройки данного уровня конфигурации применяются совместно с настройками уровня конфигурации ``reconnect-strategy``): - ``period `` – указать период повторного соединения от начала инициации предыдущего соединения, где ```` – число минут, по умолчанию – 60, если соединение закрыто аварийно (без использования процедуры ``close-session``), новое соединение инициируется немедленно; - ``idle-timeout `` – указать период, по истечении которого при отсутствии трафика соединение автоматически закрывается, где ```` – число секунд, по умолчанию – 180; - ``anchor-time `` – указать точку отсчёта времени для периодов соединений, как в будущее, так и в прошлое, где – время, кратное минуте (если настройка не задана, периоды отсчитываются от момента применения конфигурации); - ``reconnect-strategy`` – перейти на уровень конфигурации политики повторного соединения: - ``max-attempts `` – указать количество неудачных произведённых подряд попыток соединения, после которых осуществляется переход к следующей группе настроек ``endpoint``, если она имеется, и соединение принимается неудачным, где ```` – число, по умолчанию – 3; - ``max-wait `` – указать период ожидания ответа на соединение, по истечении которого осуществляется переход к следующей попытке, где ```` – число секунд, по умолчанию – 5; - ``start-with first-listed`` – испозовать первую группу настроек ``endpoint`` при следующем запланированном соединении (настройка установлена по умолчанию); - ``start-with last-connected`` – испозовать последнюю удачно применённую группу настроек ``endpoint`` при следующем запланированном соединении; - ``start-with random-selection`` – испозовать случайную группу настроек ``endpoint`` при следующем запланированном соединении; - ``endpoints endpoint ssh`` – перейти на уровень конфигурации именованной группы настроек одного клиента NETCONF/SSH, где ```` – строка, возможно определение нескольких именнованных групп на данном уровне конфигурации: - ``tcp-client-parameters`` – перейти на уровень конфигурации TCP-соединения с клиентом: - ``remote-address
|`` – указать IP-адрес/имя хоста NETCONF-клиента, ожидающего и принимающего в режиме ``call-home``, где ``
`` – IPv4-адрес в формате ``A.B.C.D[/mask]``, ```` – имя хоста; - ``remote-port `` – указать порт NETCONF-клиента, ожидающего и принимающего в режиме ``call-home``, где ```` – число от 1 до 65535, по умолчанию – 4334; - ``local-address
`` – указать локальный IP-адрес, через который инициируется TCP-соединение ``call-home``, где ``
`` – IPv4-адрес в формате ``A.B.C.D[/mask]``, по умолчанию – 0.0.0.0/:: (первый подходящий); - ``local-port `` – указать локальный порт, от которого инициируется TCP-соединение ``call-home``, где ```` – число от 1 до 65535, по умолчанию – 0 (первый свободный); - ``keepalives`` – перейти на уровень конфигурации политики пересылки пакетов, поддерживающих соединение (аналогично уровню конфигурации ``[edit netconf-server listen ... tcp-server-parameters keepalives]``); - ``ssh-server-parameters`` – перейти на уровень конфигурации SSH-сервера: - ``server-identity host-key public-key`` – указать имя ассоциации ключевой пары для аутентификации SSH-сервера (аналогично режиму ``listen``), где ```` – строка; - ``client-authentication`` – перейти на уровень конфигурации аутентификации клиентов NETCONF/SSH (аналогично режиму ``listen``); - ``transport-params`` – перейти на уровень конфигурации транспортного уровня SSH (аналогично режиму ``listen``). Настройка глобального хранилища секретных ключей (keystore) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Настройка глобального хранилища секретных ключей осуществляется на следующем уровне конфигурации: :: [edit keystore] На данном уровне конфигурации доступны следующие настройки (далее перечислены только настройки, относящиеся к хранению закрытых ключей, использующихся в секции ``[edit ... server-identity]`` настроек сервера NETCONF): - ``asymmetric-keys asymmetric-key `` – перейти на уровень конфигурации именнованной пары асимметричных ключей, которая используется в настройках ``netconf-server ... ssh-server-parameters server-identity ... central-keystore-reference``, где ```` – строка, возможно определение нескольких именнованных пар на данном уровне конфигурации: - ``public-key-format`` – перейти на уровень конфигурации формата открытого ключа: - ``ssh-public-key-format`` – использовать формат открытого ключа SSH (см. RFC 4253, п.6); - ``subject-public-key-info-format`` – использовать ASN.1-кодировку структуры ``SubjectPublicKeyInfo`` (см. RFC 5280); - ``public-key `` – определить значение открытого ключа, где ```` – строка в представлении BASE64; - ``private-key-format`` – перейти на уровень конфигурации формата закрытого ключа: - ``ec-private-key-format`` – использовать ASN.1-кодировку структуры ``ECPrivateKey`` (см. RFC 5915); - ``one-asymmetric-key-format`` – использовать ASN.1-кодировку структуры ``OneAsymmetricKey`` (см. RFC 5958); - ``openssh-private-key-format`` – использовать формат закрытого ключа OpenSSH; - ``private-key-info-format`` – использовать ASN.1-кодировку структуры ``PrivateKeyInfo`` (см. RFC 5208, PKCS #8); - ``rsa-private-key-format`` – использовать ASN.1-кодировку структуры ``RSAPrivateKey`` (см. RFC 3447); - ``cleartext-private-key `` – определить значение закрытого ключа, где ```` – строка в представлении BASE64. .. _examplelisten: Пример минимальной настройки службы netconf в режиме listen ----------------------------------------------------------- В данном подразделе рассматривается пример настройки доступа по протоколу NETCONF для двух учётных записей: - сетевой администратор ``netadmin`` с аутентификацией по паролю; - администратор ``admin`` с аутентификацией по открытому ключу. Для создания учётных записей применяются команды: :: # setup login netadmin # setup login netadmin password Change password for netadmin Password:**** Retype password:**** # setup login admin # commit .. note:: Пароль для учётной записи ``admin`` не задан, так как аутентификация осуществляется только по открытому ключу. Для добавления созданных учётных записей в соответствующие ролевые группы применяются команды: :: # set nacm groups group netadm user-name netadmin # set nacm groups group adm user-name admin # commit Для добавления разрешённых методов аутентификации по протоколу NETCONF к учётным записям применяются команды: :: # set system auth netconf allow-login netadmin method keyboard-interactive # set system auth netconf allow-login admin method public-key # commit Для работы ПАК “Фортикс” в качестве сервера SSH необходимо указание пары асимметричных ключей для подтверждения подлинности. Для создания закрытого асимметричного ключа применяется команда: :: # setup netconf-identity [] |noindent| где - ```` – произвольный текстовый идентификатор, используемый в дальнейшем для ссылки на ключ; - ```` – алгоритм из предложенного в командной строке списка, по умолчанию – ``rsa2048`` (рекомендуется). Для генерации ключевой пары применяется команда: :: # setup netconf-identity idkey # commit Конфигурация после выполнения указанной команды: :: keystore asymmetric-keys asymmetric-key idkey { public-key-format ssh-public-key-format private-key-format rsa-private-key-format cleartext-private-key } .. admonition:: Примечания: :class: note 1 Настройка ``cleartext-private-key`` имеет атрибут ``nacm:default-deny-all``, поэтому отображается для учетной записи администратора ``root``. Для других учётных записей (предустановленной ролевой модели) данное поле скрыто. 2 Открытый ключ в поле ``public-key`` указывать необязательно, так как он автоматически генерируется NETCONF-сервером из закрытого ключа. Настройка одного сокета, ожидающего соединение по протоколу SSH, осуществляется на следующем уровне конфигурации: :: [edit netconf-server listen endpoints endpoint p1 ssh] |noindent| где ``p1`` – имя группы настроек одного сокета. Для указания локального IP-адреса, на котором служба ожидает NETCONF-соединения, применяется команда: :: [edit netconf-server listen endpoints endpoint p1 ssh] # set tcp-server-parameters local-address 0.0.0.0 Для предоставления службе возможности ожидать соединения на всех интерфейсах указан адрес ``0.0.0.0``. .. note:: На данном этапе настройки команда ``commit`` не применима из-за ошибки целостности конфигурации. Настройка SSH-сервера осуществляется на следующем уровне конфигурации: :: [edit netconf-server listen endpoints endpoint p1 ssh ssh-server-parameters] Для указания ссылки на ключ ПАК “Фортикс”, используемого в протоколе SSH для подтверждения подлинности, применяется команда: :: [edit netconf-server listen endpoints endpoint p1 ssh ssh-server-parameters] # set server-identity host-key key1 public-key central-keystore-reference idkey |noindent| где - ``key1`` – имя ассоциации ключевой пары; - ``idkey`` – имя ассиметричного ключа. Для аутентификации учётных записей при подключении по протоколу NETCONF поддерживаются режимы ``publickey`` (для авторизации по SSH-ключу) и ``keyboard-interactive`` (для авторизации по паролю или по протоколу RADIUS). Для просмотра конфигурации применяются команды: :: # top + Конфигурация NETCONF-сервера согласно указанным настройкам: :: netconf-server listen endpoints endpoint p1 ssh { tcp-server-parameters local-address 0.0.0.0 ssh-server-parameters server-identity host-key key1 public-key central-keystore-reference idkey } Для проверки работоспособности вышеуказанных настроек применим клиент NETCONF. В качестве клиента возможно использование утилиты ``netopeer2-cli`` на сторонней Linux-машине. При этом на данной машине должен присутствовать сгенерированный закрытый ключ для учётной записи ``admin`` в файле ~/.ssh/id_rsa. Для использования утилиты ``netopeer2-cli`` необходимо последовательно собрать и установить следующие пакеты: - libyang – `https://github.com/CESNET/libyang `__; - sysrepo – `https://github.com/sysrepo/sysrepo.git `__; - libnetconf2 – `https://github.com/CESNET/libnetconf2 `__; - netopeer2 – `https://github.com/CESNET/netopeer2.git `__. Для запуска утилиты применяется команда: :: $ netopeer2-cli > _ Для определения приоритетов методов аутентификации применяются команды: :: > auth pref publickey 1 > auth pref interactive 2 > auth pref password -1 > auth pref The SSH authentication method preferences: 'publickey': 1 'password': disabled 'interactive': 2 Для соединения с ПАК “Фортикс” по протоколу NETCONF/SSH от имени учётной записи ``netadmin`` применяется команда: :: > connect --host --login netadmin Keyboard-Interactive Authentication Please enter your authentication token Password: ******** > _ |noindent| где ```` – IP-адрес ПАК “Фортикс”. При отсутсвии сообщений об ошибках полагается, что аутентификация прошла успешно. Для проверки NETCONF-соединения применяется команда: :: > get-config --source running В случае успеха выводится конфигурация узла ПАК “Фортикс” в формате XML. Для закрытия соединения учётной записи ``netadmin`` применяется команда: :: > disconnect Для регистрации ключевой пары учётной записи ``admin`` используются команды: :: > auth keys add /home/user-name/.ssh/id_rsa.pub /home/user-name/.ssh/id_rsa > auth keys The keys used for SSH authentication: #0: /home/user-name/.ssh/id_rsa.pub (private /home/user-name/.ssh/id_rsa) Для инициализации соединения от имени учётной записи администратора ``admin`` применяется команда: :: > connect --host --login admin > _ |noindent| где ```` – IP-адрес ПАК “Фортикс”. При отсутствии запроса на введение пароля полагается, что выполнена аутентификация по ключу. Для проверки работоспособности NETCONF-соединения применяется команда: :: > get-config --source running Для выхода из утилиты применяется команда: :: > exit Минимальная настройка службы netconf в режиме call-home ------------------------------------------------------- Минимальная настройка службы в режиме ``call-home`` аналогична настройкам режима ``listen``, за исключением настройки ``tcp-client-parameters remote-address``, где для режима ``call-home`` указывается адрес клиента, с которым ПАК “Фортикс” устанавливает TCP-соединение. Кроме того, указывается тип подключения (настройка ``connection-type``) – постоянное или периодическое. В примере используется постоянное (``persistent``) подключение, то есть на ПАК “Фортикс” (в случае отсутствия соединения) постоянно осуществляется попытка подключения к клиенту (по умолчанию – каждые 5 секунд на порт 4334). Пример конфигурации минимальной настроки режима ``call-home``: :: netconf-server { call-home netconf-client client1 { endpoints endpoint p2 ssh { tcp-client-parameters remote-address ssh-server-parameters server-identity host-key key1 public-key central-keystore-reference idkey } connection-type persistent } } Для проверки работоспособности с помощью утилиты ``netopeer2-cli`` (полагается, что выполнены настройки ``auth pref`` и ``auth keys`` из примера подраздела :numref:`{number} {name} `) применяеются команды: :: $ netopeer2-cli > listen --login netadmin Waiting 60s for an SSH Call Home connection on port 4334... Keyboard-Interactive Authentication Please enter your authentication token Password: ******** > get-config --source running ... Конфигурация в формате XML > disconnect > listen --login admin Waiting 60s for an SSH Call Home connection on port 4334... > get-config --source running ... Конфигурация в формате XML > exit RPC-процедуры ------------- Стандартные RPC ~~~~~~~~~~~~~~~ В ПАК “Фортикс” поддерживаются представленные в таблице :numref:`%s ` стандартные RPC-процедуры протокола NETCONF. .. _table-netconf-rpc-procedures: .. list-table:: Стандартные RPC-процедуры протокола NETCONF в ПАК “Фортикс” :widths: 30 70 :header-rows: 1 - - RPC - Стандарт - - cancel-commit - RFC 6241, 8.4.4.1 - - close-session - RFC 6241, 7.8 - - commit - RFC 6241, 8.3.4.1 - - copy-config - RFC 6241, 7.3; RFC 6243, 4.5.1 - - create-subscription - RFC 5277, 2.1.1 - - delete-config - RFC 6241, 7.4 - - delete-subscription - RFC 8639, 2.4.4 - - discard-changes - RFC 6241, 8.3.4.2 - - edit-config - RFC 6241, 7.2 - - edit-data - RFC 8526, 3.1.2 - - establish-subscription - RFC 8639, 2.4.2 - - factory-reset - RFC 8808, 2 - - get - RFC 6241, 7.7 - - get-config - RFC 6241, 7.1; RFC 6243, 4.5.1 - - get-data - RFC 8526, 3.1.1 - - get-schema - RFC 6022, 3.1 - - kill-session - RFC 6241, 7.9 - - kill-subscription - RFC 8639, 2.4.5 - - lock - RFC 6241, 7.5; RFC 8526, 3.2 - - modify-subscription - RFC 8639, 2.4.3 - - resync-subscription - RFC 8641, 4.4.4 - - unlock - RFC 6241, 7.6; RFC 8526, 3.2 - - validate - RFC 6241, 8.6.4.1; RFC 8526, 3.2 RPC-процедуры, специфические для ПАК “Фортикс” ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ exec-script ^^^^^^^^^^^ Процедура ``exeс-script`` позволяет выполнять скрипты на ПАК “Фортикс” и получать результаты его выполнения по протоколу NETCONF (см. раздел :numref:`{number} {name} `). YANG-схема RPC-процедуры ``exec-script``: :: module fx-system { yang-version "1.1"; namespace "http://zts.ru/fx/yang/system"; prefix "system"; rpc exec-script { description "Execute FX script"; input { leaf script { description "Path or @[script...]"; type string; mandatory true; } leaf-list args { description "Arguments"; type string; } } output { leaf status { description "Status"; type boolean; } leaf retval { description "Return value"; type int32; } leaf stdout { description "Stdout"; type string; } leaf stderr { description "Stderr"; type string; } } } } Например, на ПАК “Фортикс” используется учётная запись ``netadmin`` (см. выше). Для создания скрипта ``hello.lua`` в домашней директории пользователя применяется команда: :: > edit /home/netadmin/hello.lua Скрипт: :: --@help Simple hello-world script --@arg a1:string Argument 1 --@arg a2:string Argument 2 print("Hello from Fortics!") print("Arg1=" .. ARGS.a1) print("Arg2=" .. ARGS.a2) command("no-command") Для сохранения файла и выхода из редактора используются следующие сочетания клавиш: + , + . .. note:: В последней строке вызывается несуществующая команда для получения ошибочного вывода в стандартном потоке вывода ошибок (``stderr``). Для вызова RPC-процедуры на сторонней Linux-машине используется утилита ``netopeer2-cli`` (полагается, что выполнены необходимые настройки из примеров выше). Предварительно создаётся файл с RPC-процедурой следующего содержания: :: $ vim rpc.xml some argument number one some argument number two Для получения результата выполнения скрипта вызывается RPC-процедура с использованием утилиты ``netopeer2-cli``: :: $ netopeer2-cli > connect --host --login netadmin Keyboard-Interactive Authentication Please enter your authentication token Password: ******** > user-rpc --content rpc.xml DATA false 1 Hello from Fortics! Arg1=some argument number one Arg2=some argument number two <3>core: Error: Illegal command <3>system: exit code 1 |noindent| где ```` – IP-адрес ПАК “Фортикс”. Предусмотрена возможность передачи скрипта непосредственно в теле RPC-процедуры (без создания файла скрипта на ПАК “Фортикс”). Для этого в начале тела тэга `` Вызов RPC-процедуры через утилиту ``netopeer2-cli``: :: > user-rpc --content rpc.xml DATA true 0 Hello, World! Counting to 5... 1 2 3 4 5 Software: Fortics 1.0-0d-240625 (Resurrection) Version: 1.0 Release: 0d Revision: r0.f3858b6dfa Date: 2024.06.25 01:19:56 Kernel: 5.10.208 x86_64 Status: dev r0 debug License: Full HWID: 3cba-8fc7-fdb7-0014-92af Hash (kernel): 35b0fbfe5be498758fa42a1dae3140970cf6061dae260ca7325e6c53805e8069 Hash (rootfs): a1904fdb1cc2dec51ae550007d4653e84fd6d7b7042836e2737c0bdf6bb17f5f Hash (loader): e34300f7b5fc767f565ffbf09bda715541f51ff843deb62f2698726a71de8648