
Hallo zusammen, ich habe neulich einen älteren Artikel gelesen Wie man OpenVPN auf einem Router beschleunigt, indem man die Verschlüsselung auf eine separate Hardware verlagert, die innerhalb des Routers fest verlötet ist. Ich habe einen ähnlichen Fall wie der Autor — einen TP-Link WDR3500 mit 128 Megabyte RAM und einem schwachen Prozessor, der mit der Verschlüsselung der Tunnel völlig überfordert ist. Allerdings wollte ich keinesfalls mit einem Lötkolben ins Routerinnere eingreifen. Im Folgenden teile ich meine Erfahrungen, OpenVPN auf eine separate Hardware auszulagern, mit einer Reservierung auf dem Router für den Notfall.
Ziel
Ich habe einen TP-Link WDR3500 Router und ein Orange Pi Zero H2. Wir möchten, dass die Verschlüsselung der Tunnelverbindungen im Normalbetrieb vom Orange Pi übernommen wird, und falls etwas mit ihm passiert, die Verarbeitung VPN wieder auf den Router zurückkehrt. Alle Firewall-Einstellungen auf dem Router sollten wie gewohnt funktionieren. Insgesamt sollte die Hinzufügung der zusätzlichen Hardware für alle transparent und unauffällig sein. OpenVPN läuft über TCP, der TAP-Adapter im Bridge-Modus (server-bridge).
Lösung
Anstelle einer USB-Verbindung habe ich beschlossen, einen Port des Routers zu nutzen und über ihn alle Subnetze, in denen sich der VPN-Bridge befindet, an das Orange Pi anzuschließen. So wird das Gerät physisch in den gleichen Netzwerken sein wie die VPN-Server im Router. Danach richten wir identische Server auf dem Orange Pi ein und konfigurieren im Router einen Proxy, der alle eingehenden Verbindungen an den externen Server weiterleitet. Falls das Orange Pi nicht erreichbar ist, wird auf den internen Fallback-Server umgeleitet. Ich habe HAProxy verwendet.
So ergibt sich:
- Ein Kunde kommt
- Wenn der externe Server nicht verfügbar ist, erfolgt die Verbindung wie zuvor zum internen Server.
- Wenn er verfügbar ist, übernimmt das Orange Pi den Kunden.
- Der VPN auf dem Orange Pi entschlüsselt die Pakete und lässt sie zurück in den Router.
- Der Router leitet sie irgendwohin.
Beispiel einer Implementierung
Angenommen, wir haben im Router zwei Netzwerke - main(1) und guest(2), für jedes davon gibt es einen OpenVPN-Server für externe Verbindungen.
Netzwerkkonfiguration
Wir müssen beide Netzwerke über einen Port leiten, daher erstellen wir 2 VLANs.
Im Abschnitt Network/Switch des Routers erstellen wir die VLANs (z.B. 1 und 2) und aktivieren sie im Tagged-Modus an dem entsprechenden Port. Die neu erstellten eth0.1 und eth0.2 fügen wir den entsprechenden Netzwerken hinzu (z.B. ins Bridge).
Wir erstellen zwei VLAN-Schnittstellen auf dem Orange Pi (ich verwende Archlinux ARM + netctl):
/etc/netctl/vlan-main
Description='Haupt-VLAN auf eth0'
Interface=vlan-main
Connection=vlan
BindsToInterfaces=eth0
VLANID=1
IP=no
/etc/netctl/vlan-guest
Description='Gast-VLAN auf eth0'
Interface=vlan-guest
Connection=vlan
BindsToInterfaces=eth0
VLANID=2
IP=no
Und wir erstellen sofort zwei Bridges dafür:
/etc/netctl/br-main
Description="Haupt-Bridgeverbindung"
Interface=br-main
Connection=bridge
BindsToInterfaces=(vlan-main)
IP=dhcp
/etc/netctl/br-guest
Description="Gast-Bridgeverbindung"
Interface=br-guest
Connection=bridge
BindsToInterfaces=(vlan-guest)
IP=dhcp
Wir aktivieren den Autostart für alle 4 Profile (netctl enable). Jetzt wird der Orange Pi nach einem Neustart in den beiden erforderlichen Netzwerken hängen. Die IP-Adressen der Schnittstellen auf dem Orange Pi konfigurieren wir in den Static Leases auf dem 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
Im nächsten Schritt kopieren wir die Einstellungen vom Router für OpenVPN und die Schlüssel. Die Einstellungen können normalerweise in /tmp/etc/openvpn*.conf
Standardmäßig hält OpenVPN, das im TAP-Modus und im Server-Bridge-Modus 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}
Sobald die Verbindung hergestellt ist, wird das vpn-main-Interface zur br-main hinzugefügt. Für das Gästennetz erfolgt dies analog, wobei die Namen der Schnittstellen und die Adressen im server-bridge berücksichtigt werden.
Anfragen von außen routen und proxifizieren
In diesem Schritt kann der Orange Pi bereits Verbindungen akzeptieren und Kunden in die gewünschten Netzwerke einlassen. Nun fehlt nur noch die Konfiguration des Proxys für eingehende Verbindungen am Router.
Die VPN-Server des Routers auf andere Ports verschieben, HAProxy auf dem Router installieren 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 zu Orange Pi, der Router-Prozessor überhitzt nicht mehr und die VPN-Geschwindigkeit wird spürbar steigen. Dabei bleiben alle Netzwerkregeln, die auf dem Router festgelegt sind, weiterhin gültig. Sollte es zu einem Ausfall auf Orange Pi kommen, wird er ausfallen und HAProxy leitet die Kunden auf die lokalen Server um.
Vielen Dank für Ihre Aufmerksamkeit. Anregungen und Korrekturen sind willkommen.
Quelle: habr.com
