Oppgaven med å koble en USB-enhet til en ekstern PC via et lokalt nettverk oppstår regelmessig. Under snittet er historien til mine søk i denne retningen, og veien til en ferdig løsning basert på et åpen kildekode-prosjekt
Del én, historisk
Hvis maskinen er virtuell, er alt dette enkelt. Funksjonaliteten til USB-videresending fra verten til den virtuelle maskinen dukket opp i VMWare 4.1. Men i mitt tilfelle måtte sikkerhetsnøkkelen, identifisert som WIBU-KEY, kobles til forskjellige maskiner til forskjellige tider, og ikke bare virtuelle.
Den første søkerunden tilbake i 2009 førte meg til en maskinvare kalt
Pros:
- noen ganger fungerer det til og med
Cons:
- fungerer ikke alltid. La oss si at Guardant Stealth II-beskyttelsesnøkkelen ikke starter gjennom den, og sverger med feilen "enheten kan ikke startes."
- Programvaren for å administrere (les: montering og avmontering av USB-enheter) er ekstremt dårlig. Kommandolinjebrytere, automatisering - nei, vi har ikke hørt. Alt gjøres med hendene. Mareritt.
- Kontrollprogramvaren søker etter selve maskinvaren på nettverket ved å kringkaste, så den fungerer kun innenfor ett kringkastingssegment av nettverket. Du kan ikke spesifisere IP-adressen til maskinvaren manuelt. Er maskinvaren på et annet subnett? Da har du et problem.
- Utviklerne har gitt opp enheten, å sende feilrapporter er ubrukelig.
Den andre runden skjedde i en tid ikke så fjern, og førte meg til emnet for artikkelen -
Del to, server-Linux
En USB/IP-server som deler USB-enheter over et nettverk kan bare installeres i et Linux-basert operativsystem. Vel, Linux er Linux, installer Debian 8 på den virtuelle maskinen i en minimal konfigurasjon, standard håndbevegelse:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip
Etablert. Da foreslår Internett at du må laste ned usbip-modulen, men – hei, første rake. Det finnes ingen slik modul. Dette er fordi de fleste manualene på nettverket refererer til den eldre grenen 0.1.x, og i siste 0.2.0 har usbip-modulene forskjellige navn.
derfor:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip
Vel, la oss legge til følgende linjer i /etc/modules for å laste dem automatisk når systemet starter:
usbip-core
usbip-host
vhci-hcd
La oss starte usbip-serveren:
sudo usbipd -D
Videre forteller den universelle visdommen oss at usbip kommer med skript som lar oss administrere serveren – vise hvilken enhet den vil dele over nettverket, se status, og så videre. Her venter et annet hageverktøy på oss - disse skriptene i 0.2.x-grenen har igjen fått nytt navn. Du kan få en liste over kommandoer ved å bruke
sudo usbip
Etter å ha lest beskrivelsen av kommandoene, blir det klart at for å dele den nødvendige USB-enheten, ønsker usbip å finne ut sin buss-ID. Kjære seere, rake nummer tre i arenaen: Buss-IDen som vil gi oss lsusb (det virker som den mest åpenbare måten) - passer henne ikke! Faktum er at usbip ignorerer maskinvare som USB-huber. Derfor vil vi bruke den innebygde kommandoen:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)
Merk: her og videre i listene vil jeg beskrive alt ved å bruke eksemplet på min spesifikke USB-nøkkel. Maskinvarenavnet ditt og VID:PID-paret kan og vil være annerledes. Min heter Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
Nå kan vi dele enheten vår:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete
Hurra, kamerater!
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)
Tre hurra, kamerater! Serveren har delt maskinvaren over nettverket, og vi kan koble den til! Alt som gjenstår er å legge til autostart av usbip-demonen i /etc/rc.local
usbipd -D
Del tre, klient-side og forvirrende
Jeg prøvde umiddelbart å koble den delte enheten over nettverket til en maskin som kjører Debian på samme server, og alt koblet perfekt:
sudo usbip attach --remote=localhost --busid=1-1
La oss gå videre til Windows. I mitt tilfelle var det Windows Server 2008R2 Standard Edition. Den offisielle håndboken ber deg installere driveren først. Prosedyren er perfekt beskrevet i readme som følger med Windows-klienten, vi gjør alt som skrevet, alt ordner seg. Det fungerer også på XP uten problemer.
Etter å ha pakket ut klienten prøver vi å montere nøkkelen vår:
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
Åh åh. Noe gikk galt. La oss bruke Google-ferdighetene. Det er fragmentariske omtaler om at noe er galt med konstantene; i serverdelen endret utviklerne protokollversjonen når de flyttet til versjon 0.2.0, men i Win-klienten glemte de å gjøre dette. Den foreslåtte løsningen er å endre konstanten i kildekoden og gjenoppbygge klienten.
Men jeg vil virkelig ikke laste ned Visual Studio for denne prosedyren. Men jeg har den gode gamle Hiew. I kildekoden er konstanten erklært som et dobbeltord. La oss se etter 0x00000106 i filen, og erstatte den med 0x00000111. Ikke glem, byte-rekkefølgen er omvendt. Resultatet er to kamper, vi lapper:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11
Aaaand... ja!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1
Dette kunne vært slutten på historien, men musikken spilte ikke lenge. Etter omstart av serveren oppdaget jeg at enheten på klienten ikke var montert!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device
Det er alt. Selv den allvitende Google kunne ikke svare på dette for meg. Og samtidig viser kommandoen for å vise enhetene som er tilgjengelige på serveren ganske riktig - her er den, nøkkelen, du kan montere den. Jeg prøver å montere fra Linux - det fungerer! Hva om vi prøver nå fra Windows? Å grusomt - det fungerer!
Den siste raken: noe ble ikke skrevet i serverkoden. Når du deler en enhet, leser den ikke antall USB-beskrivelser fra den. Og når du monterer en enhet fra Linux, fylles dette feltet ut. Dessverre er jeg kjent med Linux-utvikling på nivået "make && make install". Derfor ble problemet løst ved å bruke et ganske skittent hack - å legge til /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00
Siste del
Etter noen prøvelser fungerer det. Ønsket er oppnådd, nå kan nøkkelen monteres på hvilken som helst PC (og avmontert selvfølgelig også), inkludert utenfor kringkastingssegmentet til nettverket. Hvis du vil, kan du gjøre dette ved å bruke et kommandoskallskript. Det som er fint er at gleden er helt gratis.
Jeg håper at min erfaring vil hjelpe hackerne å komme seg rundt raken som er innprentet i pannen min. Takk for din oppmerksomhet!
Kilde: www.habr.com