Wir beschleunigen OpenVPN auf dem Router OpenWrt. Alternativversion ohne Lötkolben und Hardware-Extremismus

Wir beschleunigen OpenVPN auf dem Router OpenWrt. Alternativversion ohne Lötkolben und Hardware-Extremismus

Hallo zusammen, ich habe neulich einen alten Artikel darüber gelesen, wie man OpenVPN auf einem Router beschleunigen kann, indem man die Verschlüsselung auf eine separate Hardware verlagert, die im Inneren des Routers verlötet wird. Ich habe einen ähnlichen Fall wie der Autor — TP-Link WDR3500 mit 128 Megabyte RAM und einem schwachen Prozessor, der die Tunnelverschlüsselung einfach nicht hinbekommt. Allerdings wollte ich auf keinen Fall mit einem Lötkolben am Router arbeiten. Unter dem Cut finden Sie meine Erfahrungen bei der Auslagerung von OpenVPN auf eine separate Hardware mit einem Backup im Router für den Notfall.

Aufgabe

Wir haben einen TP-Link WDR3500 Router und einen Orange Pi Zero H2. Wir möchten, dass der Orange Pi die Tunnelverschlüsselung im normalen Betrieb übernimmt, während im Falle eines Problems die Verarbeitung VPN zurück zum Router wechselt. Alle Firewall-Einstellungen am Router sollten wie gewohnt funktionieren. Insgesamt sollte die Hinzufügung der zusätzlichen Hardware für alle transparent und unauffällig verlaufen. OpenVPN funktioniert über TCP, der TAP-Adapter im Bridge-Modus (server-bridge).

Lösung

Anstelle einer USB-Verbindung habe ich mich entschieden, einen Port des Routers zu nutzen und alle Subnetze, in denen sich der VPN-Bridge befindet, über diesen auf den Orange Pi zu führen. Das bedeutet, dass die Hardware physisch in den gleichen Netzwerken hängt wie die VPN-Server am Router. Danach richten wir genau die gleichen Server auf dem Orange Pi ein, und am Router konfigurieren wir einen Proxy, der alle eingehenden Verbindungen an den externen Server weiterleitet, und falls der Orange Pi ausfällt oder nicht verfügbar ist, dann an den internen Fallback-Server. Ich habe HAProxy genommen.

Es ergibt sich Folgendes:

  1. Ein Client trifft ein
  2. Wenn der externe Server nicht verfügbar ist — wie zuvor, geht die Verbindung an den internen Server
  3. Wenn verfügbar — akzeptiert der Orange Pi den Client
  4. Der VPN auf dem Orange Pi entschlüsselt die Pakete und gibt sie zurück an den Router
  5. Der Router leitet sie irgendwohin

Beispielimplementation

Angenommen, wir haben zwei Netzwerke am Router — main(1) und guest(2), für jedes von ihnen gibt es einen OpenVPN-Server für externe Verbindungen.

Netzwerkkonfiguration

Wir müssen beide Netzwerke über einen Port führen, daher erstellen wir 2 VLANs.

Am Router erstellen wir im Abschnitt Network/Switch VLANs (zum Beispiel 1 und 2) und aktivieren sie im Tagging-Modus am gewünschten Port und fügen die neu erstellten eth0.1 und eth0.2 zu den entsprechenden Netzwerken hinzu (zum Beispiel werden sie in die bridge eingefügt).

Am Orange Pi erstellen wir zwei VLAN-Schnittstellen (ich habe Archlinux ARM + netctl):

/etc/netctl/vlan-main

Description='Main VLAN auf eth0'
Interface=vlan-main
Connection=vlan
BindsToInterfaces=eth0
VLANID=1
IP=no

/etc/netctl/vlan-guest

Description='Guest VLAN auf eth0'
Interface=vlan-guest
Connection=vlan
BindsToInterfaces=eth0
VLANID=2
IP=no

Und sofort erstellen wir zwei Brücken für sie:

/etc/netctl/br-main

Description="Hauptbrückenverbindung"
Interface=br-main
Connection=bridge
BindsToInterfaces=(vlan-main)
IP=dhcp

/etc/netctl/br-guest

Description="Gastbrückenverbindung"
Interface=br-guest
Connection=bridge
BindsToInterfaces=(vlan-guest)
IP=dhcp

Wir aktivieren den Autostart für alle 4 Profile (netctl enable). Nach einem Neustart wird das Orange Pi in zwei erforderlichen Netzwerken eingerichtet sein. Die Adressen der Interfaces auf dem Orange Pi konfigurieren wir in den statischen Leases im Router.

ip addr show

4: vlan-main@eth0:  mtu 1500 qdisc noqueue master br-main state UP group default qlen 1000
    link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::42:f0ff:fef8:23c8/64 scope link 
       valid_lft forever preferred_lft forever

5: vlan-guest@eth0:  mtu 1500 qdisc noqueue master br-guest state UP group default qlen 1000
    link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::42:f0ff:fef8:23c8/64 scope link 
       valid_lft forever preferred_lft forever

6: br-main:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:c7:0f:89:71:6e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.3/24 brd 192.168.1.255 scope global dynamic noprefixroute br-main
       valid_lft 29379sec preferred_lft 21439sec
    inet6 fe80::50c7:fff:fe89:716e/64 scope link 
       valid_lft forever preferred_lft forever

7: br-guest:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ee:ea:19:31:34:32 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.3/24 brd 192.168.2.255 scope global br-guest
       valid_lft forever preferred_lft forever
    inet6 fe80::ecea:19ff:fe31:3432/64 scope link 
       valid_lft forever preferred_lft forever

VPN-Konfiguration

Als nächstes kopieren wir die Einstellungen für OpenVPN und die Keys vom Router. Die Einstellungen können in der Regel in /tmp/etc/openvpn*.conf

Standardmäßig hält openvpn, das im TAP-Modus und server-bridge läuft, sein Interface inaktiv. Damit alles funktioniert, muss ein Skript hinzugefügt werden, das beim Aktivieren der Verbindung ausgeführt wird.

/etc/openvpn/main.conf

dev vpn-main
dev-type tap

client-to-client
persist-key
persist-tun
ca /etc/openvpn/main/ca.crt
cert /etc/openvpn/main/main.crt
cipher AES-256-CBC
comp-lzo yes
dh /etc/openvpn/main/dh2048.pem
ifconfig-pool-persist /etc/openvpn/ipp_main.txt
keepalive 10 60
key /etc/openvpn/main/main.key
port 443
proto tcp
push "redirect-gateway"
push "dhcp-option DNS 192.168.1.1"
server-bridge 192.168.1.3 255.255.255.0 192.168.1.200 192.168.1.229
status /tmp/openvpn.main.status
verb 3

setenv profile_name main
script-security 2
up /etc/openvpn/vpn-up.sh

/etc/openvpn/vpn-up.sh

#!/bin/sh

ifconfig vpn-${profile_name} up
brctl addif br-${profile_name} vpn-${profile_name}

Infolgedessen wird, sobald eine Verbindung hergestellt wird, das Interface vpn-main zu br-main hinzugefügt. Für das Gastnetzwerk erfolgt dies analog bis auf den Namen des Interfaces und die Adresse in server-bridge.

Routing von Anfragen von außen und Proxying

In diesem Schritt kann das Orange Pi bereits Verbindungen annehmen und Clients in die benötigten Netzwerke leiten. Es bleibt nur noch, das Proxying eingehender Verbindungen am Router zu konfigurieren.

Wir verschieben die VPN-Server des Routers auf andere Ports, installieren HAProxy auf dem Router und konfigurieren:

/etc/haproxy.cfg

global
        maxconn 256
        uid 0
        gid 0
        daemon

defaults
        retries 1
        contimeout 1000
        option splice-auto

listen guest_vpn
        bind :444
        mode tcp
        server 0-orange 192.168.2.3:444 check
        server 1-local  127.0.0.1:4444 check backup

listen main_vpn
        bind :443
        mode tcp
        server 0-orange 192.168.1.3:443 check
        server 1-local  127.0.0.1:4443 check backup

Genießen

Wenn alles nach Plan läuft, werden die Kunden auf Orange Pi umsteigen und der Prozessor des Routers wird nicht mehr überhitzen, während die VPN-Geschwindigkeit spürbar steigt. Dabei bleiben alle Netzwerkrichtlinien, die im Router festgelegt sind, gültig. Im Falle eines Ausfalls des Orange Pi wird er ausfallen und HAProxy wird die Kunden auf lokale Server umleiten.

Vielen Dank für Ihre Aufmerksamkeit, Wünsche und Korrekturen sind willkommen.

Quelle: habr.com

60GB SSD 8Gb DDR4