Beschleunigen Sie OpenVPN auf einem Openwrt-Router. Alternativversion ohne Lötkolben und Hardware-Extremismus

Beschleunigen Sie OpenVPN auf einem Openwrt-Router. Alternativversion ohne Lötkolben und Hardware-Extremismus

Hallo zusammen, ich habe kürzlich gelesen alter Artikel darüber, wie Sie OpenVPN auf einem Router beschleunigen können, indem Sie die Verschlüsselung auf eine separate Hardware übertragen, die im Router selbst verlötet ist. Ich habe einen ähnlichen Fall wie der Autor – TP-Link WDR3500 mit 128 Megabyte RAM und einem schlechten Prozessor, der mit der Tunnelverschlüsselung völlig überfordert ist. Allerdings wollte ich auf keinen Fall mit einem Lötkolben in die Oberfräse eindringen. Nachfolgend finden Sie meine Erfahrungen mit der Verlagerung von OpenVPN auf eine separate Hardware mit Backup auf dem Router für den Fall eines Unfalls.

Aufgabe

Es gibt einen TP-Link WDR3500-Router und einen Orange Pi Zero H2. Wir möchten, dass der Orange Pi die Tunnel wie gewohnt verschlüsselt, und wenn ihm etwas passiert, kehrt die VPN-Verarbeitung zum Router zurück. Alle Firewall-Einstellungen am Router sollten wie zuvor funktionieren. Und generell sollte das Hinzufügen zusätzlicher Hardware für jeden transparent und unmerklich sein. OpenVPN funktioniert über TCP, der TAP-Adapter befindet sich im Bridge-Modus (Server-Bridge).

Lösung

Anstatt eine Verbindung über USB herzustellen, habe ich mich entschieden, einen Port des Routers zu verwenden und alle Subnetze, die über eine VPN-Brücke verfügen, mit dem Orange Pi zu verbinden. Es stellt sich heraus, dass die Hardware physisch in denselben Netzwerken hängt wie der VPN-Server auf dem Router. Danach installieren wir genau die gleichen Server auf dem Orange Pi und richten auf dem Router eine Art Proxy ein, der alle eingehenden Verbindungen an den externen Server sendet, und wenn der Orange Pi tot oder nicht verfügbar ist, dann an den interner Fallback-Server. Ich habe HAProxy genommen.

Es stellt sich so heraus:

  1. Ein Kunde kommt
  2. Ist der externe Server wie bisher nicht erreichbar, erfolgt die Verbindung zum internen Server
  3. Sofern verfügbar, wird der Client von Orange Pi akzeptiert
  4. VPN auf Orange Pi entschlüsselt Pakete und spuckt sie zurück in den Router
  5. Der Router leitet sie irgendwohin

Implementierungsbeispiel

Nehmen wir also an, wir haben zwei Netzwerke auf dem Router – main(1) und Guest(2), für jedes von ihnen gibt es einen OpenVPN-Server für die Verbindung nach außen.

Netzwerkkonfiguration

Wir müssen beide Netzwerke über einen Port routen, also erstellen wir zwei VLANs.

Erstellen Sie auf dem Router im Abschnitt „Netzwerk/Switch“ VLANs (z. B. 1 und 2) und aktivieren Sie sie im getaggten Modus am gewünschten Port. Fügen Sie die neu erstellten eth0.1 und eth0.2 zu den entsprechenden Netzwerken hinzu (z. B. fügen Sie sie zur Brücke hinzu).

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

/etc/netctl/vlan-main

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

/etc/netctl/vlan-guest

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

Und wir schaffen gleich zwei Brücken für sie:

/etc/netctl/br-main

Description="Main Bridge connection"
Interface=br-main
Connection=bridge
BindsToInterfaces=(vlan-main)
IP=dhcp

/etc/netctl/br-guest

Description="Guest Bridge connection"
Interface=br-guest
Connection=bridge
BindsToInterfaces=(vlan-guest)
IP=dhcp

Aktivieren Sie den Autostart für alle 4 Profile (netctl enable). Nach einem Neustart bleibt der Orange Pi nun in den beiden erforderlichen Netzwerken hängen. Wir konfigurieren die Schnittstellenadressen auf dem Orange Pi in Static Leases auf dem Router.

IP-Adresse anzeigen

4: vlan-main@eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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

Einrichten eines VPN

Als nächstes kopieren wir die Einstellungen für OpenVPN und Schlüssel vom Router. Einstellungen finden Sie normalerweise in /tmp/etc/openvpn*.conf

Standardmäßig lässt OpenVPN im TAP-Modus und Server-Bridge seine Schnittstelle inaktiv. Damit alles funktioniert, müssen Sie ein Skript hinzufügen, das ausgeführt wird, wenn die Verbindung aktiviert 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}

Sobald die Verbindung hergestellt ist, wird daher die VPN-Main-Schnittstelle zu br-main hinzugefügt. Für das Gast-Grid gilt das Gleiche, bis hin zum Schnittstellennamen und der Adresse in Server-Bridge.

Anfragen extern weiterleiten und per Proxy weiterleiten

Zu diesem Zeitpunkt ist Orange Pi bereits in der Lage, Verbindungen anzunehmen und Clients mit den erforderlichen Netzwerken zu verbinden. Es bleibt nur noch, das Proxying eingehender Verbindungen auf dem Router zu konfigurieren.

Wir übertragen 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, wechseln die Kunden auf Orange Pi, der Prozessor des Routers erwärmt sich nicht mehr und die VPN-Geschwindigkeit erhöht sich deutlich. Gleichzeitig bleiben alle Netzwerkregeln, die auf dem Router registriert sind, relevant. Bei einem Unfall auf dem Orange Pi fällt dieser ab und HAProxy überträgt Clients auf lokale Server.

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

Source: habr.com

Kommentar hinzufügen