
Mõnel meist ei ole interneti kasutamine VPNita mõnel põhjusel võimalik: kellegile on vajalik eraldi IP, ja lihtsam ning odavam on osta VPS kahele IP-le, kui osta aadress teenusepakkujalt; keegi soovib pääseda kõikidele veebisaitidele, mitte ainult Venemaal lubatutele; kolmandale on vajalik IPv6, aga teenusepakkuja ei paku seda...
Tavaliselt luuakse VPN-ühendus seadmes, mida kasutatakse antud hetkel, mis on täiesti arusaadav, kui teil on ainult üks arvuti ja üks telefon, ja kasutate neid harva samaaegselt. Kui teil on aga kodus palju seadmeid või näiteks on olemas seadmeid, kuhu VPN-i seadistada ei saa, oleks mugavam luua tunnel otse kodu ruuteris, et mitte muretseda iga seadme eraldi seadistamise üle.
Kui olete kunagi OpenVPN-i oma ruuterile installinud, siis olete tõenäoliselt olnud üllatunud selle töö kiirusest. Isegi odavate ruuterite SoC-d suudavad probleemideta edastada peaaegu gigabitise liikluse, kuna marsruutimise ja NAT funktsioonid on eraldi kiipidele, mis on mõeldud spetsiifiliselt selle ülesande täitmiseks, ning nende ruuterite peamised protsessorid on üsna nõrgad, kuna neile ei ole praktiliselt mingeid koormusi. Selline kompromiss võimaldab saavutada suure kiirusvõime, vähendades samal ajal valmis seadme hinda — võimsamate protsessoritega ruuterid maksavad mitu korda rohkem ja neid positsioneeritakse mitte ainult interneti jagamiseks, vaid ka NAS-ina, torrentide allalaadimiseks ja kodumaiste multimeedia süsteemideks.
Minu ruuter, TP-Link TL-WDR4300, ei ole just uus — mudel ilmus 2012. aasta keskel ning sellel on 560 MHz MIPS32 74Kc arhitektuuriga protsessor, mille võimsus piirdub vaid 20–23 Mbit/s krüpteeritud liiklusega OpenVPN-i kaudu, mis on tänapäevaste koduste internetikiirusede suhtes üsna vähe.
Kuidas saaksime suurendada krüpteeritud tunnelite kiirus? Minu ruuter on üsna funktsionaalne, toetab 3×3 MIMO ja töötab hästi, ei tahaks seda vahetada.
Kuna praegu on kombeks teha 10-megabaidiseid veebilehti, kirjutada töölauarakendusi node.js-is ja pakendada neid 100-megabaidistesse failidesse, suurendame arvutusvõimsust optimeerimise asemel. Me teeme midagi kohutavat — viime VPN-ühenduse jõulisele üheplaadilisele 'arvutile' Orange Pi One, mille paigutame ruuteri korpusesse, mitte ei blokeeri olemasolevaid võrgu- ja USB-porte, kõigest $9.99*!
* + transport, + maksud, + õlle jaoks, + MicroSD.
OpenVPN
Ruuti protsessorit ei saa tõeliselt nõrgaks nimetada — see suudab AES-128-CBC-SHA1 algoritmi abil andmeid krüpteerida ja hashrida kiirusel 50 Mb/s, mis on oluliselt kiirem kui OpenVPN-i töökiirus, ning kaasaegne voogedastuskrüpteerimine CHACHA20 koos POLY1305 hashiga saavutab isegi 130 megabitti sekundis! Miks on aga VPN-tunneli kiirus nii madal? Kõik on seotud konteksti vahetamisega kasutaja- ja tuumaruumi vahel: OpenVPN krüpteerib liiklust ja suhtleb välismaailmaga kasutaja kontekstis, samas kui tuumakontekstis toimub marsruutimine ise. Käitissüsteem peab pidevalt vahetama kontekste, et edastada või vastu võtta pakette, ja see protsess ei ole kiire. See probleem on omane kõigile VPN-rakendustele, mis töötavad TUN/TAP draiverite kaudu, ja ei saa öelda, et madala kiirusprobleemi põhjustab OpenVPN-i halb optimeerimine (kuigi seal on muidugi kohti, mida tasuks ümber teha). Ükski kasutajaruumi VPN-kliendist ei saavuta isegi ühe gigabitti ilma krüpteerimiseta minu sülearvutis, rääkimata madala protsessoriga süsteemidest.
Orange Pi One
Xunlongi ettevõtte Orange Pi One on hetkel parim jõudlus/hind suhe. 9,99 dollari eest* saad sa korraliku neljatuumalise ARM Cortex-A7 protsessori, mis töötab stabiilselt 1008 MHz-l, ja on selgelt tootlikum kui naabrid Raspberry Pi Zero ja Next Thing C.H.I.P. sama hinnaklassi. Sellega head asjad lõppevad. Xunlong ei pööra oma plaatide tarkvarale üldse tähelepanu ning kui One turule toodi, ei olnud neil isegi plaadi konfigureerimise faili. Allwinner — SoC tootja — ei ole samuti oma toote toetusele eriti pühendunud. Neid huvitab ainult minimaalne töökindlus Android 4.4.4 operatsioonisüsteemis, mistõttu peame kasutama 3.4 versiooni tuuma Androidi plaastritega. Õnneks on entusiastid, kes koostavad distributsioone, parandavad tuuma, kirjutavad koodi plaaditoe jaoks mainline tuumas, ehk sisuliselt teevad tootja töö ära, et see valeasi töötaks vastuvõetavalt. Minu eesmärkide saavutamiseks valisin distributsiooni Armbian, mis uuendatakse sageli ja mugavalt (uued tuumad installitakse otse paketihalduri kaudu, mitte failide kopeerimisega spetsiaalsesse osasse, nagu Allwinneri puhul tavaliselt juhtub), ning see toetab ka enamikku perifeeriast, erinevalt teistest.
Ruuter
Kuna vältida ruuteri nõrga protsessori ülekoormamist krüpteerimisega ja kiirendada meie VPN-ühendust, saame selle ülesande üle kanda jõulisemasse Orange Pi protsessorisse, ühendades selle ruuteriga mingil viisil. Tulevad meelde ühendused kas Etherneti või USB kaudu – mõlemad standardid on mõlemal seadmel toetatud, kuid ei soovi olemasolevaid porte hõivata. Õnneks on lahendus olemas.
USB-hubi kiip GL850G, mida kasutatakse ruuteris, toetab 4 USB-porti, millest kaks ei ole keevitatud. Pole selge, miks tootja neid ei keevitanud, arvan, et selle eesmärk on vältida, et kasutajad saaksid ühendusse panna korraga 4 kõrge voolu tarbimisega seadet (näiteks kõvakettad), kuna ruuteri standardne toiteallikas ei ole selle koormuse jaoks üles ehitatud. Igatahes, see töötab meie kasuks.

Veel ühe USB-pordi saamiseks on piisav, kui keevitada kaks juhet 8(D-) ja 9(D+) või 11(D-) ja 12(D+) pinni.

Kuid ei piisa lihtsalt kahe USB-seadme ühendamisest ja lootmisest, et kõik töötab iseenesest, nagu Etherneti puhul. Esiteks peame panema ühe neist tööle USB kliendi režiimis, mitte USB hostina; teiseks peab meil olema selge, kuidas seadmed üksteist tuvastavad. On palju draivereid nn USB Gadgets jaoks (nime saanud Linuxi tuumapesa järgi), mis võimaldavad simuleerida erinevaid USB-seadmeid: Etherneti adapterit, helikaarti, klaviatuuri ja hiirt, mälupulka, kaamerat, konsooli kaudu serial porti. Kuna meie seade hakkab suhtlema võrguga, sobib meile kõige paremini Etherneti adapteri simuleerimine.
Ethernet-over-USB standardeid on kolm:
- Remote NDIS (RNDIS). Microsofti vananenud standard, mida kasutati peamiselt Windows XP ajal.
- Ethernet Control Model (ECM). Lihtne standard, mis kapseldab Etherneti kaadreid USB-pakettidesse. Suurepärane juhtmetega modemite jaoks, millel on USB-ühendus, kus on mugav edastada kaadreid töötlemata kujul, kuid oma lihtsuse ja USB-bussi piirangute tõttu ei tööta see väga kiiresti.
- Ethernet Emulation Model (EEM). Nutikam protokoll, mis arvestab USB piiranguid ja optimeerib mitme raamatu kogumise üheks, tõstes seeläbi läbilaskevõimet.
- Network Control Model (NCM). Viimane protokoll. Omab EEM-i eeliseid ja optimeerib omakorda bussi toimimist veelgi.
Käivitamiseks peab võtma arvesse mõningaid raskusi nende protokollide tööle panemisel meie plaadil. Kuna Allwinneri jaoks on olulised ainult Androidi tuuma osad, töötab korralikult ainult Android Gadget — see kood, mis rakendab ühendust adb-ga, seadme eksportimise protokolli MTP kaudu ja mälukaardi emuleerimise Android-seadmetes. Isegi Android Gadget toetab RNDIS protokolli, kuid Allwinneri tuumas on see katki. Kui proovite kompileerida tuuma mõne muu USB Gadgetiga, ei ilmu seade lihtsalt süsteemi, ükskõik mida te ka ei teeks.
Probleemi lahendamiseks tuleks tegelikult leida USB-kontrolleri initsialiseerimise koht Androidi arendajate muudetud koodist android.c, kuid on ka ringtee, et vähemalt sundida Etherneti emuleerimist USB kaudu tööle:
--- sun8i/drivers/usb/sunxi_usb/udc/sunxi_udc.c 2016-04-16 15:01:40.427088792 +0300
+++ sun8i/drivers/usb/sunxi_usb/udc/sunxi_udc.c 2016-04-16 15:01:45.339088792 +0300
@@ -57,7 +57,7 @@
static sunxi_udc_io_t g_sunxi_udc_io;
static u32 usb_connect = 0;
static u32 is_controller_alive = 0;
-static u8 is_udc_enable = 0; /* is udc enable by gadget? */
+static u8 is_udc_enable = 1; /* is udc enable by gadget? */
#ifdef CONFIG_USB_SUNXI_USB0_OTG
static struct platform_device *g_udc_pdev = NULL;See patch forcefully enables USB client mode, allowing the use of standard USB Gadgets from Linux.
Now, you need to rebuild the kernel with this patch and the required gadget. I chose EEM, as it proved to be more efficient than NCM based on test results.
The Armbian team provides for all supported boards in the distribution. You just need to download it, place our patch in userpatches/kernel/sun8i-default/otg.patch, edit compile.sh and choose the required gadget:

The kernel will be compiled into a deb package, which can easily be installed on the board via dpkg.
All that remains is to connect the board via USB and configure our new network adapter to receive an address via DHCP. For this, you need to add something like the following to /etc/network/interfaces:
auto usb0
iface usb0 inet dhcp
hwaddress ether c2:46:98:49:3e:9d
pre-up /bin/sh -c 'echo 2 > /sys/bus/platform/devices/sunxi_usb_udc/otg_role'MAC-aadress on parem määrata käsitsi, kuna see on igal seadme taaskäivitamisel juhuslik, mis on ebamugav ja vaevaline.
Ühendame MicroUSB-kaabli OTG-porti ja ühendame toite ruuterist (seda saab anda 2. ja 3. ploki pinni, mitte ainult toitepistikusse).
Jäänud on ruuteri seadistamine. Piisab, kui installida EEM-draiveriga paket ja lisada meie uus võrgune USB-seade kohaliku firewall-tsooni sillasse:
opkg install kmod-usb-net-cdc-eem
Kogu liikluse suunamiseks VPN-tunneli on vaja kas lisada SNAT-reegel ip-aadressile plaadi poolel ruuteris või määrata aadressi väravaks plaadi aadress dnsmasq kaudu. Viimane tehakse järgmist rida lisades /etc/dnsmasq.conf:
dhcp-option = tag:lan, option:router, 192.168.1.100kus 192.168.1.100 — teie plaadi IP-aadress. Ärge unustage kirjutada ruuteri aadressi plaadi võrguseadetesse!
Plaadi kontaktide eraldamiseks ruuteri kontaktidest kasutati melamiini käsna. Tulemus näeb välja umbes selline:

Kokkuvõte
USB kaudu töötav võrk on üllatavalt kiire: 100-120 Mb/s, ootasin vähem. OpenVPN edastab umbes 70 Mb/s krüpteeritud liiklust, mis pole ka eriti palju, aga minu vajaduste jaoks piisab. Marsruuteri kate ei sulgu tihedalt, jääb väike vahe. Esteetidel on võimalik eemaldada Ethernet ja USB Host-pesa trükkplaadilt, mis võimaldab kaanel täielikult sulguda ja jääb veel ruumi.
Või võiks sellise asjaga mitte tegeleda ja osta .
Allikas: habr.com
