Проброс USB устройств по сети (VirtualHere)

В эпоху гипервизоров редко когда под какой-то сервер приложений или баз данных выделяют отдельный физический сервер. Очень часто такие сервера работают в качестве гостевой операционной системы виртуальной машины на одном из гипервизоров. Обычно в 80-90% случаев это так (данные взять на основе сугубо моего личного опыта). Проброс USB устройств в таком случае не всегда является тривиальной задачей.

Если у вас, скажем, гипервизор ESXi, то задача может быть решена без помощи стороннего ПО. Проброс USB в Hyper-V все еще не завезли.

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

Я хочу поделиться с одним из возможных решений данной проблемы.

Краткое описание задачи

Задача, собственно, проста. Есть порядка 5-10 USB устройств, которые будут периодически подключаться к разным клиентам. Соответственно, все эти USB устройства физически должны быть подключены к какому-то одному устройству, которое будет доступно всем клиентам. Клиенты же уже в порядке живой очереди будут “разбирать” пул доступных устройств.

В силу особенностей работы 1 USB устройство в один момент времени будет подключено только к одному клиенту.

Если у вас исключительно Linux окружение, то вы можете использовать встроенное решение USB/IP.

Выбор решения

Программного обеспечения, которое может обеспечить проброс USB устройств по сети, очень много. После долгих сравнений набора возможностей, стоимости и предлагаемого набора клиентов решение было выбрано – VirtualHere.

Скажу сразу – решение платное (49$). Однако, лицензируется сервер целиком, т.е. нет ограничений на количество подключенных устройств. Без лицензии в один и тот же момент времени можно использовать только одно USB устройство. Для настройки PoC (Proof of Concept) решения этого достаточно. Вы сможете проверить – подойдет ли вам этот продукт или нет.

Почему VirtualHere?

Аргументы в сторону выбора этого решения:

  1. Большой выбор серверной части – Window, Linux, Android, OSX.
  2. До безобразия простая настройка сервера.
  3. Достаточно большой набор клиентов. Есть клиент под Windows, Linux, Mac OS и Android.
  4. Клиент может быть запущен как сервис.
  5. У клиента есть как графический вариант, так и консольный аналог.
  6. У клиента есть свой API.
  7. Относительно гуманная стоимость – 49$.
ВАЖНО: В Linux CentOS 8 и 9 из коробки нет модуля vhci_hcd. Поэтому нужно либо добавлять этот модуль вручную. Либо использовать контейнеры. Признаюсь честно, я потратил около 2-х часов на то, чтобы попробовать реализовать какой-то из этих вариантов, но из этого толком ничего не получилось. Пробовал даже сторонний модуль vhci_hcd от elrepo. Насколько я понял, модуль от elrepo не работает на ядре 4.18.0-394, а рассчитан на работу с более старой версией ядра. Но это только мои догадки - не так много у меня опыта работы с Linux. Если у кого-то получилось запустить клиент на CentOS 8 или 9 - поделитесь в комментариях опытом.

В качестве физической коробки, к которой будут подключены устройства будет выступать небольшой неттоп. Можно использовать любое практически любое физическое устройство, т.к. ресурсов серверу много не нужно. Можно даже использовать Raspberry Pi.

Могу ошибаться, но все или некоторые аппаратные решения DistKontrolUSB, например, используют клиент как две капли воды похожий на клиент VirtualHere. Возможно, что серверная часть тоже. Но это лишь мои наблюдения и догадки.

Настройка VirtualHere

Теперь я покажу вам, как выполняется как выполняется настройка сервера, а также подключение к серверу с клиентских рабочих мест.

Настройка сервера

Мы будем использовать вариант с Linux сервером. Наш дистрибутив – Ununtu 20.04. Вы можете использовать любой дистрибутив. Но у меня под рукой для написания статьи был только этот 🙂

Если у вас абсолютно новая установка Ubuntu, то предварительно необходимо установить curl:

apt update
apt install curl

При наличии на сервере прямого выхода в Интернет установка производится в одну команду:

curl https://raw.githubusercontent.com/virtualhere/script/main/install_server | sudo sh

Теперь проверим статус нашего сервера:

systemctl status virtualhere.service

Серсив запущен и готов принимать клиентские подключения. Клиентский трафик прослушивается на порту TCP/7575:

netstat -tulpn

Клиент для Windows

Сначала я покажу, как выглядит клиент для Windows. Скачиваем его с сайта проекта.

Запускаем клиент:

Если вы находитесь в одной подсети с сервером, то клиент скорее всего найдет его автоматически. Если сервер автоматически не найдет, то нужно подсказать клиенту, по какому IP-адресу находится сервер:

Теперь мы видим все подключенные к серверу USB устройства и можем примонтировать одно из них:

Также можем зарегистрировать клиент в качестве службы Windows:

Работу клиента я проверил на следующих серверных ОС: Windows Server 2008 R2, 2012 R2, 2016 и 2019 и соответствующим им клиентским ОС – Windows 7, 8.1, 10 + Windows 11.

Также можно использовать API для работы с клиентом. Например, запросим перечень всех устройств на сервере:

vhui64.exe -t list

Клиент для Linux

Теперь я покажу, как выглядит клиент для Linux. Скачиваем его с сайта проекта.

Разрешаем выполнение:

chmod +x vhuit64

И запускаем клиент.

sudo ./vhuit64

В остальном работа Linux клиента аналогична работе Windows клиента. Также нужно указать расположение сервера:

Теперь мы можем увидеть перечень устройств и подключить одно из них:

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

Проброс USB устройств по сети (VirtualHere): 11 комментариев

    1. Добрый день! Зависит от того, как вы их “пробрасываете”. Если вы подключаете Rutoken, например, к клиентскому рабочему месту, а затем клиент подключает по RDP к серверу терминалов, то на моей практике проблем не возникало. Аппаратные ключи 1С для рабочих мест по такой схеме тоже работают.

      Однако, если вы “примапите” ключ непосредственно на сервер, то клиенты, подключенные по RDP к серверу, с вероятностью в 90% этих токены не увидят в силу особенностей RDP протокола.

      В любом случае, вы можете установить VirtualHere и проверить уже конкретно для вашего токена. Бесплатная версия позволяет использовать одно устройтво без ограничений.

  1. Добрый день. Если токен просто подключен к клиенту, а клиент по рдп к серверу Windows, то и не нужна такая программа – токен работает сразу. У меня вопрос про вариант, когда на терминальном сервере крутится в Hiper-V centos для баз 1с в postgre, то клиентом выступает консольный centos, а сервером хост для hiper-v? Пробросится ли тогда токен в сеансе rdp? И может чуть дописать человеческим языком для начинающих процесс установки в консольном linux: ”
    Running the Linux Client in the console is usually a two step process.
    Step 1. Start the Client as a daemon so that it runs in the background using the -n flag. You can move it into an init.d script so it runs on startup as a daemon
    Step 2. Run the client again and this time use the -t argument to control the daemon”?

    1. Если токен просто подключен к клиенту, а клиент по рдп к серверу Windows, то и не нужна такая программа – токен работает сразу.
      // Это верно, но VirtualHere нужен немного для других целей. Представьте, что у вас хотя бы 5 токен и все их попеременно используют разные сотрудники. Вот тут уже кейс повеселее. Причем сотрудники могут вообще работать из дома и передать токен нет физической возможности.

      У меня вопрос про вариант, когда на терминальном сервере крутится в Hiper-V centos для баз 1с в postgre, то клиентом выступает консольный centos, а сервером хост для hiper-v?
      // Если на CentOS нужно подключить токен, который подключен к другом физическому ПК/серверу с VirtualHere, то да, CentOS будет клиентом. Только из описания не совсем понял зачем вам пробрасывать токен на CentOS.

      Пробросится ли тогда токен в сеансе rdp?
      // Боюсь, не уловил кто и куда подключается по RDP.

      И может чуть дописать человеческим языком для начинающих процесс установки в консольном linux: ”
      Running the Linux Client in the console is usually a two step process.
      Step 1. Start the Client as a daemon so that it runs in the background using the -n flag. You can move it into an init.d script so it runs on startup as a daemon
      Step 2. Run the client again and this time use the -t argument to control the daemon”?

      // У меня сейчас нет готового стенда, чтобы протестировать, но вот тут есть пример настройки в качестве службы на Linux – https://www.virtualhere.com/client_service
      Чуть ниже вот этого предложения “To start the client on boot:”.

      Команды консольному клиенту передаются следующим образом:
      /usr/sbin/vhclientx86_64 -t <команда>

      Примеры команд можно найти вот тут – https://www.virtualhere.com/client_api
      Скорее всего вам нужен вот этот метод – “AUTO USE DEVICE PORT,[address]”
      т.е. /usr/sbin/vhclientx86_64 -t AUTO USE DEVICE PORT,[address]

      Постараюсь попозже протестировать и дополнить статью.

      1. Case: Сервер Windows 2019 в качестве терминального. Базы 1с в виртуальной машине Centos (тут собственно базы 1с в postgre) в Hiper-V. Клиенты заходят по rdp (RemoteApp ) на WS2019. Смог на centos установить только выгружаемые ключи, но не токены…

          1. Нужен доступ к рутокен, с этого года все сертификаты выдаются невыгружаемые.

  2. служба не стартует, файл лежит где надо.
    systemctl enable virtualhereclient.service
    выходит что
    systemctl enable virtualhereclient.service
    Failed to enable unit: Unit file virtualhereclient.service does not exist.

    [root@srv1c log]# tail -4 /var/log/messages
    VirtualHere Client: VirtualHere Client 5.3.4 starting (Compiled: Apr 25 2022 19:54:55)
    VirtualHere Client: Client OS is Linux 4.18.0-365.el8.x86_64 x86_64
    VirtualHere Client: Using config at /root/.vhui
    VirtualHere Client: Error preloading client driver,

  3. Нашёл похожее:
    In the latest version of CentOS “networking.service” doesn’t exist.
    If you run the service as described on the Linux FAQ page you’ll get the error message “Failed to start virtualhere.service: Unit networking.service not found.”.
    In CentOS 8 “networking.service” has been replaced by “NetworkManager.service”. Switching these out in your systemd script will fix the error and VirtualHere will run at boot.

    но в наших конфигах After=network.target

    1. Похоже в CentOS 8-9 модуль для usbip не входит, а он нужен – https://forums.centos.org/viewtopic.php?t=72840

      Из вариантов видится:
      1. Ручное компилирование драйвера (When trying to use the Linux client it says “USBIP client drivers are not available, you will have to compile/install your own from the linux kernel source” ?) – https://www.virtualhere.com/client_configuration_faq#usbip
      2. Можно попробовать образ docker собрать – https://hub.docker.com/r/virtualhere/virtualhere-client

Добавить комментарий

Ваш адрес email не будет опубликован.