USB/IP temmen

De taak om een ​​USB-apparaat via een lokaal netwerk op een pc op afstand aan te sluiten, komt regelmatig voor. Onder de snede wordt de geschiedenis van mijn zoektochten in deze richting uiteengezet en het pad naar een kant-en-klare oplossing op basis van een open-sourceproject USB/IP met een beschrijving van de obstakels die zorgvuldig door verschillende mensen op dit pad zijn geplaatst, evenals manieren om ze te omzeilen.

Deel één, historisch

Als de machine virtueel is, is dit allemaal eenvoudig. De functionaliteit van USB-forwarding van een host naar een virtuele machine verscheen in VMWare 4.1. Maar in mijn geval moest de beveiligingssleutel, herkenbaar als WIBU-KEY, op verschillende tijdstippen verbonden zijn met verschillende machines, en niet alleen virtuele.
De eerste zoektocht in het verre 2009 leidde me naar een stuk ijzer genaamd TrendNet TU2-NU4
Voors:

  • soms lukt het zelfs

Tegens:

  • werkt niet altijd. Stel dat de Guardant Stealth II-beveiligingssleutel er niet doorheen start, zwerend met de fout "apparaat kan niet worden gestart".
  • Beheersoftware (lezen - USB-apparaten koppelen en ontkoppelen) is extreem zielig. Commandoregelschakelaars, automatisering - nee, nog niet gehoord. Alles is gewoon met de hand. Nachtmerrie.
  • de besturingssoftware zoekt het stuk ijzer zelf in het netwerk door uitzending, dit werkt dus alleen binnen één uitzendnetwerksegment. U kunt het IP-adres van het stuk ijzer niet met de hand opgeven. Een stuk ijzer in een ander subnet? Dan heb je een probleem.
  • ontwikkelaars scoorden op het apparaat, het heeft geen zin om bugrapporten te verzenden.

De tweede ronde vond plaats in tijden die niet zo ver weg waren, en leidde me naar het onderwerp van het artikel: USB/IP-project. Trekt aan met openheid, vooral omdat de jongens van ReactOS De chauffeur tekende namens hen. WindowsDus nu werkt alles zelfs op x64 zonder omwegen zoals de testmodus. Enorm veel dank aan het ReactOS-team daarvoor! Het klinkt allemaal geweldig, laten we het eens uitproberen om te zien of het echt waar is. Helaas is het project zelf stopgezet en is ondersteuning moeilijk te krijgen, maar we werken er nog steeds aan, de broncode is er, we vinden er wel een oplossing voor!

Deel twee, server-linux

Een USB/IP-server die USB-apparaten via een netwerk deelt, kan alleen worden ingesteld in Linux-gebaseerd besturingssysteem. Nou ja, Linux is Linux, dus laten we het installeren op een virtuele machine. Debian 8 in minimale configuratie, standaard handbeweging:

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

Vereffend. Verder suggereert internet dat je de usbip-module moet downloaden, maar - hallo, de eerste hark. Zo'n module is er niet. En dat allemaal omdat de meeste handleidingen op het netwerk verwijzen naar de oudere tak 0.1.x, en in de laatste 0.2.0 hebben de usbip-modules verschillende namen.

daarom:

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

Laten we de volgende regels toevoegen aan /etc/modules om ze automatisch te laden bij het opstarten van het systeem:

usbip-core
usbip-host
vhci-hcd

Laten we de usbip-server starten:

sudo usbipd -D

Verder vertelt de universele geest ons dat usbip wordt geleverd met scripts waarmee we de server kunnen beheren - laten zien welk apparaat het via het netwerk zal delen, de status bekijken, enzovoort. Hier wacht ons nog een tuingereedschap - deze scripts in de 0.2.x-tak hebben opnieuw een nieuwe naam gekregen. U kunt een lijst met opdrachten krijgen met

sudo usbip

Na het lezen van de beschrijving van de commando's, wordt het duidelijk dat usbip zijn bus-ID wil weten om het vereiste USB-apparaat te delen. Beste kijkers, rake nummer drie is in de arena: de Bus ID die ons gaat geven lsusb (het lijkt de meest voor de hand liggende manier) - het past niet bij haar! Feit is dat usbip hardware zoals USB-hubs negeert. Daarom zullen we de ingebouwde opdracht gebruiken:

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

Opmerking: hierna in de lijsten zal ik alles beschrijven aan de hand van het voorbeeld van mijn specifieke USB-stick. Uw hardwarenaam en VID:PID-paar kunnen en zullen verschillen. De mijne heet Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nu kunnen we ons apparaat delen:

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

Hoera, kameraden!

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)

Drie hoeraatjes, kameraden! De server heeft het stuk ijzer gedeeld via het netwerk en we kunnen het verbinden! Het blijft alleen om de autostart van de usbip-daemon toe te voegen aan /etc/rc.local

usbipd -D

Deel drie, client-side en verwarrend

Verbind het gedeelde apparaat met de computer waarop het netwerk draait. Debian Ik heb het meteen op dezelfde server geprobeerd en alles werkte perfect:

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

overgaan tot WindowsIn mijn geval was het Windows Server 2008R2 Standard Edition. De officiële handleiding schrijft voor om eerst het stuurprogramma te installeren. De procedure staat goed beschreven in het readme-bestand dat bij de Windows-client is meegeleverd; we hebben de instructies gevolgd en alles werkte prima. Het werkt ook zonder problemen op XP.

Nadat we de client hebben uitgepakt, proberen we onze sleutel te koppelen:

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. Er is iets fout gegaan. We gebruiken de vaardigheid van Google. Er zijn fragmentarische vermeldingen dat er iets mis is met de constanten; in het servergedeelte hebben de ontwikkelaars de protocolversie gewijzigd bij het overschakelen naar versie 0.2.0, maar ze zijn vergeten dit te doen in de Win-client. De voorgestelde oplossing is om de constante in de broncode te wijzigen en de client opnieuw op te bouwen.

Maar ik wil Visual Studio echt niet downloaden omwille van deze procedure. Maar ik heb een goede oude Hiew. In de broncode wordt de constante gedeclareerd als een dubbel woord. Laten we in het bestand kijken naar 0x00000106 en het vervangen door 0x00000111. Vergeet niet dat de bytevolgorde omgekeerd is. Het resultaat is twee wedstrijden, patch:

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

Eeeee... ja!

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

Dit had de presentatie kunnen beëindigen, maar de muziek speelde niet lang. Nadat ik de server opnieuw had opgestart, ontdekte ik dat het apparaat op de client niet is aangekoppeld!

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

En dat is alles. Zelfs het alwetende Google kon hier geen antwoord op geven. Ondertussen laat het commando om de beschikbare apparaten op de server weer te geven het wel degelijk correct zien: hier is het, de sleutel, je kunt het koppelen. Ik probeer het te koppelen vanuit... Linux - Het werkt! En als we het van onderaf proberen... WindowsO jee, wat een ramp – het werkt!

Het laatste probleem: er ontbreekt iets in de servercode. Bij het delen van een apparaat leest het de USB-descriptors niet uit. En bij het mounten van een apparaat vanuit een andere server... LinuxDit veld is ingevuld. Helaas, met de ontwikkeling die gaande is... Linux Ik ben bekend met "make && make install". Het probleem werd dus opgelost met een nogal onorthodoxe truc: het toevoegen aan /etc/rc.local.

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

Deel finale

Na wat gepuzzel werkt het. Het gewenste resultaat is bereikt, nu kan de sleutel op elke pc worden aangekoppeld (en natuurlijk ook weer ontkoppeld), ook die buiten het omroepnetwerksegment. Als je wilt, kun je dit doen met behulp van een shellscript. Wat leuk is - het plezier is helemaal gratis.
Ik hoop dat mijn ervaring Habrazhiteli zal helpen om de hark te omzeilen die op mijn voorhoofd is gedrukt. Bedankt voor uw aandacht!

Bron: www.habr.com

Koop betrouwbare hosting voor sites met DDoS-bescherming, VPS VDS-servers 🔥 Koop betrouwbare websitehosting met DDoS-bescherming, VPS- en VDS-servers | ProHoster