Автор вот этой статьи поднял вопрос, который наверное волнует тех, кто пользуется различными USB-токенами: как подключить USB-токен удаленно?

ИМХО, ничего сложного нет, я попробую это сделать, взяв тот же самый USB-токен.
Для начала и для общего представления - что есть что:

В Линуксе проброс USB устройств через сеть реализован на уровне ядра, то есть это не какая-то специальная программа, которая этим занимается, а драйвер в ядре.
И если этого драйвера в ядре нет (а его может и не быть — не вкомпилировал вендор, решил что не надо — имеет право) — то работать ничего, конечно, не будет.

Можно самостоятельно пересобрать ядро ручками, но это задача не для всех, поэтому таким мы заниматься не станем.
Будем считать, что ядро нормальное.

А вот для работы с этим драйвером - нужен программный пакет, который надо установить, и проверить, что нужные модули есть и загружаются:

apt install usbip
modprobe usbip-core
modprobe usbip-host

Смотрим, что тут у нас есть:

usbip list -l
 - busid 2-1.1 (3151:3000)
   unknown vendor : unknown product (3151:3000)

 - busid 2-1.2 (0a89:0025)
   Aktiv : Rutoken lite (0a89:0025)

 - busid 2-1.3 (0a12:0001)
   Cambridge Silicon Radio, Ltd : Bluetooth Dongle (HCI mode) (0a12:0001)

Ага, нашелся Rutoken, экспортирую его и запускаю демона:

sudo usbip bind -b 2-1.2
sudo usbipd -D

Код 2-1.2 соответствует USB-порту, в который подключен токен.

Теперь иду на другую машину, которая находится вообще в другом здании, и подключаю там:

apt install usbip
modprobe usbip-core
modprobe vhci-hcd

usbip list -r <IP_сервера>
Exportable USB devices
======================
 - X.X.X.X
      2-1.2: Aktiv : Rutoken lite (0a89:0025)
           : /sys/devices/platform/soc/5101000.usb/usb2/2-1/2-1.2
           : (Defined at Interface level) (00/00/00)

usbip attach -r X.X.X.X -b 2-1.2
lsusb
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 004: ID 0a89:0025 Aktiv Rutoken lite
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

Вот он там есть. Теперь попробую его подключить, поскольку машина "новая" и с токенами не работала - устанавливаю нужные пакеты:

# apt install pcscd pcsc-tools opensc

# pcsc_scan 
PC/SC device scanner
V 1.6.2 (c) 2001-2022, Ludovic Rousseau <ludovic.rousseau@free.fr>
Using reader plug'n play mechanism
Scanning present readers...
0: Aktiv Rutoken lite 00 00
 
Mon Nov 24 12:17:20 2025
 Reader 0: Aktiv Rutoken lite 00 00
  Event number: 0
  Card state: Card inserted, 
  ATR: 3B 8B 01 52 75 74 6F 6B 65 6E 6C 69 74 65 C2

ATR: 3B 8B 01 52 75 74 6F 6B 65 6E 6C 69 74 65 C2
+ TS = 3B --> Direct Convention
+ T0 = 8B, Y(1): 1000, K: 11 (historical bytes)
  TD(1) = 01 --> Y(i+1) = 0000, Protocol T = 1 
-----
+ Historical bytes: 52 75 74 6F 6B 65 6E 6C 69 74 65
  Category indicator byte: 52 (proprietary format)
+ TCK = C2 (correct checksum)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B 8B 01 52 75 74 6F 6B 65 6E 6C 69 74 65 C2
	Aktiv Rutoken Lite
	https://www.rutoken.ru/products/all/rutoken-lite/

Ctrl-C

# pkcs11-tool -L
Available slots:
Slot 0 (0x0): Aktiv Rutoken lite 00 00
  (token not recognized)

Токен найден, но не опознан, потому что ему нужен его родной PCSC-драйвер.

Тут пришлось идти на сайт, искать драйвера.
Т.к. у меня Armbian, т.е. Debian под arm64 - обычные x86 пакеты не подошли, но по счастью, там есть раздел Другие (MIPS, Байкал, ARM...)

Осталось скачать архив, найти в нем подходящий .deb-файл, распаковать его, извлечь .so-библиотеку и положить ее в /usr/lib/

dpkg -x librtpkcs11ecp_2.18.0.0-1_arm64.deb out
cd out

внутри - структура каталогов, в которой нужно найти библиотеку librtpkcs11ecp.so:

cp librtpkcs11ecp.so /usr/lib/

И пробую еще раз, с подключением драйвера:

# pkcs11-tool --module librtpkcs11ecp.so -L
Available slots:
Slot 0 (0x0): Aktiv Rutoken lite 00 00
  token label        : Rutoken lite <no label>
  token manufacturer : Aktiv Co.
  token model        : Rutoken lite
  token flags        : login required, rng, token initialized, PIN initialized
  hardware version   : 67.4
  firmware version   : 32.2
  serial num         : 465b41bd
  pin min/max        : 6/249
Slot 1 (0x1): 

В общем, всё работает. Уже можно менять пинкод, записывать и считывать данные из токена (но это выходит за рамки данной статьи, это я уже писал в статье про Рутокены).

А теперь — откл ючаемся:
На удаленной машине:

# usbip port
Imported USB devices
====================
Port 00: <Port in Use> at Full Speed(12Mbps)
       Aktiv : Rutoken lite (0a89:0025)
       5-1 -> usbip://X.X.X.X:3240/2-1.2
           -> remote bus/dev 002/008

# usbip detach -p 0

Где вон тот (0) - номер порта из команды port.

На локальной машине:

usbip unbind -b 2-1.2

Можно спокойно отключать токен.
Как видите, всё работает.

В принципе, можно процесс автоматизировать: программный пакет уже установлен, модули должны подгрузиться сами при необходимости (но можно их и принудительно загрузить, где-нибудь в /etc/rc.local, хуже не будет).

Остается выделить USB-порт, который будет использоваться только для проброса, и повесить на него udev-правило:

cd /etc/udev/rules.d

vim 99-usbfwd.rules
-----------------------------------
# раскомментировать нужное
# вот такое правило будет пробрасывать любое подключаемое устройство из любого порта
# ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", RUN+="/usr/local/bin/usb_fwd.sh"

# а вот так можно его ограничить конкретно на Rutoken
# ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_VENDOR_ID}=="0a89", ENV{ID_MODEL_ID}=="0025", RUN+="/usr/local/bin/usb_fwd.sh"
-----------------------------------

udevadm control --reload-rules

При подключении будет в тех или иных случаях выполняться скрипт /usr/local/bin/usb_fwd.sh:

#!/bin/sh

# фильтр по порту USB
FWD_PORT='2-1.2'

if [ "x$DEVPATH" = "" ]; then
  exit 0
fi

USB_ID=${DEVPATH##*/}

if [ "$USB_ID" = "$FWD_PORT" ]; then
  /sbin/usbip bind -b "$USB_ID"
fi
exit 0

Фильтрация по порту USB нужна для того чтобы не пробрасывались все подключенные устройства.
Теперь, допустим, если вы выбрали правило с указанием VENDOR_ID/MODEL_ID - при подключении конкретно Рутокена такой модели он будет проброшен на удаленный сервер автоматически.

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

#!/bin/sh -x 
 
server_ip='X.X.X.X' 
usb_port='2-1.2' 
 
/sbin/usbip list -r $server_ip | grep "$usb_port: Aktiv : Rutoken lite (0a89:0025)" >/dev/null 
 
if [ $? -eq 0 ] ; then 
        /sbin/usbip attach -r $server_ip -b $usb_port 
fi

В случае если такого устройства не проброшено — не происходит ничего, если проброшено — пройдет attach и устройство появится как подключенное, при повторном вызове снова не происходит ничего.

Если токен просто ��ытащить на локальном компьютере — он автоматически пропадет и на удаленном, и снова появится, если его снова подключить.

В общем, как-то так.

Комментарии (7)


  1. max9
    24.11.2025 15:09

    подскажите пожалуйста пару вещей:

    1) какой порт и протокол испольует usbip для проброса?

    2) в виртуалках нет проблем с их "cloud-kernel", где vhci-hcd просто выкошен даже из модулей?


    1. JBFW Автор
      24.11.2025 15:09

      man usbipd говорит нам:

      The daemon accepts connections from USB/IP clients on TCP port 3240 by default

      Про виртуалку не скажу, если выкошено из модулей - наверное и в ядре нет (или потребует модуля, которого нет)


      1. max9
        24.11.2025 15:09

        Про виртуалку не скажу, если выкошено из модулей - наверное и в ядре нет (или потребует модуля, которого нет)

        ну вот это самое неприятное, угу. спасибо за порт


  1. djton1k
    24.11.2025 15:09

    А с линукса пробросить в клиента на Винде каким образом возможно?


    1. JBFW Автор
      24.11.2025 15:09

      Вот чего не знаю - того не знаю.
      Вроде для Windows есть клиент, который это умеет, т.е. с Линукса туда - можно.
      Но сам не видел, не пробовал.


    1. 1CUnlimited
      24.11.2025 15:09

      В USB redirector без разницы на каких операционках сервер и клиент, можно использовать комбинации. Для usbip есть usbip-win как клиент, но сервера для win как я помню нет


    1. pariv
      24.11.2025 15:09

      Можно, пользуюсь уже второй год, воткнуто в Linux, используется на двух машинах с windows в зависимости от надобности (одновременно, конечно, на обоих не работает)