[Документация Yandex Cloud](../../index.md) > [Yandex Compute Cloud](../index.md) > [Практические руководства](index.md) > Доставка USB-устройств на виртуальную машину или сервер BareMetal

# Доставка USB-устройств на виртуальную машину или сервер BareMetal

В данном руководстве вы настроите доставку USB-устройств на [сервер](../../baremetal/concepts/servers.md) Yandex BareMetal через [VPN-подключение](../../glossary/vpn.md) поверх публичного сегмента сети интернет. Для этого вы используете технологию _USB over IP_ и свободно распространяемое программное обеспечение в составе дистрибутивов [Linux](https://ru.wikipedia.org/wiki/Linux).

{% note info %}

Аналогичным образом USB-устройства можно доставить на [виртуальную машину](../concepts/vm.md) Yandex Compute Cloud.

{% endnote %}

Технология USB over IP позволяет передавать данные USB-устройств по сети (локальной или интернет) так, как если бы они были подключены к компьютеру-клиенту напрямую. Это особенно важно в ситуациях, когда физическое подключение USB-устройств к компьютеру затруднено или невозможно.

С помощью технологии USB over IP:
* USB-устройства можно доставлять в облачные сервисы, а клиентами в отношении удаленных USB-устройств могут выступать виртуальные машины Compute Cloud или серверы BareMetal.
* К ВМ и серверам можно подключать удаленные принтеры, сканеры, камеры, аппаратные токены, флеш-накопители и другие периферийные USB-устройства.
* Для доставки USB-устройств можно использовать как специализированные [ПАК решения](https://ru.wikipedia.org/wiki/Программно-аппаратный_комплекс), так и свободно распространяемое программное обеспечение.
* Ключи, токены, смарт-карты, доставляемые на серверы и ВМ, могут размещаться в контролируемом периметре с ограниченным доступом.
* Подключение к удаленным USB-устройствам может быть ограничено стандартными средствами сетевой безопасности.

{% note warning %}

Если на удаленное USB-устройство будут выполняться операции записи, то использование технологии USB over IP требует высокой степени надежности сети. Кроме того, эта технология не подходит для подключения USB-устройств, для которых необходима высокая скорость передачи данных.

{% endnote %}

Схема решения:

![usb-over-ip](../../_assets/tutorials/usb-over-ip.svg)

* **USB-клиент** на облачной площадке – виртуальная машина или физический сервер под управлением ОС Windows или Linux. В данном руководстве в качестве клиента будет использован физический сервер под управлением ОС Linux Ubuntu 24.04 LTS, арендованный в сервисе Yandex BareMetal.
* **USB-сервер** на удаленной площадке – устройство под управлением ОС Linux с подключением к локальной сети и VPN-доступом (если доставка данных USB-устройства осуществляется через интернет). В USB-порты USB-сервера будут физически вставляться USB-устройства. В качестве сервера могут использоваться микро-компьютеры, например [Raspberry Pi](https://ru.wikipedia.org/wiki/Raspberry_Pi). В данном руководстве в качестве сервера будет использован компьютер под управлением ОС Linux Ubuntu 22.04 LTS, оснащенный несколькими USB-портами.
* **Программное обеспечение**. В данном руководстве доставка USB-устройства на клиент будет осуществлена с помощью программы `usbip` с использованием стандартного набора системных утилит и модулей ядра, входящих в пакет `linux-tools`.
* **Подключаемое USB-оборудование**:
    * USB-накопитель с данными.
    * USB-токен.
* **Способ доставки по сети**. Доставка удаленных USB-устройств будет выполняться через VPN-подключение поверх публичного сегмента сети интернет с использованием решения [WireGuard](https://www.wireguard.com/). 

    Предлагаемая схема с использованием WireGuard носит демонстрационный характер, вы можете использовать любую другую технологию для связи удаленных серверов.

Чтобы доставить USB-устройства на сервер BareMetal с помощью технологии USB over IP:

1. [Подготовьте облако к работе](#before-you-begin).
1. [Настройте облачную сеть](#setup-vpc).
1. [Создайте виртуальную машину для VPN-сервера](#create-vpn-server).
1. [Создайте приватную подсеть BareMetal](#create-subnet).
1. [Арендуйте сервер BareMetal](#rent-server).
1. [Настройте VPN](#setup-vpn).
1. [Настройте USB over IP](#setup-usbip).
1. [Убедитесь в работоспособности решения](#test-solution).

Если созданные ресурсы вам больше не нужны, [удалите их](#clear-out).

## Перед началом работы {#before-you-begin}

Зарегистрируйтесь в Yandex Cloud и создайте [платежный аккаунт](../../billing/concepts/billing-account.md):
1. Перейдите в [консоль управления](https://kz.console.yandex.cloud), затем войдите в Yandex Cloud или зарегистрируйтесь.
1. На странице **[Yandex Cloud Billing](https://kz.console.yandex.cloud/billing)** убедитесь, что у вас подключен платежный аккаунт, и он находится в [статусе](../../billing/concepts/billing-account-statuses.md) `ACTIVE` или `TRIAL_ACTIVE`. Если платежного аккаунта нет, [создайте его](../../billing/quickstart/index.md) и [привяжите](../../billing/operations/pin-cloud.md) к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором будет работать ваша инфраструктура, на [странице облака](https://kz.console.yandex.cloud/cloud).

[Подробнее об облаках и каталогах](../../resource-manager/concepts/resources-hierarchy.md).

### Необходимые платные ресурсы {#paid-resources}

В стоимость предлагаемого решения входят:

* плата за использование [публичного IP-адреса](../../vpc/concepts/address.md#public-addresses) виртуальной машины ([тарифы Yandex Virtual Private Cloud](../../vpc/pricing.md));
* плата за вычислительные ресурсы и диски [ВМ](../concepts/vm.md) ([тарифы Yandex Compute Cloud](../pricing.md));
* плата за аренду сервера BareMetal ([тарифы Yandex BareMetal](../../baremetal/pricing.md)).


## Настройте облачную сеть {#setup-vpc}

### Создайте облачную сеть и подсеть {#setup-network-and-subnet}

Создайте облачную сеть и подсеть, к которым будет подключена виртуальная машина Compute Cloud – сервер VPN.

{% list tabs group=instructions %}

- Консоль управления {#console} 

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором вы будете создавать облачную инфраструктуру.
  1. Перейдите в сервис **Virtual Private Cloud**.
  1. Создайте облачную сеть:

      1. Справа сверху нажмите **Создать сеть**.
      1. В поле **Имя** укажите `sample-network`.
      1. В поле **Дополнительно** отключите опцию **Создать подсети**.
      1. Нажмите **Создать сеть**.
  1. Создайте подсеть:

      1. На панели слева выберите ![subnets](../../_assets/console-icons/nodes-right.svg) **Подсети**.
      1. Справа сверху нажмите **Создать подсеть**.
      1. В поле **Имя** укажите `subnet-kz1-b`.
      1. В поле **Зона доступности** выберите зону доступности `kz1-b`.
      1. В поле **Сеть** выберите облачную сеть `sample-network`.
      1. В поле **CIDR** укажите `192.168.11.0/24`.
      1. Нажмите **Создать подсеть**.

{% endlist %}

### Создайте группу безопасности {#crete-sg}

Создайте [группу безопасности](../../vpc/concepts/security-groups.md) `vpn-sg` для виртуальной машины – сервера VPN.

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором вы создаете облачную инфраструктуру.
  1. Перейдите в сервис **Virtual Private Cloud**.
  1. На панели слева выберите ![image](../../_assets/console-icons/shield.svg) **Группы безопасности** и нажмите кнопку **Создать группу безопасности**.
  1. В поле **Имя** задайте имя `vpn-sg`.
  1. В поле **Сеть** выберите созданную ранее сеть `sample-network`.
  1. В блоке **Правила** [создайте](../../vpc/operations/security-group-add-rule.md) следующие правила для управления трафиком:

      | Направление<br/>трафика | Описание | Диапазон портов | Протокол | Источник /<br/>Назначение | CIDR блоки /<br/>Группа безопасности |
      | --- | --- | --- | --- | --- | --- |
      | Входящий | `ssh`            | `22`   | `TCP`  | `CIDR` | `0.0.0.0/0` |
      | Входящий | `vpn`            | `63665`   | `UDP`  | `CIDR` | `0.0.0.0/0` |
      | Исходящий | `any`           | `Весь` | `Любой` | `CIDR` | `0.0.0.0/0` |
  1. Нажмите **Создать**.

{% endlist %}

## Создайте виртуальную машину для VPN-сервера {#create-vpn-server}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором вы создаете инфраструктуру.
  1. Перейдите в сервис **Compute Cloud**.
  1. На панели слева выберите ![image](../../_assets/console-icons/server.svg) **Виртуальные машины** и нажмите кнопку **Создать виртуальную машину**.
  1. В блоке **Образ загрузочного диска** выберите образ [Ubuntu 24.04](https://yandex.cloud/ru-kz/marketplace/products/yc/ubuntu-2404-lts-oslogin).
  1. В блоке **Расположение** выберите [зону доступности](../../overview/concepts/geo-scope.md) `kz1-b`.
  1. В блоке **Сетевые настройки**:

      * В поле **Подсеть** выберите созданную ранее подсеть `subnet-kz1-b`.
      * В поле **Публичный IP-адрес** выберите `Автоматически`.
      * В поле **Группы безопасности** выберите созданную ранее группу безопасности `vpn-sg`.

  1. В блоке **Доступ** выберите вариант **SSH-ключ** и укажите данные для доступа на ВМ:

      * В поле **Логин** введите имя пользователя: `yc-user`.
      * В поле **SSH-ключ** выберите SSH-ключ, сохраненный в вашем профиле [пользователя организации](../../organization/concepts/membership.md).
        
        Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
        
        1. Нажмите кнопку **Добавить ключ**.
        1. Задайте имя SSH-ключа.
        1. Выберите вариант:
        
            * `Ввести вручную` — вставьте содержимое открытого [SSH](../../glossary/ssh-keygen.md)-ключа. Пару SSH-ключей необходимо [создать](../operations/vm-connect/ssh.md#creating-ssh-keys) самостоятельно.
            * `Загрузить из файла` — загрузите открытую часть SSH-ключа. Пару SSH-ключей необходимо создать самостоятельно.
            * `Сгенерировать ключ` — автоматическое создание пары SSH-ключей.
            
              При добавлении сгенерированного SSH-ключа будет создан и загружен архив с парой ключей. В ОС на базе Linux или macOS распакуйте архив в папку `/home/<имя_пользователя>/.ssh`. В ОС Windows распакуйте архив в папку `C:\Users\<имя_пользователя>/.ssh`. Дополнительно вводить открытый ключ в консоли управления не требуется.
        
        1. Нажмите кнопку **Добавить**.
        
        SSH-ключ будет добавлен в ваш профиль пользователя организации. Если в организации [отключена](../../organization/operations/os-login-access.md) возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя внутри создаваемого ресурса.

  1. В блоке **Общая информация** задайте имя ВМ: `wireguard-vpn-server`.
  1. Нажмите кнопку **Создать ВМ**.

{% endlist %}

{% note tip %}

Чтобы VPN-соединение не перестало работать в случае остановки и повторного запуска VPN-сервера, [сделайте](../../vpc/operations/set-static-ip.md) IP-адрес вашего VPN-сервера статическим.

{% endnote %}


## Создайте приватную подсеть BareMetal {#create-subnet}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором вы создаете облачную инфраструктуру.
  1. Перейдите в сервис **BareMetal**.
  1. На панели слева выберите ![icon](../../_assets/console-icons/nodes-right.svg) **Приватные подсети** и нажмите кнопку **Создать подсеть**.
  1. В поле **Пул** выберите пул серверов `kz1-m3`.
  1. В поле **Имя** задайте имя подсети: `subnet-m3`.
  1. Не включая опцию **IP-адресация и маршрутизация**, нажмите кнопку **Создать подсеть**.

{% endlist %}


## Арендуйте сервер BareMetal {#rent-server}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором вы создаете облачную инфраструктуру.
  1. Перейдите в сервис **BareMetal**.
  1. Нажмите кнопку **Заказать сервер** и в открывшемся окне выберите вариант `Готовые конфигурации` и подходящую [конфигурацию](../../baremetal/concepts/server-configurations.md) сервера BareMetal в пуле серверов `kz1-m3`.

      Для этого в фильтре в правой части окна в блоке **Пул** выберите пул серверов `kz1-m3`.

      Чтобы выбрать подходящую вам конфигурацию сервера, нажмите на блок с именем этой конфигурации в центральной части экрана.

      {% note tip %}
      
      Вы можете снизить стоимость аренды сервера в некоторых конфигурациях, заказав его [сборку](../../baremetal/concepts/server-custom-configurations.md#assembly).
      
      Чтобы воспользоваться скидкой, в блоке с нужной конфигурацией наведите курсор на **Дешевле со сборкой** ![circle-info.svg](../../_assets/console-icons/circle-info.svg) и во всплывающем окне нажмите ![person-nut-hex.svg](../../_assets/console-icons/person-nut-hex.svg) **Перейти к сборке**.
      
      При заказе сервера со сборкой воспользуйтесь приведенной ниже инструкцией, чтобы задать необходимые параметры сервера. При этом сервер станет доступен вам не сразу, а после завершения сборки (в течение четырех календарных дней) и по более низкой цене.
      
      {% endnote %}

  1. В открывшемся окне с настройками конфигурации сервера:

      1. В поле **Период аренды** выберите [период](../../baremetal/concepts/servers.md#server-lease), на который вы хотите арендовать сервер: `1 день`, `1 месяц`, `3 месяца`, `6 месяцев` или `1 год`.
         
         По окончании указанного периода аренда сервера будет автоматически продлена на такой же период. Прервать аренду в течение указанного периода аренды нельзя, но можно [отказаться](../../baremetal/operations/servers/server-lease-cancel.md) от дальнейшего продления аренды сервера.
      1. В блоке **Образ** выберите образ `Ubuntu 24.04`.
      1. (Опционально) В блоке **Диск** настройте разметку [дисков](../../baremetal/concepts/disks/disk-types.md):
         
         1. Нажмите кнопку **Настроить разделы диска**.
         1. Укажите параметры разделов. Чтобы создать новый раздел, нажмите кнопку ![icon](../../_assets/console-icons/plus.svg) **Добавить раздел**.
         
             Чтобы самостоятельно собрать [RAID](../../baremetal/concepts/disks/raid.md)-массивы и настроить разделы дисков, нажмите кнопку **Разобрать RAID**.
         1. Нажмите кнопку **Сохранить**.
      1. В блоке **Сетевые интерфейсы**:
          1. В поле **Приватная подсеть** выберите созданную ранее подсеть `subnet-m3`.
          1. В поле **Публичный адрес** выберите `Из эфемерной подсети`.

      1. В блоке **Доступ**:

          1. В поле **Пароль** воспользуйтесь одним из вариантов создания пароля для root-пользователя:
          
              * Чтобы сгенерировать пароль для root-пользователя, выберите опцию `Новый пароль` и нажмите кнопку **Сгенерировать**.
          
                  {% note warning %}
                  
                  Этот вариант предусматривает ответственность пользователя за безопасность пароля. Сохраните сгенерированный пароль в надежном месте: он не сохраняется в Yandex Cloud, и после заказа сервера вы не сможете посмотреть его.
                  
                  {% endnote %}
          
              * Чтобы использовать пароль root-пользователя, сохраненный в [секрете](../../lockbox/concepts/secret.md) Yandex Lockbox, выберите опцию `Секрет Lockbox`:
          
                  В полях **Имя**, **Версия** и **Ключ** выберите соответственно секрет, его версию и ключ, в которых сохранен ваш пароль.
                  
                  Если у вас еще нет секрета Yandex Lockbox, нажмите кнопку **Создать**, чтобы создать его.
          
                  Этот вариант позволяет вам как задать собственный пароль (тип секрета `Пользовательский`), так и использовать пароль, сгенерированный автоматически (тип секрета `Генерируемый`).
          
          1. В поле **Открытый SSH-ключ** выберите SSH-ключ, сохраненный в вашем профиле [пользователя организации](../../organization/concepts/membership.md).
          
              Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
              
              1. Нажмите кнопку **Добавить ключ**.
              1. Задайте имя SSH-ключа.
              1. Выберите вариант:
              
                  * `Ввести вручную` — вставьте содержимое открытого [SSH](../../glossary/ssh-keygen.md)-ключа. Пару SSH-ключей необходимо [создать](../operations/vm-connect/ssh.md#creating-ssh-keys) самостоятельно.
                  * `Загрузить из файла` — загрузите открытую часть SSH-ключа. Пару SSH-ключей необходимо создать самостоятельно.
                  * `Сгенерировать ключ` — автоматическое создание пары SSH-ключей.
                  
                    При добавлении сгенерированного SSH-ключа будет создан и загружен архив с парой ключей. В ОС на базе Linux или macOS распакуйте архив в папку `/home/<имя_пользователя>/.ssh`. В ОС Windows распакуйте архив в папку `C:\Users\<имя_пользователя>/.ssh`. Дополнительно вводить открытый ключ в консоли управления не требуется.
              
              1. Нажмите кнопку **Добавить**.
              
              SSH-ключ будет добавлен в ваш профиль пользователя организации. Если в организации [отключена](../../organization/operations/os-login-access.md) возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя внутри создаваемого ресурса.

      1. В блоке **Информация о сервере** в поле **Имя** задайте имя сервера: `my-usbip-client`.
      1. Нажмите кнопку **Заказать сервер**.

{% endlist %}

{% note info %}

Подготовка сервера и установка на него операционной системы может занять до 45 минут — в это время сервер будет находиться в статусе `Provisioning`. После завершения установки ОС сервер перейдет в статус `Ready`.

{% endnote %}


## Настройте VPN {#setup-vpn}

Чтобы настроить доставку USB-устройств на сервер BareMetal с компьютера на удаленной площадке, организуйте VPN-подключение в составе VPN-сервера, развернутого на виртуальной машине Compute Cloud, и двух VPN-клиентов – на сервере BareMetal и на компьютере на удаленной площадке.

Для настройки VPN-подключения в данном руководстве будет использоваться решение с открытым исходным кодом [WireGuard](https://www.wireguard.com/). При этом вы можете организовать VPN-подключение с использованием других средств.

{% note info %}

На стороне сервера должен быть открыт порт `TCP 3240`, трафик на который должен быть разрешен VPN-соединением.

{% endnote %}

### Настройте VPN-сервер {#vpn-server-setup}

1. [Подключитесь по SSH](../operations/vm-connect/ssh.md) к созданной ранее виртуальной машине `wireguard-vpn-server`.
1. Установите WireGuard и необходимые зависимости:
   
   ```bash
   sudo apt update && sudo apt install wireguard resolvconf
   ```
1. Включите IP Forwarding в настройках ядра Linux:
   
   1. Откройте файл конфигурации `sysctl.conf`:
   
       ```bash
       sudo nano /etc/sysctl.conf
       ```
   1. Добавьте в конец файла `sysctl.conf` строку:
   
       ```text
       net.ipv4.ip_forward = 1
       ```
   1. Примените измененные настройки ядра:
   
       ```bash
       sudo sysctl -p
       ```
1. Сгенерируйте ключи для шифрования VPN-трафика:

    ```bash
    wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key > /dev/null
    wg genkey | sudo tee bms_private.key | wg pubkey | sudo tee bms_public.key > /dev/null
    wg genkey | sudo tee remote_private.key | wg pubkey | sudo tee remote_public.key > /dev/null
    ```

    В текущей директории созданы шесть файлов:

    * `server_private.key` – содержит закрытый ключ шифрования VPN-сервера.
    * `server_public.key` – содержит открытый ключ шифрования VPN-сервера.
    * `bms_private.key` – содержит закрытый ключ шифрования VPN-клиента – сервера BareMetal.
    * `bms_public.key` – содержит открытый ключ шифрования VPN-клиента – сервера BareMetal.
    * `remote_private.key` – содержит закрытый ключ шифрования VPN-клиента на удаленной площадке.
    * `remote_public.key` – содержит открытый ключ шифрования VPN-клиента на удаленной площадке.

    Сохраните значения всех ключей шифрования, они понадобятся при создании файлов конфигурации WireGuard на соответствующих машинах.
1. Создайте файл конфигурации WireGuard VPN-сервера:

    1. Откройте файл конфигурации:
       
       ```bash
       sudo nano /etc/wireguard/wg0.conf
       ```
    1. Добавьте в файл следующую конфигурацию, указав содержимое полученных на предыдущем шаге ключей шифрования:

        ```text
        [Interface]
        Address = 192.168.100.1/24
        ListenPort = 63665
        PrivateKey = <содержимое_файла_server_private.key>

        [Peer]
        PublicKey = <содержимое_файла_bms_public.key>
        AllowedIPs = 192.168.100.2/32

        [Peer]
        PublicKey = <содержимое_файла_remote_public.key>
        AllowedIPs = 192.168.100.3/32
        ```
1. Запустите WireGuard:
   
   ```bash
   sudo wg-quick up wg0
   ```
   
   Результат:
   
   ```text
   [#] ip link add wg0 type wireguard
   [#] wg setconf wg0 /dev/fd/63
   [#] ip -4 address add 192.168.100.1/24 dev wg0
   [#] ip link set mtu 1420 up dev wg0
   ```
   
   Чтобы остановить WireGuard, используйте команду `sudo wg-quick down wg0`.
   
   {% note info %}
   
   Чтобы включить автоматический запуск WireGuard, выполните команду:
   
   ```bash
   sudo systemctl start wg-quick@wg0 && sudo systemctl enable wg-quick@wg0
   ```
   
   {% endnote %}

### Настройте VPN-клиенты {#vpn-client-setup}

1. [Подключитесь по SSH](../operations/vm-connect/ssh.md) к арендованному ранее серверу BareMetal `my-usbip-client`.
1. Установите WireGuard и необходимые зависимости:
   
   ```bash
   sudo apt update && sudo apt install wireguard resolvconf
   ```
1. Включите IP Forwarding в настройках ядра Linux:
   
   1. Откройте файл конфигурации `sysctl.conf`:
   
       ```bash
       sudo nano /etc/sysctl.conf
       ```
   1. Добавьте в конец файла `sysctl.conf` строку:
   
       ```text
       net.ipv4.ip_forward = 1
       ```
   1. Примените измененные настройки ядра:
   
       ```bash
       sudo sysctl -p
       ```
1. Создайте файл конфигурации WireGuard VPN-клиента:

    1. Откройте файл конфигурации:
       
       ```bash
       sudo nano /etc/wireguard/wg0.conf
       ```
    1. Добавьте в файл следующую конфигурацию:

        ```text
        [Interface]
        PrivateKey = <содержимое_файла_bms_private.key>
        Address = 192.168.100.2/32

        [Peer]
        PublicKey = <содержимое_файла_server_public.key>
        Endpoint = <публичный_IP-адрес_ВМ>:63665
        AllowedIPs = 192.168.100.0/24
        PersistentKeepalive = 15
        ```

        Где:

        * `PrivateKey` – содержимое созданного при настройке VPN-сервера файла `bms_private.key` с закрытым ключом шифрования этого VPN-клиента.
        * `PublicKey` – содержимое созданного при настройке VPN-сервера файла `server_public.key` с открытым ключом шифрования VPN-сервера.
        * `<публичный_IP-адрес_ВМ>` – публичный IP-адрес виртуальной машины с развернутым VPN-сервером. Публичный IP-адрес ВМ можно узнать в [консоли управления](https://kz.console.yandex.cloud), в поле **Публичный IPv4-адрес** блока **Сеть** на странице с информацией о ВМ.
1. Запустите WireGuard:

    ```bash
    sudo wg-quick up wg0
    ```

    Результат:

    ```text
    [#] ip link add wg0 type wireguard
    [#] wg setconf wg0 /dev/fd/63
    [#] ip -4 address add 192.168.100.2/32 dev wg0
    [#] ip link set mtu 1420 up dev wg0
    [#] ip -4 route add 192.168.100.0/24 dev wg0
    ```
1. Аналогичным образом настройте VPN-клиент WireGuard на компьютере на удаленной площадке, при этом в файле конфигурации WireGuard `wg0.conf` в поле `PrivateKey` укажите содержимое созданного при настройке VPN-сервера файла `remote_private.key` с закрытым ключом шифрования VPN-клиента на удаленной площадке.

### Проверьте работу VPN-соединения {#check-vpn}

На этом этапе VPN-соединение установлено. Чтобы проверить его работу:

1. [Подключитесь по SSH](../operations/vm-connect/ssh.md) к серверу BareMetal `my-usbip-client` и выполните команду:

    ```bash
    ping 192.168.100.3 -c 5
    ```

    Результат:

    ```text
    PING 192.168.100.3 (192.168.100.3) 56(84) bytes of data.
    64 bytes from 192.168.100.3: icmp_seq=1 ttl=63 time=29.9 ms
    64 bytes from 192.168.100.3: icmp_seq=2 ttl=63 time=30.9 ms
    64 bytes from 192.168.100.3: icmp_seq=3 ttl=63 time=35.5 ms
    64 bytes from 192.168.100.3: icmp_seq=4 ttl=63 time=30.5 ms
    64 bytes from 192.168.100.3: icmp_seq=5 ttl=63 time=28.2 ms

    --- 192.168.100.3 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4005ms
    rtt min/avg/max/mdev = 28.249/30.987/35.453/2.405 ms
    ```

    Сетевая связность между VPN-клиентами установлена, пакеты проходят без потерь.
1. В терминале компьютера на удаленной площадке выполните команду:

    ```bash
    ping 192.168.100.2 -c 5
    ```

    Результат:

    ```text
    PING 192.168.100.2 (192.168.100.2) 56(84) bytes of data.
    64 bytes from 192.168.100.2: icmp_seq=1 ttl=63 time=30.2 ms
    64 bytes from 192.168.100.2: icmp_seq=2 ttl=63 time=28.4 ms
    64 bytes from 192.168.100.2: icmp_seq=3 ttl=63 time=31.6 ms
    64 bytes from 192.168.100.2: icmp_seq=4 ttl=63 time=27.4 ms
    64 bytes from 192.168.100.2: icmp_seq=5 ttl=63 time=27.6 ms

    --- 192.168.100.2 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4007ms
    rtt min/avg/max/mdev = 27.381/29.041/31.600/1.608 ms
    ```

    Сетевая связность между VPN-клиентами установлена, пакеты проходят без потерь.


## Настройте USB over IP {#setup-usbip}

Доставка USB-устройства на сервер BareMetal будет осуществлена с помощью программы `usbip`.

### Настройте usbip-сервер {#setup-usbip-server}

В качестве usbip-сервера будет выступать компьютер на удаленной площадке, оснащенный несколькими USB-портами. В терминале этого компьютера:

1. Установите дополнительные пакеты, необходимые для работы `usbip`:
   
   ```bash
   sudo apt install linux-tools-`uname -r`
   ```
1. Загрузите необходимые для работы `usbip` модули ядра:
   
   ```bash
   sudo modprobe usbip-core
   sudo modprobe usbip-host
   sudo modprobe vhci-hcd
   ```
   
   Где:
   
   * `usbip-core` – главный компонент серверной части.
   * `usbip-host` – компонент, отвечающий за управление USB-устройствами.
   * `vhci-hcd` – компонент, отвечающий за экспорт USB-устройств.

    {% note info %}

    Чтобы настроить автоматическую загрузку этих модулей при запуске системы, откройте файл `/etc/modules-load.d/modules.conf` в любом текстовом редакторе и добавьте в него строки:

    ```
    usbip-core
    usbip-host
    vhci-hcd
    ```

    {% endnote %}

1. Вставьте USB-устройства в порты компьютера.

    В данном руководстве в качестве примера будут использоваться [USB-флеш-накопитель](https://ru.wikipedia.org/wiki/USB-флеш-накопитель) и USB-устройство [YubiKey](https://developers.yubico.com/Passkeys/).
1. Запросите список доступных для публикации USB-устройств:

    ```bash
    sudo usbip list -l
    ```

    Результат:

    ```text
    - busid 1-1.2 (0951:1666)
      Kingston Technology : DataTraveler 100 G3/G4/SE9 G2/50 (0951:1666)

    - busid 1-1.3 (058f:a001)
      Alcor Micro Corp. : unknown product (058f:a001)

    - busid 1-1.4 (0cf3:3005)
      Qualcomm Atheros Communications : AR3011 Bluetooth (0cf3:3005)

    - busid 1-1.5 (1050:0407)
      Yubico.com : Yubikey 4/5 OTP+U2F+CCID (1050:0407)

    - busid 2-1.1 (0458:6001)
      KYE Systems Corp. (Mouse Systems) : GF3000F Ethernet Adapter (0458:6001)
    ```
1. Опубликуйте устройства с `busid 1-1.2` и `busid 1-1.5`:

    ```bash
    sudo usbip bind -b 1-1.2
    sudo usbip bind -b 1-1.5
    ```

    Результат:

    ```text
    usbip: info: bind device on busid 1-1.2: complete
    usbip: info: bind device on busid 1-1.5: complete
    ```
1. Запустите демон `usbipd`:

    ```bash
    sudo usbipd -4 -D
    ```

На этом этапе выбранные USB-устройства опубликованы и доступны для импорта по сети на стороне usbip-клиента.

### Настройте usbip-клиент {#setup-usbip-client}

В качестве usbip-клиента будет выступать сервер BareMetal `my-usbip-client`.

1. [Подключитесь по SSH](../operations/vm-connect/ssh.md) к серверу BareMetal `my-usbip-client`.
1. Установите дополнительные пакеты, необходимые для работы `usbip`:
   
   ```bash
   sudo apt install linux-tools-`uname -r`
   ```

    {% note info %}

    Если в качестве usbip-клиента вы используете виртуальную машину Yandex Compute Cloud, дополнительно установите пакет `linux-image-extra-virtual`:

    ```bash
    sudo apt install linux-image-extra-virtual
    ```

    {% endnote %}

1. Загрузите необходимые для работы `usbip` модули ядра:
   
   ```bash
   sudo modprobe usbip-core
   sudo modprobe usbip-host
   sudo modprobe vhci-hcd
   ```
   
   Где:
   
   * `usbip-core` – главный компонент серверной части.
   * `usbip-host` – компонент, отвечающий за управление USB-устройствами.
   * `vhci-hcd` – компонент, отвечающий за экспорт USB-устройств.
1. Запросите список доступных для импорта с usbip-сервера USB-устройств:

    ```bash
    usbip list -r 192.168.100.3
    ```

    Результат:

    ```text
    Exportable USB devices
    ======================
    - 192.168.100.3
          1-1.5: Yubico.com : Yubikey 4/5 OTP+U2F+CCID (1050:0407)
              : /sys/devices/platform/vhci_hcd.0/usb1/1-1/1-1.5
              : (Defined at Interface level) (00/00/00)

          1-1.2: Kingston Technology : DataTraveler 100 G3/G4/SE9 G2/50 (0951:1666)
              : /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2
              : (Defined at Interface level) (00/00/00)
    ```
1. Импортируйте устройства с usbip-клиента:

    ```bash
    usbip attach -r 192.168.100.3 -b 1-1.2
    usbip attach -r 192.168.100.3 -b 1-1.5
    ```

На этом этапе выбранные USB-устройства импортированы по сети на сервер BareMetal.

## Убедитесь в работоспособности решения {#test-solution}

Чтобы проверить подключение к удаленным USB-устройствам, подключитесь по SSH к серверу BareMetal `my-usbip-client` и выполните в терминале несколько проверочных действий:

1. Выполните команду, чтобы посмотреть журнал `dmesg`:

    ```bash
    dmesg
    ```

    Результат:

    {% list tabs group=usb-device-type %}

    - Флеш-накопитель {#flash-drive}

      ```text
      ...
      [522540.280156] vhci_hcd vhci_hcd.0: pdev(0) rhport(0) sockfd(3)
      [522540.280165] vhci_hcd vhci_hcd.0: devid(65539) speed(3) speed_str(high-speed)
      [522540.280177] vhci_hcd vhci_hcd.0: Device attached
      [522540.500110] usb 3-1: new high-speed USB device number 2 using vhci_hcd
      [522540.618122] usb 3-1: SetAddress Request (2) to port 0
      [522540.671557] usb 3-1: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 0.01
      [522540.671571] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
      [522540.671577] usb 3-1: Product: DataTraveler 3.0
      [522540.671581] usb 3-1: Manufacturer: Kingston
      [522540.671585] usb 3-1: SerialNumber: D067E5162216F1B14605943F
      [522540.690082] usb-storage 3-1:1.0: USB Mass Storage device detected
      [522540.690801] scsi host7: usb-storage 3-1:1.0
      [522540.691020] usbcore: registered new interface driver usb-storage
      [522540.694262] usbcore: registered new interface driver uas
      [522541.728481] scsi 7:0:0:0: Direct-Access     Kingston DataTraveler 3.0      PQ: 0 ANSI: 6
      [522541.729122] sd 7:0:0:0: Attached scsi generic sg2 type 0
      [522541.763235] sd 7:0:0:0: [sdc] 15109516 512-byte logical blocks: (7.74 GB/7.20 GiB)
      [522541.775808] sd 7:0:0:0: [sdc] Write Protect is off
      [522541.775829] sd 7:0:0:0: [sdc] Mode Sense: 4f 00 00 00
      [522541.788402] sd 7:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
      [522541.890019]  sdc: sdc1
      [522541.890454] sd 7:0:0:0: [sdc] Attached SCSI removable disk
      ...
      ```

      На стороне сервера было смонтировано и отдано в удаленный доступ USB-устройство производителя `Kingston`, которое является блочным флеш-накопителем. Устройство было распознано как `/dev/sdc`.

    - Устройство YubiKey {#yubikey}

      ```text
      ...
      [1039400.471187] vhci_hcd vhci_hcd.0: pdev(0) rhport(1) sockfd(3)
      [1039400.471211] vhci_hcd vhci_hcd.0: devid(65540) speed(2) speed_str(full-speed)
      [1039400.471223] vhci_hcd vhci_hcd.0: Device attached
      [1039400.640976] vhci_hcd: vhci_device speed not set
      [1039400.697969] usb 3-2: new full-speed USB device number 4 using vhci_hcd
      [1039400.763979] vhci_hcd: vhci_device speed not set
      [1039400.820985] usb 3-2: SetAddress Request (4) to port 1
      [1039400.872797] usb 3-2: New USB device found, idVendor=1050, idProduct=0407, bcdDevice= 5.43
      [1039400.872812] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
      [1039400.872818] usb 3-2: Product: YubiKey OTP+FIDO+CCID
      [1039400.872822] usb 3-2: Manufacturer: Yubico
      [1039400.894510] input: Yubico YubiKey OTP+FIDO+CCID as /devices/platform/vhci_hcd.0/usb3/3-2/3-2:1.0/0003:1050:0407.0003/input/input7
      [1039400.977251] hid-generic 0003:1050:0407.0003: input,hidraw2: USB HID v1.10 Keyboard [Yubico YubiKey OTP+FIDO+CCID] on usb-vhci_hcd.0-2/input0
      [1039400.987196] hid-generic 0003:1050:0407.0004: hiddev0,hidraw3: USB HID v1.10 Device [Yubico YubiKey OTP+FIDO+CCID] on usb-vhci_hcd.0-2/input1
      ...
      ```

      На стороне сервера было смонтировано и отдано в удаленный доступ USB-устройство производителя `Yubico`.

    {% endlist %}

1. Убедитесь в наличии доступа к данным на удаленных USB-устройствах:

    {% list tabs group=usb-device-type %}

    - Флеш-накопитель {#flash-drive}

      1. Получите информацию о блочных устройствах сервера BareMetal:

          ```bash
          lsblk /dev/sdc
          ```

          Результат:

          ```text
          NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
          ...
          sdc      8:32   1  7.2G  0 disk 
          └─sdc1   8:33   1  7.2G  0 part
          ```
      1. Смонтируйте раздел флеш-накопителя `/dev/sdc1` в директорию `/mnt/sdc1`:

          ```bash
          mkdir -p /mnt/sdc1
          mount /dev/sdc1 /mnt/sdc1
          ```
      1. Посмотрите список смонтированных устройств и доступное для записи дисковое пространство:

          ```bash
          df -h
          ```

          Результат:

          ```text
          Filesystem      Size  Used Avail Use% Mounted on
          ...
          /dev/sdc1       7.2G   16K  7.2G   1% /mnt/sdc1
          ```
      1. Скопируйте файл конфигурации WireGuard на удаленный USB-накопитель:

          ```bash
          cp -r /etc/wireguard /mnt/sdc1
          ```
      1. Просмотрите список файлов на удаленном USB-накопителе:

          ```bash
          ls -la /mnt/sdc1/wireguard/
          ```

          Результат:

          ```text
          total 48
          drwxr-xr-x 2 root root 16384 Apr 20 19:46 .
          drwxr-xr-x 4 root root 16384 Jan  1  1970 ..
          -rwxr-xr-x 1 root root   247 Apr 20 19:46 wg0.conf
          ```

      Проверка завершена: файл успешно скопирован на удаленный USB-накопитель.

    - Устройство YubiKey {#yubikey}

      1. Установите набор утилит, необходимых для работы с аппаратным токеном YubiKey:

          ```bash
          apt install yubico-piv-tool
          ```
      1. Выполните запрос статуса оборудования Yubico:

          ```bash
          yubico-piv-tool -a status
          ```

          Результат:

          ```text
          Version:        5.4.3
          Serial Number:  ********
          CHUID:  No data available
          CCC:    No data available
          Slot 9c:
                  Algorithm:      RSA2048
                  Subject DN:     CN=5-ay-yubi
                  Issuer DN:      CN=ChangeMe
                  Fingerprint:    15e4ec25********************************************************
                  Not Before:     Feb 19 08:29:13 2025 GMT
                  Not After:      Feb 16 08:29:13 2035 GMT
          PIN tries left: 3
          ```
      1. Получите открытый сертификат клиента из хранилища аппаратного токена Yubico, указав в параметре `-s` значение поля `Slot` из вывода предыдущей команды:

          ```bash
          yubico-piv-tool -a read-cert -s 9c
          ```

          Результат:

          ```text
          -----BEGIN CERTIFICATE-----
          MIIDUjCCA*******************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ****************************************************************
          ***************************************t7Ts9P8CTUsyw=
          -----END CERTIFICATE-----
          ```

      Проверка завершена: оборудование Yubico возвращает корректный статус, данные сертификата из хранилища токена считываются без ошибок.

    {% endlist %}


## Как удалить созданные ресурсы {#clear-out}

Чтобы перестать платить за созданные ресурсы:

1. [Удалите](../operations/vm-control/vm-delete.md) виртуальную машину.
1. Удалить сервер BareMetal нельзя. Вместо этого [откажитесь](../../baremetal/operations/servers/server-lease-cancel.md) от продления аренды сервера.