
Some of us do not use the internet without a VPN for various reasons: some need a dedicated IP, and it is easier and cheaper to buy a VPS with two IPs than to purchase an address from a provider, some want access to all websites, not just those allowed in Russia, others need IPv6, but their provider does not offer it…
Most often, a VPN connection is established on the device being used at that moment, which is quite reasonable if you only have one computer and one phone, and you seldom use them simultaneously. However, if there are many devices in your home network, or if there are some that cannot have a VPN configured, it would be more convenient to set up the tunnel directly on your home router, so you don't have to worry about configuring each device separately.
If you have ever installed OpenVPN on your router, you were probably unpleasantly surprised by its speed. The SoCs of even budget routers can easily handle gigabit traffic thanks to offloading routing and NAT functions to a separate chip designed solely for this task, while the main processors of such routers are quite weak, as they have virtually no load. Such a compromise allows for high router speed and significantly lowers the price of the final device — routers with powerful processors cost several times more and are positioned not only as internet distribution boxes but also as NAS, torrent downloaders, and home multimedia systems.
My router, TP-Link TL-WDR4300, cannot be called new — the model was released in mid-2012 and has a 560 MHz MIPS32 74Kc architecture processor, which is only capable of handling 20-23 Mbps of encrypted traffic through OpenVPN, which is quite low by today's home internet speed standards.
How can we increase the speed of the encrypted tunnel? My router is quite functional, supports 3×3 MIMO, and overall performs well; I wouldn't want to replace it.
Da det nu er almindeligt at lave 10-megabyte internet-sider, skrive desktop-applikationer i node.js og pakke dem i en 100-megabyte fil, samt at øge computerkapaciteten i stedet for at optimere, vil vi gøre noget skræmmende — flytte VPN-forbindelsen til den kraftfulde enbriks 'computer' Orange Pi One, som vi vil installere i routerens kabinet, uden at optage eksisterende netværks- og USB-porte, alt for $9.99*!
* + forsendelse, + skatter, + til øl, + MicroSD.
OpenVPN
Man kan ikke kalde routerens processor helt svag — den kan kryptere og hashere data med AES-128-CBC-SHA1 algoritmen med en hastighed på 50 Mb/s, hvilket er betydeligt hurtigere end hvordan OpenVPN fungerer, og den moderne strømme-kryptering CHACHA20 med POLY1305 hash når endda 130 megabit i sekundet! Hvorfor er hastigheden på VPN-tunnelen så lav? Det hele handler om kontekstskift mellem brugerrummet og kernerummet: OpenVPN krypterer trafikken og kommunikerer med omverdenen i brugerkonteksten, mens selve routingen foregår i kernekonteksten. Operativsystemet må konstant skifte imellem de to, for hver pakke der modtages eller sendes, og denne operation er ikke hurtig. Dette problem er almindeligt for alle VPN-applikationer, der fungerer via TUN/TAP-driveren, og man kan ikke sige, at problemet med lav hastighed skyldes dårlig optimering af OpenVPN (selvom der selvfølgelig er steder, der kunne forbedres). Ingen userspace VPN-klient leverer selv en gigabit med krypteringen slået fra på min bærbare computer, hvad skal man så sige om systemer med svagere processorer.
Orange Pi One
Orange Pi One fra Xunlong er det mest fordelagtige tilbud i forholdet mellem ydeevne og pris lige nu. For $9.99* får du en robust quad-core ARM Cortex-A7 processor, der stabilt arbejder på en frekvens på 1008 MHz, og den er klart mere ydeevnedygtig end naboerne Raspberry Pi Zero og Next Thing C.H.I.P. i denne priskategori. Men her stopper fordelene. Xunlong giver overhovedet ikke opmærksomhed til softwaren til deres boards, og ved lanceringen af One havde de ikke engang givet en konfigurationsfil, for ikke at tale om færdige billeder. Allwinner, producenten af SoC, viser heller ikke meget engagement i at støtte deres produkt. De er kun interesserede i minimal funktionalitet i Android 4.4.4, hvilket betyder, at vi er nødt til at bruge en kerneversion 3.4 med Android-patches. Heldigvis er der entusiaster, der samler distributioner, retter kernen, skriver kode til at støtte boards i mainline-kernen, dvs. de gør faktisk arbejdet for producenten og får det til at fungere acceptabelt. Til mine behov valgte jeg distributionen Armbian, da den ofte og bekvemt opdateres (nye kerner installeres direkte via pakkemanageren, i stedet for at kopiere filer til en speciel sektion, som det normalt er tilfældet med Allwinner), og den understøtter det meste periferiudstyr, i modsætning til de andre.
Router
For at undgå at belaste den svage processor i routeren med kryptering og for at øge vores VPN-forbindelse, kan vi overføre denne opgave til den mere kraftfulde Orange Pi-processor ved at forbinde den til routeren på en eller anden måde. Jeg overvejer at tilslutte den enten via Ethernet eller USB - begge standarder understøttes af begge enheder, men jeg ønskede ikke at optage allerede eksisterende porte. Heldigvis er der en løsning.
USB-hub-chippen GL850G, som bruges i routeren, understøtter 4 USB-porte, hvoraf to ikke er loddet. Det er uklart, hvorfor producenten ikke loddet dem, men jeg formoder, at de ønskede at forhindre brugerne i at tilslutte 4 enheder med højt strømforbrug (f.eks. harddiske), da den medfølgende strømforsyning til routeren ikke er beregnet til en så høj belastning. I hvert fald er det til vores fordel.

For at få endnu en USB-port er det nok at lodde to ledninger til pin 8(D-) og 9(D+) eller 11(D-) og 12(D+).

Det er imidlertid ikke nok bare at tilslutte to USB-enheder og håbe, at alt fungerer af sig selv, som det ville med Ethernet. For det første skal vi have den ene til at fungere i USB Client-tilstand og ikke som USB Host, for det andet skal vi finde ud af, hvordan enhederne vil identificere hinanden. Der findes mange drivere til de såkaldte USB Gadgets (opkaldt efter Linux-kernens underside), som gør det muligt at emulere forskellige typer USB-enheder: netværksadaptere, lydkort, tastaturer og mus, USB-nøgler, kameraer, konsoller via seriel port. Da vores enhed skal arbejde med netværket, vil emuleringen af en Ethernet-adapter være den bedste løsning.
Der findes tre standarder for Ethernet-over-USB:
- Remote NDIS (RNDIS). En forældet standard fra Microsoft, der primært blev brugt i Windows XP-tiderne.
- Ethernet Control Model (ECM). En simpel standard, der kapsler Ethernet-rammer i USB-pakker. Den passer godt til kablede modemmer med USB-forbindelse, hvor det er praktisk at sende rammer uden behandling, men på grund af sin enkelhed og begrænsningerne i USB-bussen fungerer den ikke så hurtigt.
- Ethernet Emulation Model (EEM). En mere intelligent protokol, der tager højde for USB's begrænsninger og optimalt aggregerer flere rammer i én, hvilket dermed øger båndbredden.
- Network Control Model (NCM). Den nyeste protokol. Den har fordelene fra EEM og optimerer endda arbejdet med bussen endnu mere.
For at få nogen af disse protokoller til at fungere på vores kort må vi, som altid, møde nogle vanskeligheder. Da Allwinner kun interesserer sig for Android-delen af kernen, fungerer kun Android Gadget korrekt — den kode, der implementerer forbindelsen til adb, eksporterer enheden via MTP-protokollen og emulerer USB-nøgler på Android-enheder. Selve Android Gadget understøtter også RNDIS-protokollen, men i Allwinner-kernen er den defekt. Hvis du prøver at kompilere kernen med en anden USB Gadget, vises enheden simpelthen ikke i systemet, uanset hvad du gør.
For at løse problemet skal vi korrekt finde stedet for initialisering af USB-controlleren i den modificerede Android Gadget-kode, men der findes også en omgåelse, der får det til at fungere, i det mindste emulering af Ethernet via USB:
--- 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;
/* er udc aktiveret af gadget? */
#ifdef CONFIG_USB_SUNXI_USB0_OTG
static struct platform_device *g_udc_pdev = NULL;Denne patch aktiverer tvangsrygning USB-klienttilstand, hvilket muliggør brug af almindelige USB Gadgets fra Linux.
Nu skal kernen kompileres igen med denne patch og den nødvendige gadget. Jeg valgte EEM, da det viste sig at være mere effektivt end NCM i testene.
Armbian-teamet tilbyder til alle understøttede kort i distributionen. Det er nok at downloade det, lægge vores patch i userpatches/kernel/sun8i-default/otg.patch, redigere lidt i compile.sh og vælge den nødvendige gadget:

Kernen vil blive bygget som en deb-pakke, som er nem at installere på kortet via dpkg.
Det er kun nødvendigt at tilslutte kortet via USB og konfigurere vores nye netværksadapter til at modtage en adresse via DHCP. For dette er det nødvendigt at tilføje cirka følgende i /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 at angive MAC-adressen manuelt, da den vil være tilfældig ved hver genstart af enheden, hvilket er besværligt og ubelejligt.
Tilslut MicroUSB-kablet til OTG-porten, og tilslut strøm fra routeren (den kan tilføres til pin 2 og 3 i stikket, og ikke kun til strømstikket).
Tilbage er det kun at konfigurere routeren. Det er nok at installere pakken med EEM-driveren og tilføje vores nye netværks USB-enhed til broen i den lokale firewall-zone:
opkg install kmod-usb-net-cdc-eem
For at rute al trafik gennem VPN-tunnelen, skal du enten tilføje et SNAT-regel til IP-adressen på kortet fra routerens side, eller uddele kortets adresse som gateway-adresse via dnsmasq. Sidste del gøres ved at tilføje følgende linje i /etc/dnsmasq.conf:
dhcp-option = tag:lan, option:router, 192.168.1.100hvor 192.168.1.100 — IP-adressen på dit kort. Husk at angive routerens adresse i netværksindstillingerne på kortet selv!
For at isolere kontaktpunkterne fra kortet fra kontaktpunkterne på routeren blev der brugt en melamin-svamp. Det blev noget i denne retning:

Konklusion
Netværket fungerer overraskende hurtigt via USB: 100-120 Mb/s, jeg forventede mindre. OpenVPN håndterer omkring 70 Mb/s af den krypterede trafik, hvilket ikke er meget, men det er nok til mine behov. Ruterens låg lukker ikke helt tæt og efterlader en lille spalte. Æstetikere kan lodde Ethernet- og USB Host-forbindelserne af printkortet, hvilket vil gøre det muligt for låget at lukke helt, og der vil endda være plads tilbage.
Eller bedre endnu, lad være med at beskæftige dig med sådan pornografi og køb. .
Kilde: habr.com
