Kiirendame OpenVPN-i $9.99* vÔi integreerime Orange Pi One'i ruuteri sisse

Kiirendame OpenVPN-i $9.99* vÔi integreerime Orange Pi One'i ruuteri sisse

MĂ”ned meist ei kasuta internetti ilma VPN-ita mitmel pĂ”hjusel: mĂ”nel inimesel on vaja eraldi IP-aadressi, ning lihtsam ja odavam on osta VPS kahe IP-ga, kui osta aadress teenusepakkujalt; mĂ”ned soovivad pÀÀseda juurde kĂ”ikidele veebisaitidele, mitte ainult Venemaal lubatud neile; kolmandatel on vaja IPv6, kuid teenusepakkuja ei paku seda

Enamasti luuakse VPN-ĂŒhendus otse seadmes, mida hetkel kasutatakse, mis on tĂ€itsa mĂ”istlik, kui sul on vaid ĂŒks arvuti ja ĂŒks telefon ning neid harva samal ajal kasutatakse. Kui aga sinu koduvĂ”rgus on mitmeid seadmeid vĂ”i nĂ€iteks on olemas selliseid, kus VPN-i seadistada ei saa, oleks mugavam luua tunnel otse koduses ruuteris, et mitte muretseda iga seadme eraldi seadistamise pĂ€rast.

Kui oled kunagi OpenVPN-i oma ruuterisse seadnud, siis oled tĂ”enĂ€oliselt olnud ebameeldivalt ĂŒllatunud selle töökiirusest. Odavate ruuteri SoC-id saavad probleemideta edastada peaaegu gigabitist liiklust, edastades marsruutimise ja NAT-funktsioonid eraldi kiibile, mis on mĂ”eldud ainult selle ĂŒlesande tĂ€itmiseks, ning nende ruuterite peamised protsessorid on suhteliselt nĂ”rgad, kuna neile ei ole praktikas suuri koormusi. Selline kompromiss vĂ”imaldab saavutada ruuteri kĂ”rget töökiirust ja mĂ€rgatavalt vĂ€hendada valmis seadme hinda — vĂ”imsate protsessoritega ruuterid maksavad mitu korda rohkem ja neid positsioneeritakse mitte ainult interneti edastamiseks, vaid ka NAS-i, torrenti allalaadimise ja kodumaise meedia sĂŒsteemina.

Minu ruuter, TP-Link TL-WDR4300, ei ole just uus — mudel ilmus 2012. aasta keskel ja sellel on 560 MHz MIPS32 74Kc arhitektuuri protsessor, mille vĂ”imsus on piisav vaid 20-23 Mb/s krĂŒpteeritud liikluse edastamiseks OpenVPN-i kaudu, mis tĂ€napĂ€eva koduse interneti kiirusest on ĂŒsna vĂ€he.
Kuidas saaksime suurendada krĂŒpteeritud tunneli kiirus? Minu ruuter on ĂŒsna funktsionaalne, toetab 3×3 MIMO ja töötab ĂŒldiselt hĂ€sti, ei tahaks seda vahetada.
Kuna praegu on kombeks teha 10-megabaidiseid internetilehti, kirjutada töölauarakendusi node.js-is ja pakendada neid 100-megabaidisesse faili, suurendada arvutusvĂ”imet optimeerimise asemel, teeme midagi kohutavat — viime VPN-ĂŒhenduse tootlikule ĂŒhesirgele „arvutile“ Orange Pi One, mille paigaldame ruuteri korpusesse, kasutamata olemasolevaid vĂ”rgu- ja USB-pordi, kĂ”ik vaid $9.99*!
* + saatmine, + maksud, + Ôlle jaoks, + MicroSD.

OpenVPN

Ei saa öelda, et ruuteri protsessor oleks tĂ€iesti nĂ”rk — see suudab ĆĄifreerida ja hajutada andmeid AES-128-CBC-SHA1 algoritmi abil kiirusel 50 Mb/s, mis on mĂ€rgatavalt kiirem kui OpenVPN töötab, ja kaasaegne vooluline ĆĄifrisĂŒsteem CHACHA20 POLY1305 hajutiga arendab lausa 130 megabitit sekundis! Miks on VPN-tunneli kiirus siis nii madal? Asi on konteksti vahetamises kasutaja- ja tuumaruumi vahel: OpenVPN ĆĄifreerib liiklust ja suhtleb vĂ€limailmaga kasutaja kontekstis, samas kui tuumaruumi kontekstis toimub marsruutimine ise. OperatsioonisĂŒsteem peab pidevalt vahetama kontekste iga vastuvĂ”etud vĂ”i edastatud paketi puhul, ja see operatsioon ei ole kiire. See probleem on iseloomulik kĂ”igile VPN-rakendustele, mis töötavad TUN/TAP draiveri kaudu, ja ei saa öelda, et madala kiirus problemaatika tuleneb OpenVPN halvast optimeerimisest (kuigi muidugi on seal kohti, mida vĂ”iks ĂŒle vaadata). Ükski userspace VPN-klient ei tooda isegi gigabitist minu sĂŒlearvutis, kui krĂŒpteerimine on vĂ€lja lĂŒlitatud, rÀÀkimata nĂ”rkade protsessoritega sĂŒsteemidest.

Orange Pi One

Xunlongi Orange Pi One on kĂ”ige soodsam pakkumine toote ja hinna suhe hetkel. $9.99* eest saad hea neljatuumalise ARM Cortex-A7 protsessori, mis töötab stabiilselt 1008 MHz sagedusel ja on selgelt vĂ”imekam kui tema konkurendid Raspberry Pi Zero ja Next Thing C.H.I.P. samas hinnaklassis. Sellele jĂ€rgneb aga probleem. Xunlongi tarkvara tĂ€helepanu on null, ning kui One mĂŒĂŒgile tuli, ei olnud nad isegi seadme konfiguratsioonifaili esitanud, rÀÀkimata valmiskaubanduse piltidest. Allwinner, SoC tootja, ei paku oma toote kohta ka suurt tuge. Neid huvitab vaid minimaalne toimimine Android 4.4.4-s, seega oleme sunnitud kasutama versiooni 3.4 kerest koos Androidi plaastritega. Õnneks on entusiastid, kes koguvad ja toimetavad distributsioone, muudavad kera ning kirjutavad koodi seadmete toeks mainline-kernes, tehes balay töö tootja eest, et see kehvem asi korralikult töötaks. Minu eesmĂ€rkidel valisin distributsiooni Armbian, mis uuendatakse sageli ja mugavalt (uued kerged installitakse otse pakihalduri kaudu, mitte failide kopeerimisega spetsiaalsesse osi, nagu see tavaliselt Allwinneris toimub) ning toetab enamikku perifeeria seadmeid, erinevalt teistest.

Ruuter

Kuna me ei soovi nĂ”rgestada ruuteri protsessorit krĂŒpteerimisega ja kiirendada meie VPN-ĂŒhendust, saame selle ĂŒlesande kanda vĂ”imekamale Orange Pi protsessorile, ĂŒhendades selle ruuteriga kuidagi. Meelde tuleb kas Ethernet vĂ”i USB — mĂ”lemad standardid on seadmetes toetatud, kuid ma ei sooviks kasutada juba olemasolevaid porte. Õnneks on lahendus.

USB-hub GL850G, mida kasutatakse ruuteris, toetab 4 USB-porti, millest kaks pole joodetud. Pole selge, miks tootja ei jootnud neid, eeldan, et nad ei soovinud anda kasutajatele vĂ”imalust ĂŒhendada korraga 4 seadmeid, millel on kĂ”rge voolutarve (nĂ€iteks kĂ”vakettad), kuna ruuteri tavaline toiteplokk ei ole selliseks koormuseks mĂ”eldud. Igatahes on see meile kasuks.
Kiirendame OpenVPN-i $9.99* vÔi integreerime Orange Pi One'i ruuteri sisse
Teise USB-pordi saamiseks piisab, kui jootada kaks juhtme 8(D-) ja 9(D+) vĂ”i 11(D-) ja 12(D+) jala kĂŒlge.

Kiirendame OpenVPN-i $9.99* vÔi integreerime Orange Pi One'i ruuteri sisse

Kuid lihtsalt kaht USB-seadet ĂŒhendada ja loota, et kĂ”ik töötab iseenesest, nagu juhtuks Ethernetiga, ei piisa. Esiteks peame sundima ĂŒhte neist töötama USB kliendi reĆŸiimis, mitte USB hostina; teiseks peame leidma viisi, kuidas seadmed ĂŒksteist tuvastavad. On olemas palju draivereid nn USB Gadgets (nime pĂ”hjal Linuxi tuumasĂŒsteemis), mis vĂ”imaldavad emuleerida erinevaid tĂŒĂŒpe USB-seadmeid: vĂ”rguadapterit, helikaarti, klaviatuuri ja hiirt, USB-mĂ€lupulka, kaamerat, konsooli lĂ€bi seeriaport. Kuna meie seade töötab vĂ”rguga, sobib meile kĂ”ige paremini Ethernet-adapteri emulatsioon.

On olemas kolm Ethernet-over-USB standardit:

  • Remote NDIS (RNDIS). Vananenud standard Microsoftilt, mida kasutati peamiselt Windows XP aegadel.
  • Ethernet Control Model (ECM). Lihtne standard, mis kapseldab Etherneti raame USB-pakettidesse. Sobib suurepĂ€raselt USB-ĂŒhendusega juhtmetele mootoritele, kus raamide edastamine ilma töötlemiseta on mugav, 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 optimaalselt kogub mitu raami ĂŒheks, suurendades seelĂ€bi lĂ€bilaskevĂ”imet.
  • Network Control Model (NCM). Uusim protokoll. Omab EEM-i eeliseid ja optimeerib veelgi bussi tööd.

Kuna igal neist protokollidest meie plaadil tööle saamine, nagu alati, toob kaasas teatavad raskused. Kuna Allwinnerit huvitavad ainult Androidi korpuse osad, töötab normaalselt ainult Android Gadget – see kood, mis rakendab ĂŒhendust adb, seadme eksportimist MTP protokolli kaudu ja USB-mĂ€lupulga emuleerimist Android-seadmetes. Isegi Android Gadget toetab RNDIS protokolli, kuid Allwinneri tuumas on see rikutud. Kui proovite kompileerida tuuma mĂ”ne teise USB Gadgetiga, ei ilmu seade sĂŒsteemi, olenemata sellest, mida teete.
Probleemi lahendamiseks oleks mÔistlik leida USB-kontrolleri initsialiseerimise koht Android-gadget android.c modifitseeritud arendajate koodis, kuid on ka ringtee, et kÀivitada vÀhemalt Etherneti emulatsioon USB kaudu:

--- 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;   
+static u8 is_udc_enable = 1;   
 
 #ifdef CONFIG_USB_SUNXI_USB0_OTG
 static struct platform_device *g_udc_pdev = NULL;

See patch forcedly enables USB client mode, allowing the use of regular USB Gadgets from Linux.
Now, you should rebuild the kernel with this patch and the required gadget. I chose EEM, as it proved to be more efficient than NCM in tests.
The Armbian team provides a very simple and convenient build system for all supported boards in the distribution. Just download it, place our patch in userpatches/kernel/sun8i-default/otg.patch, edit compile.sh and select the necessary gadget:

Kiirendame OpenVPN-i $9.99* vÔi integreerime Orange Pi One'i ruuteri sisse

The kernel will compile into a deb package, which can be easily installed on the board via dpkg.
All that is left is to connect the board via USB and configure our new network adapter to receive an address via DHCP. To do 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'

It's better to set the MAC address manually, as it will be random on each reboot of the device, which is inconvenient and troublesome.
Connect the Micro USB cable to the OTG port, connect the power from the router (it can be applied to pins 2 and 3 of the header, not just to the power jack).

Now, configure the router. Simply install the package with the EEM driver and add our new network USB device to the local firewall zone bridge:

opkg install kmod-usb-net-cdc-eem

Kiirendame OpenVPN-i $9.99* vÔi integreerime Orange Pi One'i ruuteri sisse
To route all traffic into the VPN tunnel, you need either to add a SNAT rule for the board's IP address on the router side or to provide the board's address as the gateway address via dnsmasq. The latter is done by adding the following line to /etc/dnsmasq.conf:

dhcp-option = tag:lan, option:router, 192.168.1.100

kus 192.168.1.100 — the IP address of your board. Don't forget to specify the router's address in the network settings on the board itself!

To isolate the board's contacts from the router's contacts, a melamine sponge was used. It turned out something like this:
Kiirendame OpenVPN-i $9.99* vÔi integreerime Orange Pi One'i ruuteri sisse

KokkuvÔte

USB kaudu töötav vĂ”rk ĂŒllatab kiiruselt: 100-120 Mb/s, ootasime vĂ€hem. OpenVPN edastab umbes 70 Mb/s krĂŒpteeritud liiklust, mis ei ole ka vĂ€ga palju, kuid minu vajaduste jaoks piisab. Ruuteri kaas sulgub halvasti, jĂ€ttes vĂ€ikese vahe. Esteetikud vĂ”ivad emaplaadilt eemaldada Etherneti ja USB Host-pesad, mis vĂ”imaldab kaanel tĂ€ielikult sulguda, ja veel jÀÀb ruumi.
VÔi on parem mitte tegeleda sellise poriga ja osta. Turris Omnia.

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster