Автор вот этой статьи поднял вопрос, который наверное волнует тех, кто пользуется различными 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)

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

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

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

pariv
24.11.2025 15:09Можно, пользуюсь уже второй год, воткнуто в Linux, используется на двух машинах с windows в зависимости от надобности (одновременно, конечно, на обоих не работает)
max9
подскажите пожалуйста пару вещей:
1) какой порт и протокол испольует usbip для проброса?
2) в виртуалках нет проблем с их "cloud-kernel", где vhci-hcd просто выкошен даже из модулей?
JBFW Автор
man usbipd говорит нам:
The daemon accepts connections from USB/IP clients on TCP port 3240 by default
Про виртуалку не скажу, если выкошено из модулей - наверное и в ядре нет (или потребует модуля, которого нет)
max9
ну вот это самое неприятное, угу. спасибо за порт