USB/IP megszelídítése

Gyakran felmerül a feladat, hogy USB-eszközt csatlakoztassunk egy távoli PC-hez helyi hálózaton keresztül. A cikkben bemutatom a kereséseim történetét ezen a téren, és az open-source projekt alapján készült végső megoldást. USB/IP a különböző emberek által felállított akadályok leírásával, valamint az azok megkerülésének módjaival.

Első rész, történelmi

Ha a gép virtuális, akkor mindez nem nehéz. A USB-használat a gazdagépből a virtuális gépbe már VMware 4.1 óta létezik. De az én esetemben a WIBU-KEY néven azonosított védelmi kulcsot különböző gépekre kellett csatlakoztatni, nem csak virtuálisakra.
A keresés első köre 2009 táján vezetett egy eszközhöz, amelynek neve TrendNet TU2-NU4
Előnyök:

  • néha még működik is

Hátrányok:

  • nem mindig működik. Például a Guardant Stealth II védelmi kulcs nem indul el rajta, hibát jelezve, hogy „az eszköz nem indítható el”.
  • A kezelő szoftver (értsd - USB-eszközök csatolása és leválasztása) rendkívül gyenge. Parancssori opciók, automatizálás - nem, erről hallani sem hallottak. Minden kézzel. Rémes.
  • A kezelő szoftver széleskörű kereséssel Keresi az eszközt a hálózaton, tehát csak egy broadcast-szegmensen belül működik. Az eszköz IP-címét kézzel megadni nem lehet. Az eszköz más alhálózaton van? Akkor problémád van.
  • A fejlesztők figyelmen kívül hagyták az eszközt, hibajelentéseket küldeni hasztalan.

A második kör a már nem olyan távoli időszakban történt, és a cikk témájához vezetett - USB/IP projekt. Vonzza a nyitottságával, különösen mivel a ReactOS csapata ReactOS vezetett egy Windows-illesztőprogramot ehhez, így most már az x64-en is működik mindenféle hackelés nélkül, mint például a tesztmód. Nagy köszönet a ReactOS csapatának! Minden szépnek tűnik, próbáljuk ki, hogy valóban úgy van-e? Sajnos a projekt maga is elhanyagolt, és a támogatásra nem lehet számítani - de hol nem volt, a forráskód itt van, majd megoldjuk!

Második rész, szerver-linukszos

A USB/IP szerver, amely megosztja a USB-eszközöket a hálózaton, csak Linux-alapú operációs rendszeren állítható be. Na, ha linux, akkor linux, telepítjük a Debian 8-at minimális konfigurációban virtuális gépre, a szokásos kézi lépés:

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

Telepítve. Most az internet azt javasolja, hogy töltsük le a usbip modult, de hello, itt jönnek az első buktatók. Nincs ilyen modul. Mindez azért van, mert a legtöbb online útmutató a régebbi 0.1.x verziókra vonatkozik, míg a legújabb 0.2.0 verzióban az usbip modulok más neveket viselnek.

Ezért:

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

Most pedig adjunk hozzá ilyen sorokat a /etc/modules fájlhoz, hogy automatikusan betöltődjenek a rendszerindításkor:

usbip-core
usbip-host
vhci-hcd

Indítsuk el az usbip szervert:

sudo usbipd -D

Most az univerzális tudás azt sugallja, hogy a usbip-hez olyan szkriptek tartoznak, amelyek lehetővé teszik számunkra a szerver kezelését — például megmutatják, hogy melyik eszközt fogja megosztani a hálózaton, megnézhetjük az állapotot és így tovább. Itt egy újabb buktató vár ránk — ezek a szkriptek a 0.2.x verzióban, ismét, átnevezésre kerültek. A parancsok listáját a következővel kaphatjuk meg:

sudo usbip

A parancsok leírásának elolvasása után világossá válik, hogy ahhoz, hogy megosszuk a szükséges USB-eszközt, az usbip szeretné tudni a Bus ID-ját. Tisztelt nézők, a harmadik buktató: az a Bus ID, amit a lsusb (úgy tűnik, a legnyilvánvalóbb út) — nem megfelelő! Az a helyzet, hogy az usbip figyelmen kívül hagyja az olyan eszközöket, mint a USB hubok. Ezért használjuk a beépített parancsot:

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

