Skrotenie USB/IP

Pravidelne vyvstáva úloha pripojiť USB zariadenie k vzdialenému počítaču cez lokálnu sieť. Pod strihom je uvedená história mojich vyhľadávaní týmto smerom a cesta k hotovému riešeniu založenému na open-source projekte USB/IP s popisom prekážok, ktoré na tejto ceste starostlivo nastavili rôzni ľudia, ako aj spôsobov, ako ich obísť.

Prvá časť, historická

Ak je stroj virtuálny - to všetko je jednoduché. Funkcia presmerovania USB z hostiteľa na virtuálny počítač sa objavila vo VMWare 4.1. V mojom prípade však bezpečnostný kľúč, rozpoznateľný ako WIBU-KEY, musel byť pripojený v rôznych časoch k rôznym strojom, a to nielen virtuálnym.
Prvé kolo hľadania v ďalekom roku 2009 ma priviedlo ku kusu železa tzv TrendNet TU2-NU4
Pros:

  • niekedy to dokonca funguje

Nevýhody:

  • nefunguje vždy. Predpokladajme, že ochranný kľúč Guardant Stealth II sa cez neho nespustí a nadáva s chybou „zariadenie sa nedá spustiť“.
  • Softvér na správu (čítanie - pripojenie a odpojenie USB zariadení) je žalostný až do extrému. Prepínače príkazového riadku, automatizácia - nie, nepočuli. Všetko je len od ruky. Nočná mora.
  • riadiaci software si vyhladava kus zeleza v sieti sam vysielanim, takze to funguje len v ramci jedneho segmentu vysielacej siete. Nemôžete zadať IP adresu kusu železa ručne. Kus železa v inej podsieti? Potom máte problém.
  • vývojári na zariadení zabodovali, je zbytočné posielať hlásenia o chybách.

Druhé kolo sa odohralo v časoch nie tak vzdialených a priviedlo ma k téme článku - Projekt USB/IP. Priťahuje otvorenosťou, najmä odkedy chalani z ReactOS podpísal vodiča za nich Windows, takže teraz všetko funguje aj na x64 bez akýchkoľvek riešení, ako je testovací režim. Veľká vďaka tímu ReactOS za to! Znie to všetko skvele, poďme to vyskúšať a zistiť, či je to naozaj pravda. Bohužiaľ, samotný projekt bol opustený a podpora sa ťažko hľadá – ale stále na ňom pracujeme, zdrojový kód je k dispozícii, vymyslíme to!

Druhá časť, server-linux

Server USB/IP, ktorý zdieľa zariadenia USB cez sieť, je možné nastaviť iba v LinuxOS založený na . Linux je Linux, takže si ho nainštalujme na virtuálny počítač. Debian 8 v minimálnej konfigurácii, štandardný pohyb ruky:

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

Usadený. Internet ďalej naznačuje, že by ste si museli stiahnuť modul usbip, ale - ahoj, prvý rake. Takýto modul neexistuje. A to všetko preto, že väčšina príručiek v sieti odkazuje na staršiu vetvu 0.1.xa v najnovšej verzii 0.2.0 majú moduly usbip iné názvy.

Z tohto dôvodu:

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

Pridajme do /etc/modules nasledujúce riadky, aby sa automaticky načítali pri štarte systému:

usbip-core
usbip-host
vhci-hcd

Spustíme usbip server:

sudo usbipd -D

Ďalej, univerzálna myseľ nám hovorí, že usbip prichádza so skriptami, ktoré nám umožňujú spravovať server - ukazujú, ktoré zariadenie bude zdieľať cez sieť, vidieť stav atď. Tu na nás čaká ďalší záhradný nástroj - tieto skripty vo vetve 0.2.x boli opäť premenované. Môžete získať zoznam príkazov pomocou

sudo usbip

Po prečítaní popisu príkazov je jasné, že na zdieľanie požadovaného USB zariadenia chce usbip poznať jeho Bus ID. Vážení diváci, v aréne je číslo tri: Bus ID, ktoré nám dá lsusb (zdalo by sa to najzrejmejšie) - nehodí sa jej to! Faktom je, že usbip ignoruje hardvér, ako sú rozbočovače USB. Preto použijeme vstavaný príkaz:

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

Poznámka: ďalej v zoznamoch všetko popíšem na príklade môjho konkrétneho USB kľúča. Názov vášho hardvéru a pár VID:PID sa môžu a budú líšiť. Moja sa volá Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Teraz môžeme zdieľať naše zariadenie:

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

Hurá, súdruhovia!

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)

Trikrát na zdravie, súdruhovia! Server zdieľal kus železa cez sieť a môžeme ho pripojiť! Zostáva len pridať automatické spustenie démona usbip do /etc/rc.local

usbipd -D

Tretia časť, na strane klienta a mätúca

Pripojte zdieľané zariadenie k počítaču, na ktorom je spustená sieť Debian Hneď som to vyskúšal na tom istom serveri a všetko sa perfektne pripojilo:

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

Prejsť na WindowsV mojom prípade to bolo Windows Server 2008R2 Standard Edition. Oficiálna príručka vyžaduje najprv inštaláciu ovládača. Postup je dobre popísaný v súbore readme, ktorý je súčasťou klienta pre Windows; postupovali sme podľa pokynov a všetko fungovalo dobre. Funguje to bez problémov aj na XP.

Po rozbalení klienta sa pokúsime pripojiť náš kľúč:

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. Niečo sa pokazilo. Využívame schopnosti Google. Sú útržkovité zmienky, že niečo nie je v poriadku s konštantami, v serverovej časti vývojári pri prechode na verziu 0.2.0 zmenili verziu protokolu, ale zabudli na to vo Win klientovi. Navrhovaným riešením je zmena konštanty v zdrojovom kóde a prebudovanie klienta.

Ale kvôli tomuto postupu naozaj nechcem sťahovať Visual Studio. Ale mám starého dobrého Hiewa. V zdrojovom kóde je konštanta deklarovaná ako dvojité slovo. Pozrime sa v súbore na 0x00000106 a nahradíme ho 0x00000111. Pamätajte, že poradie bajtov je obrátené. Výsledkom sú dva zápasy, patch:

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

Eeeee... áno!

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

Tým sa mohla prezentácia skončiť, no hudba nehrala dlho. Po reštarte servera som zistil, že zariadenie na klientovi nie je pripojené!

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

A to je všetko. Ani vševediaci Google nevedel na túto otázku odpovedať. Medzitým príkaz na zobrazenie zariadení dostupných na serveri to zobrazuje úplne správne – tu je, kľúč, môžete ho pripojiť. Snažím sa ho pripojiť zospodu. Linux - Funguje to! A ak to skúsime zospodu WindowsOch, hrôza – funguje to!

Posledný problém: v kóde servera niečo chýba. Pri zdieľaní zariadenia sa z neho neprečíta počet USB deskriptorov. A pri pripájaní zariadenia zospodu... Linux, toto pole je vyplnené. Bohužiaľ, s vývojom v rámci Linux Poznám príkaz „make && make install“. Takže problém bol vyriešený dosť špinavým trikom – pridaním do /etc/rc.local

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

Časť záverečná

Po nejakom fičaní to funguje. Požadovaný výsledok bol dosiahnutý, teraz je možné kľúč pripojiť k akémukoľvek PC (a samozrejme aj odpojiť), vrátane tých mimo segmentu vysielacej siete. Ak chcete, môžete to urobiť pomocou skriptu shell. Čo je pekné - potešenie je úplne zadarmo.
Dúfam, že moje skúsenosti pomôžu habrazhiteli obísť hrable, ktoré sa mi odtlačili na čelo. Ďakujem za tvoju pozornosť!

Zdroj: hab.com

Kúpte si spoľahlivý hosting pre stránky s DDoS ochranou, VPS VDS servery 🔥 Kúpte si spoľahlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster