Acelerar OpenVPN en un enrutador Openwrt. Versión alternativa sin soldador y extremismo de hardware.

Acelerar OpenVPN en un enrutador Openwrt. Versión alternativa sin soldador y extremismo de hardware.

Hola a todos, hace poco leí artículo antiguo sobre cómo puede acelerar OpenVPN en un enrutador transfiriendo el cifrado a una pieza de hardware separada, que está soldada dentro del enrutador. Tengo un caso similar con el autor: TP-Link WDR3500 con 128 megabytes de RAM y un procesador deficiente, que no soporta en absoluto el cifrado de túnel. Sin embargo, categóricamente no quería subirme al enrutador con un soldador. Bajo el corte, mi experiencia de mover OpenVPN a una pieza separada de hardware con una copia de seguridad en el enrutador en caso de accidente.

Tarea

Hay un enrutador TP-Link WDR3500 y Orange Pi Zero H2. Queremos que Orange Pi cifre los túneles en el modo normal, y si algo le sucede, el procesamiento de VPN volverá al enrutador. Todas las configuraciones de firewall en el enrutador deberían funcionar como antes. Y, en general, en general, la adición de una pieza adicional de hierro debe ser transparente e imperceptible para todos. OpenVPN funciona sobre TCP, adaptador TAP en modo puente (servidor-puente).

Solución

En lugar de conectarme a través de USB, decidí gastar un puerto del enrutador y conectar todas las subredes que tienen un puente VPN a Orange Pi. Resulta que la pieza de hierro colgará físicamente en las mismas redes que el servidor VPN en el enrutador. Después de eso, levantamos exactamente los mismos servidores en el Orange Pi, y en el enrutador configuramos algún tipo de proxy para que envíe todas las conexiones entrantes al servidor externo, y si el Orange Pi está muerto o no está disponible, luego al servidor de respaldo interno. Tomé HAProxy.

Resulta así:

  1. llega el cliente
  2. Si el servidor externo no está disponible, como antes, la conexión va al servidor interno
  3. Si está disponible, el cliente es aceptado por Orange Pi
  4. VPN en Orange Pi descifra paquetes y los escupe al enrutador
  5. El enrutador los enruta a alguna parte

Ejemplo de implementación

Entonces, digamos que tenemos dos redes en el enrutador: principal (1) e invitada (2), para cada una de ellas hay un servidor OpenVPN para conectarse desde el exterior.

Configuración de la red

Necesitamos pasar ambas redes a través de un puerto, por lo que creamos 2 VLAN.

En el enrutador, en la sección Red/Conmutador, cree VLAN (por ejemplo, 1 y 2) y enciéndalas en modo etiquetado en el puerto deseado, agregue los eth0.1 y eth0.2 recién creados a las redes apropiadas (por ejemplo, agregar a puente).

En Orange Pi creamos dos interfaces VLAN (tengo Archlinux ARM + netctl):

/etc/netctl/vlan-principal

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

/etc/netctl/vlan-invitado

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

E inmediatamente crea dos puentes para ellos:

/etc/netctl/br-main

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

/etc/netctl/br-invitado

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

Habilite el inicio automático para los 4 perfiles (habilitar netctl). Ahora, después de reiniciar, Orange Pi se colgará en las dos redes requeridas. Las direcciones de interfaz en Orange Pi se configuran en Arrendamientos estáticos en el enrutador.

espectáculo ip addr

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

configuración de VPN

A continuación, copie la configuración de OpenVPN y las claves del enrutador. Por lo general, los ajustes se pueden tomar de /tmp/etc/openvpn*.conf

De forma predeterminada, openvpn se ejecuta en modo TAP y el puente del servidor mantiene su interfaz inactiva. Para que funcione, debe agregar un script que se ejecute cuando se active la conexión.

/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}

Como resultado, tan pronto como se produzca una conexión, la interfaz vpn-main se agregará a br-main. Para la cuadrícula de invitados, es similar hasta el nombre y la dirección de la interfaz en el puente del servidor.

Enrutamiento de solicitudes externas y proxy

En este paso, Orange Pi ya puede aceptar conexiones y permitir que los clientes ingresen a las redes deseadas. Queda por configurar el proxy de las conexiones entrantes en el enrutador.

Transferimos los servidores VPN del enrutador a otros puertos, instalamos HAProxy en el enrutador y configuramos:

/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

Disfrutar

Si todo salió según lo planeado, los clientes irán a Orange Pi y el procesador del enrutador ya no se calentará, y la velocidad de VPN aumentará significativamente. Al mismo tiempo, todas las reglas de red registradas en el enrutador seguirán siendo relevantes. En caso de accidente en el Orange Pi, se caerá y HAProxy envolverá a los clientes en los servidores locales.

Gracias por su atención, sugerencias y correcciones son bienvenidas.

Fuente: habr.com

Añadir un comentario