Få fart på OpenVPN for $9.99* eller integrer Orange Pi One i ruteren din

Få fart på OpenVPN for $9.99* eller integrer Orange Pi One i ruteren din

Noen av oss bruker ikke Internett uten VPN av en eller annen grunn: noen trenger en dedikert IP, og det er enklere og billigere å kjøpe en VPS med to IP-er enn å kjøpe en adresse fra en leverandør, noen vil ha tilgang til alle nettsider , og ikke bare de som er tillatt på den russiske føderasjonens territorium, andre trenger IPv6, men leverandøren gir det ikke...
Oftest etableres en VPN-tilkobling på selve enheten som brukes på et bestemt tidspunkt, noe som er fornuftig hvis du bare har én datamaskin og én telefon og sjelden bruker dem samtidig. Hvis det er mange enheter i hjemmenettverket ditt, eller det for eksempel er noen som VPN ikke kan konfigureres på, ville det være mer praktisk å lage en tunnel direkte på hjemmeruteren for ikke å tenke på å sette opp hver enhet separat .

Hvis du noen gang har installert OpenVPN på ruteren din, har du sannsynligvis blitt ubehagelig overrasket over hvor raskt det fungerer. SoC-ene til til og med billige rutere passerer gjennom omtrent en gigabit-trafikk uten problemer, på grunn av overføringen av ruting- og NAT-funksjoner til en egen brikke designet eksklusivt for denne oppgaven, og hovedprosessorene til slike rutere er ganske svake, fordi Det er praktisk talt ingen belastning på dem. Dette kompromisset lar deg oppnå høy hastighet på ruteren og redusere prisen på den ferdige enheten betydelig - rutere med kraftige prosessorer koster flere ganger mer, og er plassert ikke bare som en boks for distribusjon av Internett, men også som en NAS, torrent nedlaster og multimediasystem til hjemmet.

Ruteren min, TP-Link TL-WDR4300, kan ikke kalles ny - modellen dukket opp i midten av 2012, og har en 560 MHz MIPS32 74Kc arkitekturprosessor, hvis kraft bare er nok for 20-23 Mb/s kryptert trafikk via OpenVPN, som er etter standarder Hastigheten til moderne hjemmeinternett er ganske lav.
Hvordan kan vi øke hastigheten på en kryptert tunnel? Ruteren min er ganske funksjonell, støtter 3x3 MIMO, og fungerer generelt bra, jeg vil ikke endre den.
Siden det nå er vanlig å lage 10-megabyte Internett-sider, skrive skrivebordsapplikasjoner i node.js og pakke dem inn i en 100-megabyte fil, øke datakraften i stedet for optimalisering, vil vi gjøre noe forferdelig - vi vil overføre VPN-tilkoblingen til en produktiv enkeltkorts "datamaskin" Orange Pi One, som vi vil installere i ruterdekselet uten å ta opp eksisterende nettverk og USB-porter, for kun $9.99*!
* + levering, + avgifter, + for øl, + MicroSD.

OpenVPN

Ruterens prosessor kan ikke kalles helt svak - den er i stand til å kryptere og hashe data ved hjelp av AES-128-CBC-SHA1-algoritmen med en hastighet på 50 Mb/s, noe som er merkbart raskere enn hvordan OpenVPN fungerer, og den moderne CHACHA20-strømmen chiffer med en POLY1305-hash når til og med 130 megabit per sekund! Hvorfor er hastigheten på VPN-tunnelen så lav? Alt handler om kontekstveksling mellom brukerplass og kjerneplass: OpenVPN krypterer trafikk og kommuniserer med omverdenen i brukerkonteksten, og selve rutingen skjer i kjernekonteksten. Operativsystemet må hele tiden bytte frem og tilbake for hver pakke som mottas eller sendes, og denne operasjonen er treg. Dette problemet er iboende i alle VPN-applikasjoner som kjører gjennom en TUN/TAP-driver, og det kan ikke sies at problemet med lav hastighet er forårsaket av dårlig OpenVPN-optimalisering (selv om det selvfølgelig er steder som må omarbeides). Ikke en eneste VPN-klient for brukerrom gir enda en gigabit med kryptering deaktivert på den bærbare datamaskinen min, enn si systemer med en svak prosessor.

Oransje PiOne

Single-board Orange Pi One fra Xunlong er det beste tilbudet når det gjelder ytelse/prisforhold for øyeblikket. For $9.99* får du en solid firekjerners ARM Cortex-A7-prosessor som kjører (stabil) på 1008 MHz, og overgår klart pris-naboene Raspberry Pi Zero og Next Thing CHIP. Det er her fordelene slutter. Xunlong-selskapet betaler nøyaktig null oppmerksomhet til programvaren til brettene sine, og på det tidspunktet One ble lansert for salg, ga det ikke engang en brettkonfigurasjonsfil, for ikke å snakke om ferdige bilder. Allwinner, en SoC-produsent, er heller ikke spesielt følsom for å støtte produktet sitt. De er kun interessert i minimal ytelse i Android 4.4.4 OS, noe som betyr at vi er tvunget til å bruke 3.4-kjernen med Android-patcher. Heldigvis finnes det entusiaster som setter sammen distribusjoner, redigerer kjernen, skriver kode til støttetavler i hovedlinjekjernen, dvs. de gjør faktisk jobben for produsenten, noe som gjør at denne dritten fungerer akseptabelt. For mine formål valgte jeg Armbian-distribusjonen; den oppdateres ofte og praktisk (nye kjerner installeres direkte gjennom pakkebehandlingen, og ikke ved å kopiere filer til en spesiell partisjon, som vanligvis er tilfellet med Allwinner), og den støtter de fleste periferiutstyr, i motsetning til de andre.

router

For ikke å laste den svake prosessoren til ruteren med kryptering og øke hastigheten på VPN-tilkoblingen vår, kan vi flytte denne oppgaven til skuldrene til en kraftigere Orange Pi-prosessor ved å koble den til ruteren på en eller annen måte. Å koble til enten via Ethernet eller USB kommer til tankene - begge disse standardene støttes av begge enhetene, men jeg ønsket ikke å ta opp eksisterende porter. Heldigvis finnes det en vei ut.

GL850G USB-hubbrikken, som brukes i ruteren, støtter 4 USB-porter, hvorav to ikke er kablet. Det er uklart hvorfor produsenten ikke loddet dem ut, antar jeg, for å hindre brukere i å koble til 4 enheter med høyt strømforbruk (for eksempel harddisker) samtidig. Standard strømforsyningen til ruteren er ikke designet for en slik belastning. Dette er i alle fall til vår fordel.
Få fart på OpenVPN for $9.99* eller integrer Orange Pi One i ruteren din
For å få en annen USB-port trenger du bare å lodde to ledninger til pinnene 8(D-) og 9(D+) eller 11(D-) og 12(D+).

Få fart på OpenVPN for $9.99* eller integrer Orange Pi One i ruteren din

Det er imidlertid ikke nok å bare koble til to USB-enheter og håpe at alt vil fungere av seg selv, slik det ville gjort med Ethernet. For det første må vi få en av dem til å fungere i USB Client-modus, og ikke USB Host, og for det andre må vi bestemme hvordan enhetene vil oppdage hverandre. Det er mange drivere for de såkalte USB-gadgetene (oppkalt etter Linux-kjernens undersystem), som lar deg emulere ulike typer USB-enheter: nettverksadapter, lydkort, tastatur og mus, flash-stasjon, kamera, konsoll via en seriell havn. Siden enheten vår vil fungere med nettverket, er emulering av en Ethernet-adapter best for oss.

Det er tre Ethernet-over-USB-standarder:

  • Ekstern NDIS (RNDIS). En utdatert standard fra Microsoft, brukt hovedsakelig under Windows XP.
  • Ethernet-kontrollmodell (ECM). En enkel standard som kapsler inn Ethernet-rammer i USB-pakker. Flott for kablede modemer med USB-tilkobling, hvor det er praktisk å overføre rammer uten prosessering, men på grunn av sin enkelhet og begrensninger på USB-bussen er det ikke veldig raskt.
  • Ethernet-emuleringsmodell (EEM). En smartere protokoll som tar hensyn til USB-begrensninger og optimalt samler flere rammer til én, og dermed øker gjennomstrømningen.
  • Nettverkskontrollmodell (NCM). Den nyeste protokollen. Har fordelene med EEM og optimaliserer bussopplevelsen ytterligere.

For å få noen av disse protokollene til å fungere i styret vårt, som alltid, vil vi måtte støte på noen vanskeligheter. På grunn av det faktum at Allwinner kun er interessert i Android-delene av kjernen, fungerer bare Android Gadget normalt - koden som implementerer kommunikasjon med adb, eksporterer enheten via MTP-protokollen og emulerer en flash-stasjon på Android-enheter. Android Gadget selv støtter også RNDIS-protokollen, men den er ødelagt i Allwinner-kjernen. Hvis du prøver å kompilere kjernen med en hvilken som helst annen USB Gadget, vil enheten ganske enkelt ikke vises på systemet, uansett hva du gjør.
For å løse problemet, på en vennskapelig måte, må du finne stedet der USB-kontrolleren er initialisert i koden til Android-dingsen android.c modifisert av utviklerne, men det er også en løsning for å gjøre minst Ethernet-emulering over USB-arbeid:

--- 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;

Denne oppdateringen tvinger USB-klientmodus, slik at du kan bruke vanlige USB-gadgets fra Linux.
Nå bør du gjenoppbygge kjernen med denne oppdateringen og den nødvendige gadgeten. Jeg valgte EEM fordi... Ifølge testresultater viste det seg å være mer produktivt enn NCM.
Armbian-teamet sørger for veldig enkelt og praktisk monteringssystem for alle støttede styrer i distribusjonen. Bare last den ned, legg inn patchen vår userpatches/kernel/sun8i-default/otg.patch, rediger litt compile.sh og velg ønsket gadget:

Få fart på OpenVPN for $9.99* eller integrer Orange Pi One i ruteren din

Kjernen vil bli kompilert til en deb-pakke, som ikke vil være vanskelig å installere på brettet via dpkg.
Alt som gjenstår er å koble til kortet via USB og konfigurere vår nye nettverksadapter til å motta en adresse via DHCP. For å gjøre dette må du legge til noe som det følgende /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'

Det er bedre å angi MAC-adressen manuelt, fordi... det vil være tilfeldig hver gang enheten startes på nytt, noe som er upraktisk og plagsomt.
Vi kobler MicroUSB-kabelen til OTG-kontakten, kobler til strøm fra ruteren (den kan leveres til pinnene 2 og 3 på kammen, og ikke bare til strømkontakten).

Alt som gjenstår er å konfigurere ruteren. Det er nok å installere pakken med EEM-driveren og legge til vår nye USB-nettverksenhet til broen til den lokale brannmursonen:

opkg install kmod-usb-net-cdc-eem

Få fart på OpenVPN for $9.99* eller integrer Orange Pi One i ruteren din
For å rute all trafikk til VPN-tunnelen, må du enten legge til en SNAT-regel til kortets IP-adresse på rutersiden, eller distribuere kortets adresse som en gateway-adresse via dnsmasq. Sistnevnte gjøres ved å legge følgende linje til /etc/dnsmasq.conf:

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

der 192.168.1.100 — IP-adressen til styret ditt. Ikke glem å skrive inn ruteradressen i nettverksinnstillingene på selve brettet!

En melaminsvamp ble brukt for å isolere kortkontaktene fra ruterkontaktene. Det ble noe slikt:
Få fart på OpenVPN for $9.99* eller integrer Orange Pi One i ruteren din

Konklusjon

Nettverket via USB fungerer overraskende raskt: 100-120 Mb/s, forventet mindre. OpenVPN passerer gjennom omtrent 70 Mb/s kryptert trafikk, noe som heller ikke er veldig mye, men nok for mine behov. Freslokket lukker ikke tett, og etterlater et lite gap. Aesthetes kan fjerne Ethernet- og USB Host-kontaktene fra brettet, noe som lar lokket lukkes helt og fortsatt ha litt plass igjen.
Det er bedre å ikke engasjere seg i slik pornografi og kjøpe Turris Omnia.

Kilde: www.habr.com

Legg til en kommentar