Domar USB/IP

La tasca de connectar un dispositiu USB a un PC remot mitjançant una xarxa local sorgeix regularment. A sota del tall hi ha l'historial de les meves cerques en aquesta direcció i el camí cap a una solució ja feta basada en un projecte de codi obert USB/IP amb una descripció dels obstacles instal·lats acuradament per diverses persones al llarg d'aquest camí, així com les maneres d'eludir-los.

Primera part, històrica

Si la màquina és virtual, tot això és fàcil. La funcionalitat de reenviament USB des de l'amfitrió a la màquina virtual va aparèixer a VMWare 4.1. Però en el meu cas, la clau de seguretat, identificada com a WIBU-KEY, havia d'estar connectada a diferents màquines en diferents moments, i no només virtuals.
La primera ronda de cerca el 2009 em va portar a un maquinari anomenat TrendNet TU2-NU4
Pros:

  • de vegades fins i tot funciona

Contres:

  • no sempre funciona. Suposem que la clau de protecció Guardant Stealth II no comença a través d'ella, jurant amb l'error "no es pot iniciar el dispositiu".
  • El programari per gestionar (llegiu: muntar i desmuntar dispositius USB) és extremadament pobre. Interruptors de línia d'ordres, automatització - no, no ho hem sentit. Tot es fa amb les teves mans. Malson.
  • El programari de control cerca el propi maquinari a la xarxa mitjançant la difusió, de manera que només funciona dins d'un segment de difusió de la xarxa. No podeu especificar l'adreça IP de la peça de maquinari manualment. La peça de maquinari està en una subxarxa diferent? Llavors tens un problema.
  • Els desenvolupadors han renunciat al dispositiu, enviar informes d'errors no serveix de res.

La segona ronda va passar en un temps no tan llunyà i em va portar al tema de l'article: Projecte USB/IP. Atreu amb la seva obertura, sobretot perquè els nois de ReactOS Van signar un controlador per a Windows, així que ara fins i tot a x64 tot funciona sense crosses com el mode de prova. Per això moltes gràcies a l'equip de ReactOS! Tot sona bonic, intentem sentir-ho, és realment així? Malauradament, el projecte en si també està abandonat i no podeu comptar amb el suport, però allà on el nostre no ha desaparegut, el codi font hi és, ho descobrirem!

Segona part, servidor-Linux

Un servidor USB/IP que comparteix dispositius USB a través d'una xarxa només es pot instal·lar en un sistema operatiu basat en Linux. Bé, Linux és Linux, instal·leu Debian 8 a la màquina virtual amb una configuració mínima, moviment de mà estàndard:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

Establert. Aleshores, Internet suggereix que cal descarregar el mòdul usbip, però - hola, primer rake. No existeix aquest mòdul. Això es deu al fet que la majoria dels manuals de la xarxa fan referència a la branca més antiga 0.1.x, i en l'última 0.2.0 els mòduls usbip tenen noms diferents.

Per tant:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

Bé, afegim les següents línies a /etc/modules per carregar-les automàticament quan s'iniciï el sistema:

usbip-core
usbip-host
vhci-hcd

Comencem el servidor usbip:

sudo usbipd -D

A més, la saviesa universal ens diu que usbip inclou scripts que ens permeten gestionar el servidor: mostrar quin dispositiu compartirà a la xarxa, veure'n l'estat, etc. Aquí ens espera una altra eina de jardí: aquests scripts de la branca 0.2.x han canviat de nom. Podeu obtenir una llista d'ordres utilitzant

sudo usbip

Després de llegir la descripció de les ordres, queda clar que per compartir el dispositiu USB necessari, usbip vol esbrinar el seu ID de bus. Benvolguts espectadors, el rastell número tres de l'arena: el Bus ID que ens donarà lsusb (semblaria la manera més òbvia) - no li convé! El fet és que usbip ignora el maquinari com els concentradors USB. Per tant, utilitzarem l'ordre incorporada:

user@usb-server:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

Nota: aquí i més enllà de les llistes ho descriuré tot utilitzant l'exemple de la meva clau USB específica. El vostre nom de maquinari i el parell VID:PID poden i seran diferents. El meu es diu Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Ara podem compartir el nostre dispositiu:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

Hurra, companys!

user@usb-server:~$ sudo usbip list -r localhost
Exportable USB devices
======================
 - localhost
        1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
           : /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)

Tres ànims, companys! El servidor ha compartit el maquinari a la xarxa i el podem connectar! Tot el que queda és afegir l'inici automàtic del dimoni usbip a /etc/rc.local

usbipd -D

Tercera part, del costat del client i confusa

Immediatament vaig intentar connectar el dispositiu compartit a través de la xarxa a una màquina amb Debian al mateix servidor i tot es va connectar perfectament:

sudo usbip attach --remote=localhost --busid=1-1

Passem a Windows. En el meu cas era Windows Server 2008R2 Standard Edition. El manual oficial us demana que primer instal·leu el controlador. El procediment està perfectament descrit al readme inclòs amb el client de Windows, ho fem tot tal com està escrit, tot funciona. També funciona amb XP sense cap dificultat.

Un cop desembalat el client, intentem muntar la nostra clau:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Oh oh. Alguna cosa ha anat malament. Utilitzem l'habilitat de Google. Hi ha mencions fragmentàries que alguna cosa no funciona amb les constants a la part del servidor, els desenvolupadors van canviar la versió del protocol en passar a la versió 0.2.0, però al client Win s'han oblidat de fer-ho. La solució proposada és canviar la constant del codi font i reconstruir el client.

Però realment no vull descarregar Visual Studio per a aquest procediment. Però tinc el bon vell Hiew. Al codi font, la constant es declara com una paraula doble. Busquem 0x00000106 al fitxer, substituint-lo per 0x00000111. No oblideu, l'ordre dels bytes és invers. El resultat són dos partits, peguem:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

Aaaand... sí!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

Aquest podria haver estat el final de la història, però la música no va sonar durant molt de temps. Després de reiniciar el servidor, vaig descobrir que el dispositiu del client no estava muntat!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Això és tot. Ni tan sols l'omniscient Google no va poder respondre això per mi. I al mateix temps, l'ordre per mostrar els dispositius disponibles al servidor es mostra correctament: aquí està, la clau, podeu muntar-la. Intento muntar des de Linux: funciona! I si ho provem ara des de Windows? Oh horror, funciona!

L'últim rasclet: no s'ha escrit alguna cosa al codi del servidor. Quan es comparteix un dispositiu, no llegeix el nombre de descriptors USB d'aquest. I quan es munta un dispositiu des de Linux, aquest camp s'omple. Malauradament, estic familiaritzat amb el desenvolupament de Linux al nivell "make && make install". Per tant, el problema es va resoldre mitjançant un hack bastant brut - afegint a /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

Part final

Després d'algun calvari, funciona. S'ha aconseguit el desitjat, ara la clau es pot muntar a qualsevol PC (i desmuntar, és clar, també), inclòs fora del segment de broadcast de la xarxa. Si voleu, podeu fer-ho mitjançant un script d'intèrpret d'ordres. El que és bo és que el plaer és totalment gratuït.
Espero que la meva experiència ajudi els pirates informàtics a evitar el rasclet que em queda imprès al front. Gràcies per la vostra atenció!

Font: www.habr.com

Afegeix comentari