Openwrt राउटर पर OpenVPN को तेज़ करना। सोल्डरिंग आयरन और हार्डवेयर अतिवाद के बिना वैकल्पिक संस्करण

Openwrt राउटर पर OpenVPN को तेज़ करना। सोल्डरिंग आयरन और हार्डवेयर अतिवाद के बिना वैकल्पिक संस्करण

Всем привет, недавно прочитал давнюю статью о том, как можно ускорить 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’a.

На роутере в разделе 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 на роутере.

आईपी ​​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

वीपीएन सेटअप

Дальше копируем с роутера настройки для 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 завернет клиентов на локальные сервера.

Спасибо за внимание, пожелания и исправления приветствуются.

स्रोत: www.habr.com

एक टिप्पणी जोड़ें