Przyspiesz OpenVPN za $9.99* lub wbuduj Orange Pi One w router

Przyspiesz OpenVPN za $9.99* lub wbuduj Orange Pi One w router

Niektórzy z nas nie korzystają z internetu bez VPN z różnych powodów: niektórzy potrzebują dedykowanego IP, a łatwiej i taniej jest kupić VPS z dwoma IP, niż zamawiać adres u dostawcy, inni chcą mieć dostęp do wszystkich stron internetowych, a nie tylko do tych dozwolonych na terytorium Rosji, a jeszcze inni potrzebują IPv6, a ich dostawca go nie zapewnia…
Najczęściej połączenie VPN konfiguruje się na samym urządzeniu, które jest używane w danym momencie, co jest całkowicie uzasadnione, jeśli masz tylko jeden komputer i jeden telefon, i rzadko korzystasz z nich jednocześnie. Jeśli jednak w twojej sieci domowej jest wiele urządzeń, lub na przykład są takie, na których nie można skonfigurować VPN, byłoby wygodniej stworzyć tunel bezpośrednio na domowym routerze, aby nie martwić się o konfigurację każdego urządzenia z osobna.

Jeśli kiedykolwiek instalowałeś OpenVPN na swoim routerze, prawdopodobnie byłeś niemiło zaskoczony prędkością jego działania. SoC nawet tanich routerów bez większych problemów przesyłają blisko gigabitowy ruch, dzięki wydzieleniu funkcji routingu i NAT na oddzielny chip przeznaczony wyłącznie do realizacji tego zadania, podczas gdy główne procesory takich routerów są dość słabe, ponieważ praktycznie nie są obciążane. Taki kompromis pozwala osiągnąć wysoką szybkość działania routera i znacznie obniżyć cenę gotowego urządzenia — routery z potężnymi procesorami są kilka razy droższe i są pozycjonowane nie tylko jako pudełko do udostępniania internetu, ale także jako NAS, torrent downloader i domowy system multimedialny.

Mój router, TP-Link TL-WDR4300, nie można nazwać nowym — model pojawił się w połowie 2012 roku i ma procesor 560 MHz architektury MIPS32 74Kc, którego moc wystarcza jedynie na 20-23 Mb/s szyfrowanego ruchu przez OpenVPN, co w porównaniu do prędkości nowoczesnego internetu domowego jest dość mało.
Jak możemy zwiększyć prędkość szyfrowanego tunelu? Mój router jest dość funkcjonalny, obsługuje 3×3 MIMO i w ogóle działa dobrze, nie chciałbym go zmieniać.
W dzisiejszych czasach, gdy tworzy się 10-megabajtowe strony internetowe, pisze aplikacje desktopowe w node.js i pakuje je w 100-megabajtowy plik, a moc obliczeniowa jest zwiększana zamiast optymalizacji, zrobimy coś strasznego — przeniesiemy połączenie VPN na wydajny jednoplatformowy „komputer” Orange Pi One, który zainstalujemy w obudowie routera, nie zajmując istniejących portów sieciowych i USB, za jedyne 9,99 $*!
* + wysyłka, + podatki, + na piwo, + MicroSD.

OpenVPN

Nie można nazwać procesora routera zupełnie słabym — potrafi szyfrować i haszować dane algorytmem AES-128-CBC-SHA1 z prędkością 50 Mb/s, co jest wyraźnie szybsze niż działanie OpenVPN, a nowoczesny strumieniowy szyfr CHACHA20 z haszem POLY1305 osiąga nawet 130 megabitów na sekundę! Dlaczego więc prędkość tunelu VPN jest taka niska? Wszystko sprowadza się do przełączania kontekstu między przestrzenią użytkownika a przestrzenią jądra: OpenVPN szyfruje ruch i komunikuje się ze światem zewnętrznym w kontekście użytkownika, a sama routowanie zachodzi w kontekście jądra. System operacyjny musi ciągle przełączać się to tam, to z powrotem, przy każdym odebranym lub wysłanym pakiecie, a ta operacja nie jest szybka. Problem ten dotyczy wszystkich aplikacji VPN działających przez sterownik TUN/TAP i nie można powiedzieć, że niska prędkość jest wynikiem złej optymalizacji OpenVPN (chociaż, oczywiście, są miejsca, które powinny zostać poprawione). Żaden klient VPN działający w przestrzeni użytkownika nie osiąga nawet gigabita przy wyłączonym szyfrowaniu na moim laptopie, co już mówi samo za siebie w przypadku systemów ze słabym procesorem.

Orange Pi One

Jednopłytkowy komputer Orange Pi One od firmy Xunlong to obecnie najlepsza oferta pod względem stosunku wydajności do ceny. Za 9,99 $* otrzymujesz solidny czterordzeniowy procesor ARM Cortex-A7, stabilnie działający z częstotliwością 1008 MHz, który jest zdecydowanie wydajniejszy od konkurencyjnych modeli Raspberry Pi Zero i Next Thing C.H.I.P. w tej samej kategorii cenowej. Na tym kończą się jednak zalety. Firma Xunlong nie poświęca zero uwagi oprogramowaniu dla swoich płyt, a w momencie wprowadzenia One na rynek nie udostępniła nawet pliku konfiguracyjnego płyty, nie wspominając już o gotowych obrazach systemów. Allwinner — producent SoC — również nie szczególnie dba o wsparcie swojego produktu. Interesuje ich jedynie minimalna funkcjonalność w systemie Android 4.4.4, co oznacza, że musimy używać jądra w wersji 3.4 z łatkami Android. Na szczęście są entuzjaści, którzy zbierają dystrybucje, poprawiają jądro, piszą kod do wsparcia płyt w głównym jądrze, tj. właściwie wykonują pracę za producenta, zmuszając tę tanią rzecz do sensownego działania. Dla swoich celów wybrałem dystrybucję Armbian, która jest często i wygodnie aktualizowana (nowe jądra instalują się bezpośrednio przez menedżera pakietów, a nie przez kopiowanie plików na specjalną partycję, jak to zwykle bywa w przypadku Allwinner) i wspiera większość peryferiów, w przeciwieństwie do innych.

Router

Aby nie obciążać słabego procesora routera szyfrowaniem i przyspieszyć nasze połączenie VPN, możemy przenieść to zadanie na bardziej wydajny procesor Orange Pi, łącząc go z routerem w jakiś sposób. Przywodzi na myśl połączenie przez Ethernet lub USB — oba te standardy są wspierane przez oba urządzenia, ale nie chciałem zajmować już istniejących portów. Na szczęście jest inne wyjście.

Układ USB hub GL850G, który jest używany w routerze, obsługuje cztery porty USB, z których dwa nie są wlutowane. Nie jest jasne, dlaczego producent nie zdecydował się ich wlutować; przypuszczam, że chodzi o to, by nie umożliwić użytkownikom podłączenia od razu czterech urządzeń o wysokim poborze prądu (np. dysków twardych), ponieważ standardowy zasilacz routera nie jest przystosowany do takiego obciążenia. W każdym razie, to nam sprzyja.
Przyspiesz OpenVPN za $9.99* lub wbuduj Orange Pi One w router
Aby uzyskać jeszcze jeden port USB, wystarczy przylutować dwa przewody do pinów 8(D-) i 9(D+) lub 11(D-) i 12(D+).

Przyspiesz OpenVPN za $9.99* lub wbuduj Orange Pi One w router

Jednak samo podłączenie dwóch urządzeń USB i nadzieja, że wszystko samo się uruchomi, jak w przypadku Ethernetu, nie wystarczy. Po pierwsze, musimy spowodować, by jedno z nich działało w trybie USB Client, a nie USB Host; po drugie, musimy określić, jak urządzenia będą się wzajemnie identyfikować. Istnieje wiele sterowników tzw. USB Gadgets (nazwa pochodzi od podsystemu jądra Linuxa), które pozwalają emulować różne typy urządzeń USB: adapter sieciowy, kartę dźwiękową, klawiaturę i mysz, pamięć USB, aparat fotograficzny, konsolę przez port szeregowy. Ponieważ nasze urządzenie ma działać w sieci, najlepiej nada się emulacja adaptera Ethernet.

Istnieją trzy standardy Ethernet-over-USB:

  • Remote NDIS (RNDIS). Przestarzały standard od Microsoftu, używany głównie w czasach Windows XP.
  • Ethernet Control Model (ECM). Prosty standard, który enkapsuluje ramki Ethernet w pakietach USB. Doskonale nadaje się do przewodowych modemów z połączeniem USB, gdzie wygodne jest przesyłanie ramek bez przetwarzania, ale z powodu swojej prostoty i ograniczeń szyny USB nie działa zbyt szybko.
  • Ethernet Emulation Model (EEM). Bardziej inteligentny protokół, który uwzględnia ograniczenia USB i optymalnie agreguje kilka ramek w jedną, zwiększając tym samym przepustowość.
  • Network Control Model (NCM). Najnowszy protokół. Ma zalety EEM i jeszcze bardziej optymalizuje pracę z szyną.

Aby uruchomić dowolny z tych protokołów na naszej płycie, jak zawsze, napotkamy pewne trudności. Ze względu na to, że Allwinner interesują tylko części jądra związane z Androidem, poprawnie działa tylko Android Gadget — ten kod, który realizuje połączenie z adb, eksport urządzenia przez protokół MTP i emulację pamięci USB na urządzeniach z Androidem. Sam Android Gadget obsługuje również protokół RNDIS, ale w jądrze Allwinner jest on zepsuty. Jeśli spróbujesz skompilować jądro z innym USB Gadget, urządzenie po prostu nie pojawi się w systemie, cokolwiek byś nie zrobił.
Aby rozwiązać problem, w zasadzie należy znaleźć miejsce inicjalizacji kontrolera USB w zmodyfikowanym kodzie Android Gadgeta android.c, ale istnieje także obejście, które pozwala uruchomić przynajmniej emulację Ethernet przez 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;   /* 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;

Ta łatka wymusza tryb klienta USB, co pozwala na korzystanie z typowych gadżetów USB w systemie Linux.
Teraz należy ponownie skompilować jądro z tą łatką i wymaganym gadżetem. Wybrałem EEM, ponieważ w testach okazał się bardziej wydajny niż NCM.
Zespół Armbian oferuje bardzo prosty i wygodny system budowania dla wszystkich obsługiwanych płyt w dystrybucji. Wystarczy go pobrać, umieścić naszą łatkę w userpatches/kernel/sun8i-default/otg.patch, minimalnie edytować compile.sh i wybrać potrzebny gadżet:

Przyspiesz OpenVPN za $9.99* lub wbuduj Orange Pi One w router

Jądro zostanie zbudowane w pakiecie deb, który łatwo zainstalować na płycie za pomocą dpkg.
Pozostaje tylko podłączyć płytę przez USB i skonfigurować nasz nowy adapter sieciowy do uzyskania adresu przez DHCP. W tym celu należy dodać coś takiego 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'

Lepiej jest ustawić adres MAC ręcznie, ponieważ będzie on losowy przy każdym uruchomieniu urządzenia, co jest niewygodne i uciążliwe.
Podłączamy kabel MicroUSB do gniazda OTG, podłączamy zasilanie z routera (można je podać na 2 i 3 piny złączki, a nie tylko na gniazdo zasilania).

Teraz pozostaje skonfigurować router. Wystarczy zainstalować pakiet z sterownikiem EEM i dodać nasze nowe urządzenie USB do mostka lokalnej strefy firewalla:

opkg install kmod-usb-net-cdc-eem

Przyspiesz OpenVPN za $9.99* lub wbuduj Orange Pi One w router
Aby przekierować cały ruch do tunelu VPN, trzeba dodać regułę SNAT na adres IP płyty po stronie routera, lub przypisać adres płyty jako adres bramy za pomocą dnsmasq. To ostatnie wykonuje się przez dodanie następującego wiersza do /etc/dnsmasq.conf:

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

gdzie 192.168.1.100 — adres IP twojej płyty. Nie zapomnij wpisać adresu routera w ustawieniach sieci na samej płycie!

Do izolacji styków płyty od styków routera użyto gąbki melaminowej. Oto jak to wygląda:
Przyspiesz OpenVPN za $9.99* lub wbuduj Orange Pi One w router

Podsumowanie

Sieć działa przez USB zaskakująco szybko: 100-120 Mb/s, spodziewałem się mniej. OpenVPN przepuszcza około 70 Mb/s szyfrowanego ruchu, co również nie jest dużo, ale wystarcza dla moich potrzeb. Obudowa routera nie zamyka się szczelnie, pozostawiając małą szczelinę. Esteci mogą wy lutować złącza Ethernet i USB Host z płyty, co pozwoli na całkowite zamknięcie pokrywy, a nawet pozostawi trochę miejsca.
A lepiej nie zajmować się taką pornografią i kupić Turris Omnia.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster