Wir beschleunigen OpenVPN für $9,99* oder integrieren einen Orange Pi One in den Router

Wir beschleunigen OpenVPN für $9,99* oder integrieren einen Orange Pi One in den Router

Einige von uns nutzen aus verschiedenen Gründen kein Internet ohne VPN: Einige benötigen eine dedizierte IP, und es ist einfacher und günstiger, einen VPS mit zwei IPs zu kaufen, als eine Adresse vom Anbieter zu erwerben, andere wollen Zugang zu allen Websites haben, nicht nur zu den in Russland erlaubten, dritte benötigen IPv6, das der Anbieter nicht bereitstellt…
In der Regel wird die VPN-Verbindung auf dem Gerät eingerichtet, das gerade verwendet wird, was sinnvoll ist, wenn Sie nur einen Computer und ein Telefon haben und diese nur selten gleichzeitig nutzen. Wenn jedoch in Ihrem Heimnetzwerk viele Geräte vorhanden sind oder zum Beispiel solche, bei denen VPN nicht eingerichtet werden kann, wäre es bequemer, den Tunnel direkt auf dem heimischen Router einzurichten, um sich nicht um die Konfiguration jedes einzelnen Geräts kümmern zu müssen.

Wenn Sie jemals OpenVPN auf Ihrem Router installiert haben, waren Sie wahrscheinlich unangenehm überrascht von der Geschwindigkeit seiner Leistung. Die SoCs selbst günstiger Router bewältigen problemlos nahezu gigabit großen Datenverkehr, indem die Funktionen der Routing- und NAT-Process auf einen separaten Chip ausgelagert werden, der ausschließlich für diese Aufgabe vorgesehen ist. Die Hauptprozessoren solcher Router sind ziemlich schwach, da sie kaum belastet werden. Ein solcher Kompromiss ermöglicht es, eine hohe Geschwindigkeit des Routers zu erreichen und den Preis des fertigen Geräts erheblich zu senken – Router mit leistungsstarken Prozessoren sind um ein Vielfaches teurer und positionieren sich nicht nur als Internetverteilungskästen, sondern auch als NAS, Torrent-Downloader und Heim-Multimedia-System.

Mein Router, TP-Link TL-WDR4300, kann nicht als neu bezeichnet werden – das Modell erschien Mitte 2012 und verfügt über einen 560 MHz MIPS32 74Kc Prozessor, dessen Leistung gerade ausreicht, um 20-23 Mbit/s verschlüsselten Datenverkehr über OpenVPN zu bewältigen, was im Vergleich zur Geschwindigkeit des modernen Heim-Internets ziemlich gering ist.
Wie können wir die Geschwindigkeit des verschlüsselten Tunnels erhöhen? Mein Router ist ziemlich funktional, unterstützt 3×3 MIMO und funktioniert insgesamt gut, ich würde ihn ungern wechseln.
Da heutzutage 10-Megabyte-Internetseiten erstellt werden, Desktop-Anwendungen mit node.js entwickelt und in 100-Megabyte-Dateien verpackt werden, die Rechenleistung statt der Optimierung gesteigert wird, werden wir etwas Unerhörtes tun – wir werden die VPN-Verbindung auf den leistungsfähigen Einplatinencomputer "Orange Pi One" verlagern, den wir im Router-Gehäuse installieren, ohne die vorhandenen Netzwerk- und USB-Ports zu belegen, und das alles für 9,99 $*!
* + Versand, + Steuern, + für Bier, + MicroSD.

OpenVPN

Man kann den Prozessor des Routers nicht als völlig schwach bezeichnen – er ist in der Lage, Daten mit dem AES-128-CBC-SHA1-Algorithmus mit einer Geschwindigkeit von 50 Mb/s zu verschlüsseln und zu hashieren, was deutlich schneller ist als die Funktionsweise von OpenVPN, und der moderne Stream-Cipher CHACHA20 mit dem Hash POLY1305 erreicht sogar 130 Megabit pro Sekunde! Warum ist die Geschwindigkeit des VPN-Tunnels so gering? Das liegt am Kontextwechsel zwischen dem Benutzerspeicher und dem Kernelbereich: OpenVPN verschlüsselt den Datenverkehr und kommuniziert mit der Außenwelt im Benutzerspeicher, während die eigentliche Routing im Kernelbereich stattfindet. Das Betriebssystem muss ständig zwischen beiden hin und her wechseln, bei jedem empfangenen oder gesendeten Paket, und diese Operation ist nicht schnell. Dieses Problem tritt bei allen VPN-Anwendungen auf, die über den TUN/TAP-Treiber arbeiten, und man kann nicht sagen, dass die niedrigen Geschwindigkeiten auf eine schlechte Optimierung von OpenVPN zurückzuführen sind (obwohl es dort sicherlich Bereiche gibt, die überarbeitet werden sollten). Kein Userspace-VPN-Client erzielt auch nur annähernd eine Gigabit mit deaktivierter Verschlüsselung auf meinem Laptop, ganz zu schweigen von Systemen mit schwächeren Prozessoren.

Orange Pi One

Der Einplatinencomputer Orange Pi One von Xunlong ist derzeit das beste Angebot im Verhältnis von Leistung zu Preis. Für 9,99 $* erhalten Sie einen soliden Quad-Core-Prozessor ARM Cortex-A7, der mit stabilen 1008 MHz läuft, und deutlich leistungsstärker ist als der Raspberry Pi Zero und Next Thing C.H.I.P. in seiner Preisklasse. Damit enden die Vorteile jedoch auch schon. Xunlong widmet der Software seiner Boards genau null Aufmerksamkeit, und zum Zeitpunkt der Markteinführung des One wurde nicht einmal eine Konfigurationsdatei bereitgestellt, geschweige denn fertige Images. Auch der SoC-Hersteller Allwinner zeigt wenig Engagement für die Unterstützung seines Produkts. Sie sind nur an einer minimalen Funktionalität mit Android 4.4.4 interessiert, weshalb wir gezwungen sind, einen Kernel der Version 3.4 mit Android-Patches zu verwenden. Glücklicherweise gibt es Enthusiasten, die Distributionen sammeln, den Kernel anpassen und Code zur Unterstützung der Boards im Mainline-Kernel schreiben, d.h. sie erledigen tatsächlich die Arbeit des Herstellers und bringen das Gerät dazu, akzeptabel zu funktionieren. Für meine Zwecke habe ich die Distribution Armbian gewählt, die häufig und bequem aktualisiert wird (neue Kerne werden direkt über den Paketmanager installiert und nicht durch Kopieren von Dateien auf einen speziellen Bereich, wie es normalerweise bei Allwinner der Fall ist), und sie unterstützt die meisten Peripheriegeräte im Gegensatz zu anderen.

Router

Um den schwachen Router-Prozessor nicht mit der Verschlüsselung zu belasten und unsere VPN-Verbindung zu beschleunigen, können wir diese Aufgabe auf den leistungsstärkeren Prozessor Orange Pi übertragen, indem wir ihn auf irgendeine Weise mit dem Router verbinden. Mir fällt ein, dass wir entweder über Ethernet oder über USB anschließen können — beide Standards werden von beiden Geräten unterstützt, aber ich wollte die bereits vorhandenen Ports nicht besetzen. Glücklicherweise gibt es eine Lösung.

Der verwendete USB-Hub-Chip GL850G im Router unterstützt den Betrieb von 4 USB-Ports, von denen zwei nicht lötbar sind. Unklar ist, warum der Hersteller sie nicht lötbar gemacht hat. Ich vermute, dass er es verhindern wollte, dass Benutzer sofort 4 Geräte mit hohem Stromverbrauch (z.B. Festplatten) anschließen, da das Standard-Netzteil des Routers nicht für eine solche Last ausgelegt ist. In jedem Fall kommt uns das zugute.
Wir beschleunigen OpenVPN für $9,99* oder integrieren einen Orange Pi One in den Router
Um einen weiteren USB-Port zu erhalten, genügt es, zwei Drähte an die Pins 8(D-) und 9(D+) oder 11(D-) und 12(D+) zu löten.

Wir beschleunigen OpenVPN für $9,99* oder integrieren einen Orange Pi One in den Router

Es reicht jedoch nicht aus, einfach zwei USB-Geräte anzuschließen und zu hoffen, dass alles von selbst funktioniert, wie es bei Ethernet der Fall wäre. Erstens müssen wir eines von ihnen im USB-Client-Modus und nicht im USB-Host-Modus betreiben, zweitens müssen wir herausfinden, wie die Geräte einander erkennen. Es gibt viele Treiber für die sogenannten USB Gadgets (benannt nach dem Subsystem des Linux-Kernels), die es ermöglichen, verschiedene Typen von USB-Geräten zu emulieren: Netzwerkadapter, Soundkarten, Tastaturen und Mäuse, Flash-Laufwerke, Kameras, Konsolen über serielle Ports. Da unser Gerät mit einem Netzwerk arbeiten wird, ist die Emulation eines Ethernet-Adapters am besten geeignet.

Es gibt drei Standards für Ethernet-over-USB:

  • Remote NDIS (RNDIS). Ein veralteter Standard von Microsoft, der hauptsächlich zu Zeiten von Windows XP verwendet wurde.
  • Ethernet Control Model (ECM). Ein einfacher Standard, der Ethernet-Frames in USB-Paketen kapselt. Er eignet sich hervorragend für kabelgebundene Modems mit USB-Anschluss, wo es bequem ist, Frames ohne Verarbeitung zu übertragen, aber aufgrund seiner Einfachheit und der USB-Bus-Beschränkungen nicht sehr schnell arbeitet.
  • Ethernet Emulation Model (EEM). Ein intelligenterer Protokoll, das die Beschränkungen von USB berücksichtigt und mehrere Frames optimal in einem aggregiert, wodurch die Bandbreite erhöht wird.
  • Network Control Model (NCM). Das neueste Protokoll. Es bietet die Vorteile von EEM und optimiert die Leistung mit dem Bus noch weiter.

Um eines dieser Protokolle auf unserer Platine zum Laufen zu bringen, müssen wir, wie immer, mit einigen Schwierigkeiten rechnen. Da sich Allwinner nur für die Android-Teile des Kernels interessiert, funktioniert nur der Android Gadget zufriedenstellend — der Code, der die Verbindung mit adb, den Gerätexport über das MTP-Protokoll und die Emulation eines Flash-Laufwerks auf Android-Geräten implementiert. Der Android Gadget unterstützt auch das RNDIS-Protokoll, aber im Allwinner-Kernel ist es defekt. Wenn Sie versuchen, den Kernel mit einem anderen USB Gadget zu kompilieren, wird das Gerät einfach nicht im System erkannt, egal was Sie tun.
Um das Problem zu lösen, ist es idealerweise notwendig, den Initialisierungsort des USB-Controllers im modifizierten Code des Android-Gadgets android.c zu finden, aber es gibt auch eine Umgehungslösung, um zumindest die Ethernet-Emulation über USB wieder zum Laufen zu bringen:

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

Dieser Patch erzwingt den USB-Client-Modus, wodurch gängige USB-Gadgets aus Linux verwendet werden können.
Nun muss der Kernel mit diesem Patch und dem erforderlichen Gadget neu kompiliert werden. Ich habe EEM gewählt, da es sich in den Tests als leistungsfähiger als NCM erwiesen hat.
Das Team von Armbian bietet ein sehr einfaches und benutzerfreundliches Build-System für alle unterstützten Platinen im Distribuierung. Es genügt, es herunterzuladen, unseren Patch in userpatches/kernel/sun8i-default/otg.patch, ein wenig die compile.sh zu bearbeiten und das benötigte Gadget auszuwählen:

Wir beschleunigen OpenVPN für $9,99* oder integrieren einen Orange Pi One in den Router

Der Kernel wird als deb-Paket gebaut, das sich ganz einfach über dpkg.
auf die Platine installieren lässt. Es bleibt nur noch, die Platine über USB anzuschließen und unseren neuen Netzwerkadapter so zu konfigurieren, dass er eine Adresse über DHCP erhält. Dazu sollte etwa Folgendes in /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'

Die MAC-Adresse sollte besser manuell festgelegt werden, da sie bei jedem Neustart des Geräts zufällig ist, was unpraktisch und mühsam ist.
Schließen Sie das MicroUSB-Kabel an den OTG-Anschluss an und versorgen Sie es mit Strom vom Router (dies kann an Pin 2 und 3 des Steckerbords erfolgen, nicht nur am Stromanschluss).

Es bleibt nur noch, den Router zu konfigurieren. Es genügt, das Paket mit dem EEM-Treiber zu installieren und unser neues Netzwerk-USB-Gerät in die Brücke der lokalen Firewall-Zone hinzuzufügen:

opkg install kmod-usb-net-cdc-eem

Wir beschleunigen OpenVPN für $9,99* oder integrieren einen Orange Pi One in den Router
Um den gesamten Datenverkehr in den VPN-Tunnel zu leiten, müssen entweder eine SNAT-Regel für die IP-Adresse der Platine auf der Routerseite hinzugefügt werden oder die IP-Adresse der Platine über dnsmasq als Gateway-Adresse bereitgestellt werden. Letzteres wird erreicht, indem folgende Zeile zu /etc/dnsmasq.conf:

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

wo 192.168.1.100 — die IP-Adresse Ihrer Platine. Vergessen Sie nicht, die Routeradresse in den Netzwerkeinstellungen auf der Platine selbst anzugeben!

Zur Isolierung der Kontakte der Platine von den Kontakten des Routers wurde ein Melamin-Schwamm verwendet. Es sieht etwa so aus:
Wir beschleunigen OpenVPN für $9,99* oder integrieren einen Orange Pi One in den Router

Fazit

Die Verbindung über USB funktioniert überraschend schnell: 100-120 MB/s, ich hatte weniger erwartet. OpenVPN lässt etwa 70 MB/s verschlüsselten Datenverkehr durch, was auch nicht besonders viel ist, aber für meine Bedürfnisse reicht es aus. Der Deckel des Routers schließt nicht ganz, sodass ein kleiner Spalt bleibt. Ästheten können die Ethernet- und USB-Host-Anschlüsse von der Platine auslöten, was es ermöglicht, den Deckel vollständig zu schließen, und es bleibt sogar Platz übrig.
Oder man sollte sich nicht mit so einer Pornografie beschäftigen und stattdessen kaufen Turris Omnia.

Quelle: habr.com

60GB SSD 8Gb DDR4