Aceleramos OpenVPN en el router Openwrt. Versión alternativa sin soldador ni extremismo hardware

Aceleramos OpenVPN en el router Openwrt. Versión alternativa sin soldador ni extremismo hardware

Hola a todos, recientemente leí un antiguo artículo sobre cómo se puede acelerar OpenVPN en un enrutador, transfiriendo la encriptación a un hardware separado que se suelda dentro del enrutador. Tengo una situación similar a la del autor: un TP-Link WDR3500 con 128 megabytes de RAM y un procesador modesto que no puede manejar la encriptación de túneles. Sin embargo, no quería meterme a soldar en el enrutador. A continuación, mi experiencia de trasladar OpenVPN a un hardware separado con respaldo en el enrutador en caso de emergencia.

Tarea

Tengo un enrutador TP-Link WDR3500 y un Orange Pi Zero H2. Queremos que la encriptación de los túneles sea manejada por el Orange Pi, de modo que si algo le sucede, el procesamiento VPN regrese nuevamente al enrutador. Todas las configuraciones del cortafuegos en el enrutador deben funcionar como antes. En general, la adición de hardware adicional debería ser transparente y desapercibida para todos. OpenVPN funciona por TCP, y el adaptador TAP en modo puente (server-bridge).

Solución

En lugar de conectarlo por USB, decidí usar un puerto del enrutador y conectar a través de él todas las subredes en las que hay un puente VPN. De esa manera, el hardware estará físicamente presente en las mismas redes que los servidores VPN del enrutador. Después de eso, levantamos exactamente los mismos servidores en el Orange Pi, y en el enrutador configuramos un proxy para que dirija todas las conexiones entrantes al servidor externo, y si el Orange Pi falla o no está disponible, entonces al servidor de respaldo interno. Usé HAProxy.

Así que queda así:

  1. El cliente llega
  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 el Orange Pi
  4. El VPN en el Orange Pi descifra los paquetes y los envía de vuelta al enrutador
  5. El enrutador los enruta a algún lugar

Ejemplo de implementación

Así que supongamos que tenemos dos redes en el enrutador: main(1) y guest(2), para cada una de ellas hay un servidor OpenVPN para conexiones externas.

Configuración de red

Necesitamos enrutar ambas redes a través de un puerto, así que creamos 2 VLAN.

En el enrutador, en la sección Network/Switch, creamos las VLAN (por ejemplo, 1 y 2) y las activamos en modo etiquetado en el puerto correspondiente, añadimos las recién creadas eth0.1 y eth0.2 a las redes correspondientes (por ejemplo, las añadimos al puente).

En el Orange Pi, creamos dos interfaces VLAN (tengo 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

Y de inmediato creamos dos puentes para ellos:

/etc/netctl/br-main

Descripción="Conexión del puente principal"
Interfaz=br-main
Conexión=puente
VinculadoAInterfaces=(vlan-main)
IP=dhcp

/etc/netctl/br-guest

Descripción="Conexión del puente de invitados"
Interfaz=br-guest
Conexión=puente
VinculadoAInterfaces=(vlan-guest)
IP=dhcp

Activamos el inicio automático para los 4 perfiles (netctl enable). Ahora, después de reiniciar, Orange Pi estará conectado en las dos redes requeridas. Configuramos las direcciones de las interfaces en Orange Pi en las concesiones estáticas en el enrutador.

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

Configuración de VPN

A continuación, copiamos la configuración de OpenVPN y las claves del enrutador. Normalmente, se pueden obtener configuraciones en /tmp/etc/openvpn*.conf

Por defecto, OpenVPN, ejecutándose en modo TAP y en server-bridge, mantiene su interfaz inactiva. Para que todo funcione, es necesario añadir un script que se ejecute al activar 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 establezca la conexión, la interfaz vpn-main se añadirá a br-main. Para la red de invitados, lo mismo con la precisión del nombre de la interfaz y la dirección en server-bridge.

Enrutamiento de solicitudes externas y proxy

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

Movemos 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

Disfrutamos

Si todo salió según lo planeado, los clientes se cambiarán a Orange Pi y el procesador del enrutador ya no se calentará, mientras que la velocidad de VPN aumentará significativamente. Además, todas las reglas de red definidas en el enrutador seguirán siendo válidas. En caso de un fallo en Orange Pi, se desconectará y HAProxy redirigirá a los clientes a los servidores locales.

Gracias por su atención, se aceptan sugerencias y correcciones.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster