
Někteří z nás nepoužívají internet bez VPN z různých důvodů: někomu je potřeba dedikované IP, a je jednodušší a levnější koupit VPS se dvěma IP než kupovat adresu u poskytovatele, někdo chce mít přístup ke všem webovým stránkám, a ne jen těm povoleným na území ČR, třetí potřebují IPv6, ale poskytovatel ho nenabízí...
Nejčastěji je VPN připojení nastavováno přímo na zařízení, které je aktuálně používáno, což je plně odůvodněné, pokud máte pouze jeden počítač a jeden telefon a používáte je zřídka současně. Pokud však ve vaší domácí síti existuje mnoho zařízení, nebo například existují taková, na kterých VPN nastavit nelze, bylo by pohodlnější zřídit tunel přímo na domácím routeru, abyste se nemuseli zabývat konfigurací každého zařízení jednotlivě.
Pokud jste někdy instalovali OpenVPN na svůj router, pravděpodobně jste byli nepříjemně překvapeni rychlostí jeho práce. SoC i levných routerů bez problémů zvládají téměř gigabitový provoz, díky přesunutí funkcí směrování a NAT na samostatný čip určený výhradně k této úloze, zatímco hlavní procesory těchto routerů jsou poměrně slabé, protože na ně téměř žádné zatížení není. Takový kompromis umožňuje dosáhnout vysoké rychlosti routeru a významně snížit cenu hotového zařízení — routery s výkonnými procesory stojí několikrát více a jsou již pozicovány nejen jako krabičky pro poskytování internetu, ale také jako NAS, torrentový klient a domácí multimediální systém.
Můj router, TP-Link TL-WDR4300, nelze nazvat novým — model se objevil v polovině roku 2012 a disponuje 560 MHz procesorem architektury MIPS32 74Kc, jehož výkon stačí pouze na 20-23 Mb/s šifrovaného provozu přes OpenVPN, což je vzhledem k rychlosti moderního domácího internetu celkem málo.
Jak bychom mohli zvýšit rychlost šifrovaného tunelu? Můj router je docela funkční, podporuje 3×3 MIMO a vůbec dobře funguje, nechtěl bych ho měnit.
Vzhledem k tomu, že je dnes běžné vytvářet 10megabajtové webové stránky, psát desktopové aplikace v node.js a balit je do 100megabajtového souboru, zvyšovat výkon místo optimalizace, uděláme něco strašného — přesuneme VPN připojení na výkonný jednodeskový "počítač" Orange Pi One, který nainstalujeme do těla routeru, aniž bychom obsadili stávající síťové a USB porty, a to vše za 9,99 $*!
* + doprava, + daně, + na pivo, + MicroSD.
OpenVPN
Nelze říci, že procesor routeru je úplně slabý — je schopen šifrovat a hashovat data pomocí algoritmu AES-128-CBC-SHA1 rychlostí 50 Mb/s, což je znatelně rychlejší než fungování OpenVPN, a moderní streamové šifrování CHACHA20 s hashovací funkcí POLY1305 dosahuje dokonce 130 megabitů za sekundu! Proč však není rychlost VPN tunelu tak vysoká? Všechno je to o přepínání kontextu mezi uživatelským prostorem a jádrem: OpenVPN šifruje provoz a komunikuje se zevními systémy v uživatelském kontextu, zatímco směrování se děje v kontextu jádra. Operační systém se musí neustále přepínat tam a zpět pro každý přijatý nebo odeslaný paket, a tato operace není rychlá. Tento problém se týká všech VPN aplikací, které pracují prostřednictvím TUN/TAP ovladače, a nelze říci, že problém nízké rychlosti je způsoben špatnou optimalizací OpenVPN (i když samozřejmě existují místa, která by bylo možné přepracovat). Žádný uživatelský VPN klient nedokáže na mém notebooku vyprodukovat ani gigabit při vypnutém šifrování, a co teprve systémy s slabším procesorem.
Orange Pi One
Jednodeskový Orange Pi One od společnosti Xunlong představuje nejlepší nabídku poměru výkon/cena v současnosti. Za 9,99 $* získáte kvalitní čtyřjádrový procesor ARM Cortex-A7, (stabilně) pracující na frekvenci 1008 MHz, a je zřetelně výkonnější než jeho konkurenti Raspberry Pi Zero a Next Thing C.H.I.P. ve stejné cenové kategorii. Tímto však klady končí. Společnost Xunlong věnuje softwaru svých desek zcela nulovou pozornost, a v době uvedení modelu One do prodeje neposkytla ani konfigurační soubor desky, nemluvě o hotových image. Výrobce SoC Allwinner také nepřistupuje k podpoře svého produktu zvlášť citlivě. Zajímá je pouze minimální funkčnost v operačním systému Android 4.4.4, což znamená, že jsme nuceni používat jádro verze 3.4 s Android patchem. Naštěstí existují nadšenci, kteří shromažďují distribuce, upravují jádro a píší kód pro podporu desek v mainline jádře, tedy fakticky odvádějí práci za výrobce a nutí tento šunt, aby funkčně pracoval. Pro své potřeby jsem zvolil distribuci Armbian, která se často a pohodlně aktualizuje (nová jádra se instalují přímo přes správce balíčků, nikoli kopírováním souborů do speciální části, jak je běžné u Allwinner) a podporuje většinu periferií, na rozdíl od ostatních.
Router
Abychom nezatěžovali slabý procesor routeru šifrováním a urychlili naše VPN připojení, můžeme tuto úlohu přenést na výkonnější procesor Orange Pi a připojit jej k routeru nějakým způsobem. Napadá mě připojení buď přes Ethernet nebo USB — oba standardy jsou podporovány oběma zařízeními, ale nechtěl jsem zabírat již existující porty. Naštěstí existuje řešení.
Čip USB hubu GL850G, který se používá v routeru, podporuje čtyři USB porty, z nichž dva nejsou pájené. Není jasné, proč je výrobce nepoužil, domnívám se, že aby zabránili uživatelům připojit najednou čtyři zařízení s vysokou spotřebou proudu (například disků), protože standardní napájecí adaptér routeru není na takovou zátěž dimenzován. V každém případě nám to hraje do karet.

Abychom získali další USB port, stačí připojit dva dráty k pinu 8(D-) a 9(D+) nebo 11(D-) a 12(D+).

Není dostatečné jen připojit dvě USB zařízení a čekat, že to samo začne fungovat, jako by tomu bylo v případě Ethernetu. Zaprvé, jedno z nich musíme nastavit do režimu USB klienta, nikoliv USB hostitele, a zadruhé, musíme si vyjasnit, jak si zařízení budou vzájemně rozumět. Existuje mnoho ovladačů takzvaných USB Gadgets (podle názvu subsystému jádra Linuxu), které umožňují emulovat různé typy USB zařízení: síťový adaptér, zvukovou kartu, klávesnici a myš, flash disk, fotoaparát, konzoli přes sériový port. Vzhledem k tomu, že naše zařízení bude pracovat se sítí, nejlépe nám vyhovuje emulace Ethernetového adaptéru.
Existují tři standardy Ethernet-over-USB:
- Remote NDIS (RNDIS). Zastaralý standard od Microsoftu, který byl převážně používán za dob Windows XP.
- Ethernet Control Model (ECM). Jednoduchý standard, který encapsuluje Ethernetové rámce do USB paketů. Skvěle se hodí pro drátové modemy s USB připojením, kde je výhodné přenášet rámce bez zpracování, nicméně kvůli své jednoduchosti a omezením USB sběrnice nepracuje příliš rychle.
- Ethernet Emulation Model (EEM). Chytřejší protokol, který bere v úvahu omezení USB a optimálně agreguje několik rámců do jednoho, čímž zvyšuje propustnost.
- Network Control Model (NCM). Nejnovější protokol. Má výhody EEM a ještě více optimalizuje práci se sběrnicí.
Abychom mohli any z těchto protokolů použít na naší desce, stejně jako vždy budeme čelit určitým obtížím. Protože Allwinner zajímají pouze části jádra týkající se Androidu, správně funguje pouze Android Gadget — ten kód, který realizuje spojení s adb, export zařízení přes protokol MTP a emulaci flash disku na Android zařízeních. Samotný Android Gadget podporuje také protokol RNDIS, ale v jádře Allwinner je rozbitý. Když se pokusíte zkompilovat jádro s jakýmkoliv jiným USB Gadgetem, zařízení se jednoduše už v systému neobjeví, ať děláte cokoliv.
Pro vyřešení problému je třeba najít místo inicializace USB ovladače v modifikovaném kódu Android Gadgetu android.c, ale existuje také obchvat, jak alespoň spustit emulaci Ethernetu přes 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;
#ifdef CONFIG_USB_SUNXI_USB0_OTG
static struct platform_device *g_udc_pdev = NULL;Tato oprava vynucuje režim USB klienta, což umožňuje používat běžné USB gadgety z Linuxu.
Nyní je třeba znovu zkompilovat jádro s touto opravou a potřebným gadgetem. Zvolil jsem EEM, protože podle testů se ukázal jako výkonnější než NCM.
Tým Armbian poskytuje pro všechny podporované desky v distribuci. Stačí si ji stáhnout, umístit náš patch do userpatches/kernel/sun8i-default/otg.patch, mírně upravit compile.sh a vybrat potřebný gadget:

Jádro se zkompiluje do deb balíčku, který není problém nainstalovat na desku prostřednictvím dpkg.
Stačí pouze připojit desku přes USB a nastavit náš nový síťový adaptér pro získání adresy přes DHCP. K tomu je třeba přidat přibližně následující do /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'Je lepší nastavit MAC adresu ručně, protože při každém restartu zařízení bude náhodná, což je nepohodlné a pracné.
Připojujeme MicroUSB kabel k OTG portu, připojujeme napájení z routeru (může být dodáváno na 2 a 3 piny kolíku, a ne pouze na napájecí konektor).
Nyní je třeba nastavit router. Stačí nainstalovat balíček s EEM ovladačem a přidat naše nové síťové USB zařízení do bridže lokální firewall zóny:
opkg install kmod-usb-net-cdc-eem
Aby byl veškerý provoz směrován do VPN tunelu, je třeba buď přidat SNAT pravidlo na IP adresu desky na straně routeru, nebo přidávat IP adresu desky jako adresu brány přes dnsmasq. To se provádí přidáním následujícího řádku do /etc/dnsmasq.conf:
dhcp-option = tag:lan, option:router, 192.168.1.100kde 192.168.1.100 — IP adresa vaší desky. Nezapomeňte nastavit adresu routeru v nastavení sítě na samotné desce!
Pro izolaci kontakty desky od kontaktů routeru byla použita melaminová houbička. Dopadlo to nějak takto:

Závěr
Síť přes USB funguje překvapivě rychle: 100-120 Mb/s, očekával jsem méně. OpenVPN přenáší přibližně 70 Mb/s šifrovaného provozu, což není moc, ale pro mé potřeby to stačí. Kryt routeru se špatně uzavírá, zanechává malou mezeru. Estetici mohou desolderovat Ethernet a USB Host konektory z desky, což umožní krytu se plně uzavřít, a ještě zbyde místo.
Nebo se raději takové obscénnosti vyhněte a kupte si to. .
Zdroj: habr.com
