Pull to refresh

Байка про то, как я с помощью ZeroTier и USB/IP на VDS/VPS USB-порты МОСТырил

Reading time8 min
Views5.1K


Прошла неделя, как завершился внешний проект по миграции части ИТ-инфраструктуры одной компании с локальных на арендуемые вычислительные ресурсы. Проект в котором меня, когда я размышлял над моделью подключения USB-токенов к VDS/VPS и подбирал готовые для этой задачи решения, посетила одна занятная идея — собрать собственное на базе «открытого» ПО.

Поводом для «появления на свет» идеи стало желание продемонстрировать заказчику, что «создать решение или решить проблему можно несколькими способами, но, не всегда самый дорогой или/и популярный способ — самый эффективный!» Ну, и… чуток «завернуть» бюджет проекта, не только по услугам, но и по софту и железу, на себя, «импортозамещая» продукцию: FabulaTech, Digi и подобных компаний. :)

Как ни странно, процесс создания решения поначалу показался занятием непростым и не благодарным, но потом «затянул» так, что побудил собрать такое же решение и для себя, но уже для других целей. О чём и расскажу в этой статье.

Внутри


  1. Ядро:USB/IP — открытое ПО, предназначенное для организации совместного использования USB-устройств через компьютерную сеть. Если описывать технологию кратко, то, для «шаринга» USB-устройств, с сохранением их «родной» функциональности, USB/IP инкапсулирует (упаковывает) «сообщения ввода-вывода USB» в полезную нагрузку (содержание) TCP/IP пакетов и пересылает их между компьютерами.

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

    USB/IP позволяет «шарить» практически любые устройства с USB интерфейсом, включая специализированные — чековые принтеры, сканеры штрих-кодов, датчики температуры, гигрометры, термостаты, конвертеры сигналов, сетевые адаптеры, ну и конечно же — USB-токены.
  2. Транспортная инфраструктура: ZeroTier — подобный корпоративному коммутатору SDN инструмент для организации виртуальных сетей поверх физических, c возможностью подключения практически любого приложения или устройства.
    Подробнее тут

    Кроме того, что ZeroTier объединяет виртуальные серверы и все узлы физической сети IP-адресами из единого диапазона, он также защищает доступ к USB-устройствам на USB/IP-сервере для каждого из компьютеров этой сети, где бы он не находился.
  3. Что же касается «упаковки», то я рассматривал множество вариантов. Но однажды, обратил внимание на 15-ти процентную утилизацию вычислительных ресурсов и два свободных USB-порта используемого в роли сетевого моста Raspberry P и решил задействовать его ещё и роли USB/IP-сервера

Стоимость




Размер бюджета на новое оборудования в составе комплекта на фото + дополнительной сетевой карты USB- RJ45 для реализации бриджа, на момент написания статьи не превышал пяти тысячи рублей

Стоимость же самого решения, за счёт услуг по настройке и внедрению, для заказчика — несколько выше обозначенной суммы. Но, всё равно, меньше стоимости продукции «импортозамещаемых конкурентов». Особенно учитывая то количество USB-устройств, которые можно «расшарить» в стандартной конфигурации решения, плюс — функционал сетевого моста ZeroTier.

Порядок сборки и эксплуатация


Шаг 1-ый Создаём виртуальную сеть ZeroTier
Шаг 2-ой. Создаём сетевой мост и добавляем его к сети ZeroTier
Шаг 3-ий. «Поднимаем» USB/IP-сервер на сетевом мосте
Шаг 4-ый. Подключаем виртуальный сервер к сети ZeroTier
Шаг 5-ый. «Поднимаем» USB/IP-клиента на VDS/VPS
Шаг 6-ой. «Шарим» USB-устройства

Описываемый выше порядок действий указан с расчётом на то, что читатель уже, хотя бы немного, знаком с Raspberry PI и ZeroTier.

Также, в процессе повествования, дабы не повторяться и уменьшить объем статьи, я буду ссылаться на соответствующие разделы гайдов по ZeroTier. Прошу не судить строго и задавать вопросы в комментах, если что-то не понятно.

Создаём виртуальную сеть ZeroTier

Для создания виртуальной сети пользователю необходимо перейти во вкладку Add network сетевого контроллера ZeroTier. Из пункта...
подробное руководство

Создаём сетевой мост и добавляем его к сети ZeroTier

Для начала мне стоило определиться — какой узел в сети будет выступать в качестве бриджа. Изучив варианты, я понял...
подробное руководство

«Поднимаем» USB/IP-сервер на сетевом мосте


Учитывая тот факт, что USB/IP уже давно включён в основную «ветку» ядра Linux, установить его на Raspberry Pi OS (ответвление Debian для процессоров ARM), под которой функционирует сетевой мост моей сети, не составляет большого труда:
sudo apt install usbip

Также, как и запустить его в режиме сервера:
sudo modprobe usbip-host
sudo modprobe vhci-hcd
sudo usbipd -D

Первые две команды подгружают необходимые модули в ядро, третья — запускает ПО в режиме демона. Выполнение этих команд можно автоматизировать с помощью bash-скрипта, а также запускать его при загрузке системы или по команде от внешнего сервиса.

Подключаем VDS/VPS к сети ZeroTier

Для начала на узел, который пользователь желает подключить к сети, необходимо установить сервис ZeroTier One. Ссылки на дистрибутивы, а также…
подробное руководство

«Поднимаем» USB/IP-клиента на VDS/VPS


USB-токен востребован в первую очередь на ПК под управлением ОС с графическим интерфейсом. Такая особенность среди гостевых ОС для виртуальных серверов, предлагаемых в аренду сервис-провайдерами, по умолчанию присуща, пожалуй, только популярной среди неискушенных пользователей продукции компании MS. Поэтому устанавливать и использовать USB/IP в клиентском режиме будем в первую очередь под ОС этого производителя.

А вот с этим у USB/IP не всё так гладко, как для Linux. На официальном репозитарии последняя информация по ветке для Windows датирована 2012 годом. И если под ОС до версии Windows 7/ Server 2008R2 включительно, ПО ещё работает, то для более свежих — уже нет.

Поэтому, после изысканий в том числе и с помощью Хабра, нашёлся созданный KyungWoon Cho вариант под названием usbip-win, который и лёг в основу решения. Но и он потребовал «танцев с бубнами» перед внедрением, так как у каждого гипервизора, с помощью которого создаётся виртуальный сервер, свои особенности взаимодействия с гостевой операционной системой.

Например, релиз usbip-win 0.2.0 встал на Windows Server 2019 под Hyper-V, но отказался работать под Windows Server 2016 и 2019 под KVM. Релиз же usbip-win 0.1.0 под KVM заработал нормально. Его я и буду использовать в дальнейшем повествовании.

  • Перед установкой необходимо скачать архив с исходным кодом usbip-win-0.1.0.zip, распаковать его, например, на диск C: Во вновь созданную папку нужно загрузить файлы из этого же релиза: usbip.exe, usbip_vhci.sys, usbip_vhci.inf, usbip_vhci.cat
  • Устанавливаем тестовый (самоподписанный) сертификат.
    • В разархивированной папке правой кнопкой мыши кликаем на файле usbip_test.pfx
    • Выбираем Установить PFX
    • В мастере импорта сертификатов переносим радикнопку с Текущего пользователя на Локальный компьютер и жмём Далее
    • Разрешаем Хост-процессу Windows (Rundll32) вносить изменения на устройстве
    • На странице выбора имени файла сертификата — оставляем всё как есть. Жмём Далее
    • Водим пароль «usbip». Подтверждаем.
    • На странице хранилища сертификатов, также оставляем всё как есть. Жмём Далее
    • На странице Завершение мастера импорта сертификатов отмечаем Готово



  • Разрешаем тестовую подпись сертификата
    • Запускаем PowerShell или CMD от имени администратора
    • Выполняем команду
      PS > bcdedit.exe /set TESTSIGNING ON
    • Выполняем перезагрузку
  • Устанавливаем приложение USBIP
    • В папке кликаем правой кнопкой мыши на файле usbip.exe
    • Выбираем Запустить от имени администратора
    • Соглашаемся со всеми предостережениями
  • Альтернативная установка USBIP с помощью PowerShell или CMD
    • Запускаем PowerShell или CMD от имени администратора
    • PS > cd C:\usbip-win-0.1.0
    • PS C:\usbip-win-0.1.0 > .\usbip.exe instal




  • Принудительно устанавливаем драйвер
    • Открываем Диспетчер устройств
    • В меню выбираем Действия — Установить старое устройство
    • Мастер установки оборудования — Далее
    • На следующем экране выбрать радиокнопкой Установка оборудования выбранного из списка вручную — Далее
    • В списке оборудования, оставляем всё как есть — Далее
    • На странице выбора драйвера Установить с диска
    • После указать путь к файлу usbip_vhci.inf в папке USBIP — Открыть — OK — Далее — Далее
    • При появления предостережения безопасности Windпows по поводу издателя — Всё равно установить драйвер
    • При завершении мастера установки — Готово
  • Принудительно устанавливаем драйвер с помощью PowerShell или CMD
    • Запускаем PowerShell или CMD от имени администратора
    • PS > cd C:\usbip-win-0.1.0
    • PS C:\usbip-win-0.1.0 > pnputil /add-driver usbip_vhci.inf




Спойлер, в который лучше не заглядывать
Для тех, кому процесс «поднятия» USB/IP-клиента под Windows «видится» долгим и непонятным, «по-секрету» могу сообщить, что сервис-провайдер MaxiPlace, который занимается оказанием услуг аренды вычислительных мощностей для высоконагруженных проектов на «1С: Предприятие» и «1C: Битрикс» на базе SSD и NVMe, уже предлагает к заказу виртуальные серверы c предварительно установленным на ОС Windows Server USB/IP-клиентом. И началом этому положил проект миграции, упоминаемый в начале статьи

«Шарим» USB-устройства


Уверен, многие из читателей задумывались над вопросом: «Кто кроме меня имеет доступ к данным, которые я разместил на виртуальном сервере у сервис-провайдера?»

Скрывать не буду, этот вопрос тоже не давал покоя, покуда я не обратил внимание на криптоконтейнер — надежно зашифрованную папку с паролем, где можно хранить и редактировать файлы. Своего рода сейф внутри VDS/VPS. Но, каким надёжным не был бы сейф, если ключи и код от него окажутся в чужих руках, то и содержимое — определённо, тоже.

Это присказка, а сказка в том, что «такое же решение для себя» у меня занимается «доставкой» по-требованию ключа и кода к «сейфу» на виртуальном сервере через защищенную виртуальную сеть. А именно:
  • запускаемому с USB-флешки инструмента для создания и организации доступа к криптоконтейнеру
  • находящемуся в зашифрованном виде на USB-токене ключевого файла для двухфакторной авторизации

Теперь подробнее о механизме «доставки»:

  • На стороне севера:
    • Команда в консоли:
      sudo usbip list -l

      Выводит список USB — устройств, доступных для «проброса» на USB/IP-клиент:
       - busid 1-1.1 (0424:ec00)                                                                                                                                         
         Standard Microsystems Corp. : SMSC9512/9514 Fast Ethernet Adapter (0424:ec00)                                                                                                                                                                                                                                               
       - busid 1-1.2 (0bda:8152)                                                                                                                                         
         Realtek Semiconductor Corp. : RTL8152 Fast Ethernet Adapter (0bda:8152)                                                                                         
                                                                                                                                                                         
       - busid 1-1.3.2 (1005:b128)                                                                                                                                       
         Apacer Technology, Inc. : unknown product (1005:b128)                                                                                                           
                                                                                                                                                                         
       - busid 1-1.3.3 (0480:0210)                                                                                                                                        
         Toshiba America Inc : unknown product (0480:0210)                                                                                                               
                                                                                                                                                                         
       - busid 1-1.3.4 (05e3:0745)                                                                                                                                       
         Genesys Logic, Inc. : Logilink CR0012 (05e3:0745)                                                                                                               
                                                                                                                                                                         
       - busid 1-1.5 (0a89:0020)                                                                                                                                         
         Aktiv : Rutoken S (0a89:0020)    

    • Проанализировав список, вижу что необходимые для подключения устройства присутствуют. Их и будем публиковать на USB/IP — сервере
      • USB-флешки с инструментом для создания и организации доступа к крипто-контейнеру:
        sudo usbip bind -b 1-1.3.2

        Подтверждения удачного выполнения команды будет:
        usbip: info: bind device on busid 1-1.3.2: complete 
      • USB-токен c ключевым файлом для двухфакторной авторизации:
        sudo usbip bind -b 1-1.5

        Подтверждение аналогично предыдущему:
        usbip: info: bind device on busid 1-1.5: complete
      • Если что-то пошло не так, для отмены выполните команду:
        sudo usbip unbind -b <busid>
  • На стороне клиента
    • Команда выполненная в CMD или PowerShell с правами администратора:
      PS C:\usbip-win-0.1.0> .\usbip.exe list -r "IP-адрес USB/IP-сервера"

      или её вариант в CLI:
      sudo usbip list -r "IP-адрес USB/IP-сервера"

      Выводит список доступных для подключении к USB/IP-клиенту USB-устройств
      Exportable USB devices
      ======================
       - <IP-адрес USB/IP-сервера>
           1-1.5: Aktiv : Rutoken Sr : unknown product (0a89:0020)
              : /sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5
              : unknown class / unknown subclass / unknown protocol (ff/00/00)
              :  0 - unknown class / unknown subclass / unknown protocol (ff/00/00)
      
       1-1.3.2:  Apacer Technology, Inc : unknown product (1005:b128)
              : /sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3.2
              : (Defined at Interface level) (00/00/00)
              :  0 - unknown class / unknown subclass / unknown protocol (08/06/50)

    • Полключаем USB-флешку на виртуальном сервере
      PS C:\usbip-win-0.1.0> .\usbip.exe attach -r "IP-адрес USB/IP-сервера" -b 1-1.5
      
      Отключить её можно командой CRTL+C
    • C подключением USB-токена будет посложнее. Аналогично USB-ключу с однопользовательской лицензией «1С» в RDP-сессии, ОС Windows на виртуальном сервере «увидит» его только тогда, когда он будет вставлен в USB-порт ПК, с которого эта сессия запущена. Поэтому USB-токен «шарю» на личный ноутбук, под управлением ОС Debian Buster:
      sudo usbip attach -r "IP-адрес USB/IP-сервера" -b 1-1.5
      

      Если опять что-то пошло не так, «отшарить» флешке можно выполнив:
      sudo usbip detach -p "номер порта"
      

      А номер порта узнать командой
      sudo usbip port

      Установить и запустить USB/IP в режиме клиента, можно также как и в режиме сервера. Исключив команду запуска демона.

Процесс и результат доставки «ключа» и «кода» к «сейфу» на VDS/VPS




∑ На этом рассказ о субъективном «видении» решения для «проброса» USB-портов между физическими и «облачными» вычислительными ресурсами завершаю. Надеюсь что, несмотря на отсутствие хайповой информации о «прорывных» технологиях и новых продуктах, статья всё-таки будет полезна читателям Хабра.
Tags:
Hubs:
+3
Comments3

Articles

Change theme settings