Прискорюємо OpenVPN на роутері Openwrt. Альтернативна версія без паяльника та хардварного екстремізму

Прискорюємо OpenVPN на роутері Openwrt. Альтернативна версія без паяльника та хардварного екстремізму

Всім привіт, нещодавно прочитав давню статтю про те, як можна прискорити OpenVPN на роутері, перенісши шифрування на окрему залозку, яка припаюється всередині самого роутера. У мене аналогічний з автором випадок - TP-Link WDR3500 з 128 мегабайтами оперативної пам'яті і бідним процесором, який геть-чисто не справляється з шифруванням тунелів. Проте, лізти в роутер із паяльником мені категорично не хотілося. Під катом мій досвід винесення OpenVPN на окрему залізницю з резервуванням на роутері на випадок аварії.

Завдання

Є роутер TP-Link WDR3500 та Orange Pi Zero H2. Хочемо, щоб шифруванням тунелів у штатному режимі займався Orange Pi, причому якщо з ним щось трапиться, обробка VPN повернеться назад на роутер. Усі налаштування фаєрволу на роутері мають працювати як раніше. І взагалі загалом додавання додаткової залозки має пройти для всіх прозоро та непомітно. OpenVPN працює за TCP, адаптер TAP як мосту (server-bridge).

Рішення

Замість підключення USB я вирішив витратити один порт роутера і завести по ньому на Orange Pi всі підмережі, в яких є VPN бридж. Виходить, що залізниця фізично висітиме в тих же мережах, що і VPN сервера на роутері. Після цього піднімаємо такі самі сервери на Orange Pi, а на роутері налаштовуємо який-небудь проксі щоб він віддавав всі вхідні підключення на зовнішній сервер, а якщо Orange Pi помер або недоступний - тоді на внутрішній fallback сервер. Я взяв HAProxy.

Виходить так:

  1. Приходить клієнт
  2. Якщо зовнішній сервер недоступний — як і раніше, підключення йде на внутрішній сервер.
  3. Якщо доступний - клієнта приймає Orange Pi
  4. VPN на Orange Pi дешифрує пакети та випльовує їх назад у роутер
  5. Роутер маршрутизує їх кудись

Приклад реалізації

Отже, нехай у нас є на роутері дві мережі — main(1) і guest(2), для кожної з них є OpenVPN сервер для підключення зовні.

Конфігурація мережі

Нам потрібно прокинути обидві мережі через один порт, тому створюємо 2 VLAN.

На роутері у розділі Network/Switch створюємо VLAN'и (наприклад 1 і 2) і включаємо їх у tagged режимі на потрібному порту, додаємо новостворені eth0.1 та eth0.2 до відповідних мереж (наприклад, додаємо у brigde).

На Orange Pi створюємо два VLAN інтерфейси (у мене 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

І відразу створюємо два бриджі для них:

/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

Включаємо автостарт на всі 4 профілі (netctl enable). Тепер після перезавантаження Orange Pi висітиме у двох необхідних мережах. Адреси інтерфейсів на Orange Pi налаштовуємо у Static Leases на роутері.

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

Налаштування VPN

Далі копіюємо з роутера налаштування для OpenVPN та ключі. Налаштування зазвичай можна взяти в /tmp/etc/openvpn*.conf

За замовчуванням openvpn, запущений у режимі TAP та server-bridge, тримає свій інтерфейс неактивним. Щоб усе запрацювало, треба додати скрипт, який запускається під час активації з'єднання.

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

В результаті як тільки трапиться підключення, інтерфейс vpn-main буде додано до br-main. Для сітки guest – аналогічно з точністю до імені інтерфейсу та адреси у server-bridge.

Маршрутизація запитів зовні та проксування

На цьому етапі Orange Pi вже вміє приймати підключення і пускати клієнтів у необхідні мережі. Залишилося налаштувати проксіювання вхідних підключень на роутері.

Переносимо роутерні VPN сервери на інші порти, ставимо на роутер HAProxy і налаштовуємо:

/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

Насолоджуємось

Якщо все пройшло за планом - клієнти підуть на Orange Pi і процесор роутера більше не грітиметься, а швидкість VPN відчутно зросте. При цьому залишаться актуальними всі мережеві правила, прописані на роутері. У разі аварії на Orange Pi він відвалиться і HAProxy загорне клієнтів на локальні сервери.

Дякуємо за увагу, побажання та виправлення вітаються.

Джерело: habr.com

Додати коментар або відгук