Megjegyzés: itt és a továbbiakban a listákban mindent a saját konkrét USB kulcsom példájával fogok bemutatni. A gépem neve Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7 lehet, hogy a te eszközöd neve és VID:PID párod eltér.

Most már megoszthatjuk az eszközünket:

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

Hurra, elvtársak!

user@usb-server:~$ sudo usbip list -r localhost
Exportálható USB eszközök
======================
 - 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
           : Gyártóspecifikus osztály / ismeretlen alosztály / ismeretlen protokoll (ff/00/ff)

Háromszori hurra, elvtársak! A szerver megosztotta az eszközt a hálózaton, és most már csatlakoztathatjuk! Csak annyit kell tennünk, hogy hozzáadjuk az usbip démon automatikus indítását a /etc/rc.local fájlhoz.

usbipd -D

Harmadik rész, kliens- és bonyolult rész

A megosztott eszközt a Debian operációs rendszert futtató gépemhez való csatlakoztatását azonnal megpróbáltam ugyanazon a szerveren, és minden nagyszerűen csatlakozott:

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

Térjünk át Windowsra. Az én esetemben ez a Windows Server 2008R2 Standard Edition volt. A hivatalos útmutató először a meghajtó telepítését kéri. A folyamatot szépen leírták a Windows klienshez mellékelt readme fájlban, mindent a leírtak szerint csinálunk, és minden rendben van. Az XP-n is működik, minden nehézség nélkül.

A kliens kicsomagolása után próbáljuk meg csatlakoztatni a kulcsunkat:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip hiba: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip hiba: usbip_windows.c: 756 (query_interface0) recv op_common
usbip hiba: usbip_windows.c: 829 (attach_device) nem található eszköz

Ó, ó. Valami nem stimmel. Használjuk a Google tudományát. Részleges említések találhatók, hogy valami nem stimmel a konstansokkal; a szerver oldalon a fejlesztők a 0.2.0 verzióra való áttéréskor megváltoztatták a protokoll verzióját, míg a Windows kliensben ezt elfelejtették. Az ajánlott megoldás — változtassuk meg a konstansot a forráskódban és recompile-eljük a klienst.

Csak nagyon nem szeretném letölteni a Visual Studiot emiatt. De van egy régi jó hívott Hiew. A forráskódban a konstans dupla szóként van deklarálva. Keresgéljünk a fájlban 0х00000106, cserélve 0х00000111-ra. Ne feledjük, a bájtok sorrendje megfordított. Az eredmény — két egyezés, patcheljük:

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

És igen!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
új USB eszköz csatlakoztatva az usbvbus 1. porthoz

Ezen a ponton befejezhetném a leírást, de a zene nem tartott sokáig. A szerver újraindításakor felfedeztem, hogy az eszköz a kliensen nem csatlakozik!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip hiba: usbip_windows.c: 829 (attach_device) nem található eszköz

És ez minden. Erre még a mindentudó Google sem tudott válaszolni. A csapat viszont helyesen mutatja az elérhető eszközöket a szerveren - itt van, a kulcs, csatlakoztathatod. Próbálom Linuxról csatlakoztatni - működik! És ha most megpróbálom Windowsról? Ó, borzalom - ez működik!

Az utolsó gubanc: valami hiányzik a szerver kódjából. Az eszköz megosztásakor nem olvassa be a USB-leírók számát. De amikor az eszközt Linuxról csatlakoztatod, ez a mező ki van töltve. Sajnos a Linuxos fejlesztéssel csak "make && make install" szinten vagyok tisztában. Ezért a probléma megoldva egy elég durva hack segítségével — a /etc/rc.local fájlba való hozzáadással.

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

Záró rész

Néhány nehézség után működik. A kívánt eredmény megvan, most a kulcsot bármelyik számítógéphez csatlakoztathatjuk (és le is választhatjuk, természetesen), beleértve a hálózati széles sávú szegmensen kívüli rendszereket is. Ha szeretnénk, ezt parancssori szkripttel is megtehetjük. Ami kellemes, az a tapasztalat teljesen ingyenes.
Remélem, hogy tapasztalataim segítenek a hubeleknek elkerülni azokat a buktatókat, amelyeket én tapasztaltam. Köszönöm a figyelmet!

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster