Taltsutame USB/IP

Regulaarselt tekib vajadus ühendada USB-seade kaug-PC-ga üle kohaliku võrgu. Tagapool olen kirjeldanud oma otsingute ajalugu selles suunas ja teed valmislahendusele avatud lähtekoodiga projekti alusel. USB/IP kuna sellel teel on erinevad inimesed hoolikalt paigaldatud takistused ja nende ületamise viisid.

Esimene osa, ajalooline

Kui masin on virtuaalne, pole see keeruline. USB edastamise funktsionaalsus hostilt virtuaalmasinasse ilmus juba VMWare 4.1-s. Kuid minu puhul tuli kaitse võtme, mis tuvastatakse kui WIBU-KEY, erinevatel aegadel ühendada erinevatesse masinatesse, mitte ainult virtuaalsetesse.
Esmane otsing 2009. aastal viis mind seadme juurde nimega TrendNet TU2-NU4
Plussid:

  • mõnikord töötab isegi

Miinused:

  • kuid ei tööta alati. Näiteks kaitse võtme Guardant Stealth II kaudu see ei käivitunud, andes veateate 'seadet ei saa käivitada'.
  • Juhtimisprogramm (loe: USB-seadmete mountimine ja unmountimine) on äärmiselt vilets. Käskude read, automatiseerimine – ei, pole kuulnud. Kõik käib ainult käsitsi. Kohutav.
  • Juhtimisprogramm otsib seadet võrgus laia levikuga, seega töötab see ainult ühe broadcast-segmendi ulatuses. Seadme IP-aadressi ei saa käsitsi määrata. Kui seade on teises alavõrgus? Siis on teil probleem.
  • Arendajad on seadme puhul käed üles tõstnud, vigade aruande saatmine on mõttetu.

Teine voor juhtus juba mitte nii kaugel minevikus ja viis mind artikli teemani — USB/IP projekt. Selle avatus tõmbab tähelepanu, seda enam, et ReactOS-i mehed on sellele Windowsi draiveri alla kirjutanud, nii et nüüd töötab kõik isegi x64 all ilma igasuguste testrežiimi kätetuksideta. Selle eest on ReactOS meeskonnale suur tänu! Kõik kõlab kenasti, proovime välja selgitada, kas see on tõesti nii? Kahjuks on projekt ka natuke kõrvale jäänud ja toetusele ei tasu loota — aga kus meie kaotame, allikas on olemas, saame aru! ReactOS Teine osa, serveri ja Linuxi jagamine

USB/IP server, mis jagab USB-seadmeid üle võrgu, saab üles seada ainult Linuxi-põhistel operatsioonisüsteemidel. No mis siis, Linux ongi Linux, paigaldame virtuaalmasinale Debian 8 minimaalset konfiguratsiooni, standardne käte liikumine:

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

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

Paigaldasid. Edasi ütleb internet, et peaks laadima usbip mooduli, aga — tere, esimesed takistused. Sellist moodulit ei ole. Kõik on tingitud sellest, et enamik juhendeid internetis viitab vanemale 0.1.x harule, samas kui viimases 0.2.0 versioonis on usbip moodulitel teised nimed.

Seega:

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

Nüüd lisame failisse /etc/modules järgmised read, et laadida need automaatselt süsteemi käivitamisel:

usbip-core
usbip-host
vhci-hcd

Käivitame usbip serveri:

sudo usbipd -D

Edasi ütleb meile universaalne tarkus, et koos usbip-ga tulevad skriptid, mis võimaldavad serverit juhtida — näidata, millist seadet jagatakse võrgu kaudu, vaadata staatust jne. Siin ootab meid veel üks takistus — need skriptid on 0.2.x harus taas ümber nimetatud. Saame käsu loendi kasutades

sudo usbip

Käskude kirjeldust lugedes saab selgeks, et selleks, et jagada soovitud USB-seadet, tahab usbip teada selle Bus ID-d. Kallid vaatajad, areenil on kolm erinevat takistust: see Bus ID, mille annab meil lsusb (tundub, et kõige ilmselgem tee) — ei sobi! Asi on selles, et usbip ignoreerib seadmestikke, nagu USB-hubid. Seetõttu kasutame sisseehitatud käsku:

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

Märkus: siin ja edaspidi kirjeldan loetelusid minu konkreetse USB-mälupulga näite põhjal. Teie seadme nimi ja paar VID:PID võivad erineda. Minu seade on Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nüüd saame jagada meie seadet:

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

Hurraa, tovaroosid!

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)

Kolm korda hurraa, tovaroosid! Server jagas seadet võrgu kaudu, ja me saame selle ühendada! Järgmine, tuleb kirjutada usbip deemonisse autostart failis /etc/rc.local

usbipd -D

Kolmas osa, kliendi ja keeruline

Jagatud seadet proovisin võrgu kaudu ühendada Debianiga masina peal samal serveril, ja kõik ühendas suurepäraselt:

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

Liigume Windowsi juurde. Minu puhul oli see Windows Server 2008R2 Standard Edition. Ametlik juhend palub kõigepealt installida draiveri. Protseduur on suurepäraselt kirjeldatud Windowsi kliendi README-s, teeme kõik, nagu seal on kirjutatud, ning kõik toimib. XP puhul töötab samuti ilma igasuguste raskusteta.

Pakendist välja võttes proovime meie võtme monteerida:

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) seadet ei leitud

Oh-oh. Midagi läks valesti. Kasutame Google'i oskuseid. Kohtame katkendlikke mainimisi, et midagi on seal konstanditega valesti, serveri poolel muutis arendajatel versioon 0.2.0 puhul protokolli versiooni, kuid Windowsi kliendi jaoks unustati see muuta. Pakutud lahendus on — vahetage konstandi allika koodis ja kompileerige klient uuesti.

Aga ma ei soovi Visual Studiot selle protseduuri jaoks laadida. Küll aga on mul vana hea Hiew. Allikas defineerib konstandi kui topelt-sõna. Otsime failist 0х00000106, vahetades selle 0х00000111 vastu. Ärge unustage, et baitide järjekord on vastupidine. Tulemus — kaks vastet, patšime:

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

Ja… jah!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
uus USB-seade on ühendatud usbvbus porti 1

Sellega võiks jutu lõpetada, kuid muusika ei mänginud kaua. Serveri taaskäivitamisel avastasin, et seade ei monteeru kliendil!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) seadet ei leitud

Ja kõik. Sellele ei osanud isegi kõiketeadev Google vastata. Samas kuvab käsk seadmete loendi serveris täielikult korrektselt — siin on see, võtme saate monteerida. Proovin monteerida Linuxist — töötab! Aga kui nüüd proovida Windowsist? Oh õudust — see toimib!

Viimased takistused: midagi on serverikoodis puudu. Seadet jagades ei loeta seadmest USB-deskriiptorite arvu. Kuid seadme monteerimisel Linuxist täidetakse see väli. Kahjuks olen Linuxi arendamisega tuttav ainult "make && make install" tasemel. Seega on probleem lahendatud päris räpase häkkimisega — lisades /etc/rc.local

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

Lõpuosa

Pärast mõningaid katsumusi töötab see. Soovitud on saavutatud, nüüd saab võtme kinnitada igasse arvutisse (ja loomulikult ka eemaldada), sealhulgas - väljaspool võrgusegmenti. Kui soovite - saate seda teha käsurea skripti abil. Mis on tore - see on täiesti tasuta.
Loodan, et minu kogemus aitab Habr-i lugejatel vältida neid karide, mis on mulle meelde jäänud. Aitäh tähelepanu eest!

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster