Удалённое подключение USB-устройств по сети

Введение

USBIP — программное обеспечение, которое позволяет подключать по сети USB-устройства, физически подключённые к удалённому компьютеру, и использовать их так же, как если бы они были подключены к локальному компьютеру. Далее компьютер, к которому физически подключено USB-устройство, будет называться сервером, а тот, который будет использовать это устройство по сети — клиентом.

Обязательные условия

Для работы USBIP необходимо, чтобы клиент имел доступ к порту 3240 сервера. Пользователь, который настраивает USBIP на клиенте и на сервере, должен иметь административный доступ (sudo).

Установка и настройка ПО

Для установки USBIP и на сервере, и на клиенте нужно выполнить следующую команду:

$ sudo dnf install usbip kmod-usbip

Для установки графического интерфейса выполните следующую команду:

$ sudo dnf install usbip-gui

Настройка автоматического запуска служб

На сервере необходимо включить службу usbip-server:

$ sudo systemctl enable --now usbip-server

На клиенте — включить службу usbip-client:

$ sudo systemctl enable --now usbip-client

Настройка межсетевого экрана firewalld

Предупреждение

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

Настройка доступа при помощи межсетевого экрана firewalld

Для доступа USBIP удалённые компьютеры подключаются к порту 3240 по протоколу TCP. Например, чтобы открыть доступ к USBIP для компьютера, имеющего адрес 192.168.1.10, нужно выполнить следующие команды:

$ sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="3240" protocol="tcp" accept'

При необходимости повторить выполнение команд для дополнительных адресов, после этого перезапустить firewalld:

$ sudo systemctl restart firewalld

Альтернативный способ

Создать новую зону, например, allowedips:

$ sudo firewall-cmd --permanent --new-zone=allowedips

Добавить доверенные IP-адреса в список источников (sources) этой зоны:

# Для 192.168.1.10
$ sudo firewall-cmd --permanent --zone=allowedips --add-source=192.168.1.10
# Для 192.168.1.20
$ sudo firewall-cmd --permanent --zone=allowedips --add-source=192.168.1.20

Открыть порт 3240/tcp в созданной зоне:

$ sudo firewall-cmd --permanent --zone=allowedips —add-port=3240/tcp

Применить изменения:

$ sudo systemctl —reload firewalld

Настройка привязки устройства на сервере

Чтобы на стороне сервера сделать устройство доступным по сети, его нужно привязать к службе usbipd. Для этого нужно выполнить следующие действия. Предположим, нам нужно передать на клиентский компьютер USB-устройство «Aktiv Rutoken ECP». Сначала выясним идентификатор шины устройства. Для этого необходимо выполнить команду:

$ usbip list -l
- busid 1-1.2 (2357:0604)
  TP-Link : unknown product (2357:0604)

- busid 1-1.3 (17ef:60ee)
  Lenovo : unknown product (17ef:60ee)

- busid 1-1.4 (046d:c52b)
  Logitech, Inc. : Unifying Receiver (046d:c52b)

- busid 1-3 (0a89:0030)
  Aktiv : Rutoken ECP (0a89:0030)

- busid 1-7.1 (0d8c:0103)
  C-Media Electronics, Inc. : CM102-A+/102S+ Audio Controller (0d8c:0103)

- busid 1-7.2 (046d:082d)
  Logitech, Inc. : HD Pro Webcam C920 (046d:082d)

Из приведённого вывода команды видно, что значение busid (идентификатор шины) устройства Rutoken ECP равно 1-3.

Далее необходимо выполнить привязку устройства:

$ sudo usbip bind -b 1-3
usbip: info: bind device on busid 1-3: complete

Для отключения устройства используется команда unbind:

$ sudo usbip unbind -b 1-3
usbip: info: unbind device on busid 1-3: complete

Эту же операцию можно выполнить при помощи графического интерфейса. Для этого запустите утилиту «Управление USBIP» из главного меню. В разделе «Локальные устройства USB» найдите нужное устройство, выделите его и нажмите кнопку «Привязать устройство». Для отключения устройства выделите устройство и нажмите кнопку «Отвязать устройство».

Отвязать устройство

Подключение устройства к клиенту

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

$ sudo usbip list -r 192.168.10.62
Exportable USB devices
======================
- 192.168.10.62
      1-3: Aktiv : Rutoken ECP (0a89:0030)
         : /sys/devices/pci0000:00/0000:00:14.0/usb1/1-3
         : (Defined at Interface level) (00/00/00)

Где 192.168.10.62 — адрес сервера (можно указать также имя узла).

Таким образом видно, что устройство с busid 1-3 привязано на сервере.

Подключение устройства:

$ sudo usbip attach -r 192.168.10.62 -b 1-3

Проверка подключения устройства:

$ lsusb | grep Rutoken
Bus 003 Device 004: ID 0a89:0030 Aktiv Rutoken ECP

Как видно, устройство Rutoken теперь подключено к клиентскому компьютеру.

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

$ sudo usbip port
Imported USB devices
====================
Port 00: <Port in Use> at Full Speed(12Mbps)
     Aktiv : Rutoken ECP (0a89:0030)
     3-1 -> usbip://192.168.10.62:3240/1-3
         -> remote bus/dev 001/027

Из этого вывода видно, что устройство подключено к порту 0. Теперь можно отключить его:

$ sudo usbip detach -p 0
usbip: info: Port 0 is now detached!

Подключение с использованием графического интерфейса

Для подключения устройства с помощью графического интерфейса запустите утилиту «Управление USBIP», введите адрес сервера в поле «Удалённые устройства USB» и нажмите кнопку «Перезагрузить». После этого устройство должно появиться в списке доступных. Для подключения устройства выделите его и нажмите кнопку «Присоединить устройство».

Присоединить устройство

После этого устройство пропадает из списка доступных и появляется в списке присоединённых.

Устройство в списке присоединённых

Для отключения выделите устройство в списке присоединённых и нажмите кнопку «Отсоединить устройство».