在 Openwrt 路由器上加速 OpenVPN。 没有烙铁和硬件极端主义的替代版本

在 Openwrt 路由器上加速 OpenVPN。 没有烙铁和硬件极端主义的替代版本

大家好,最近读了 旧文章 关于如何通过将加密传输到焊接在路由器本身内部的单独硬件来加速路由器上的 OpenVPN。 我有一个与作者类似的案例 - TP-Link WDR3500,具有 128 MB RAM 和较差的处理器,完全无法应对隧道加密。 然而,我绝对不想用烙铁进入路由器。 以下是我将 OpenVPN 迁移到单独的硬件并在路由器上进行备份以防发生意外的经验。

任务

有一台 TP-Link WDR3500 路由器和一台 Orange Pi Zero H2。 我们希望 Orange Pi 像往常一样加密隧道,如果发生问题,VPN 处理将返回到路由器。 路由器上的所有防火墙设置应该像以前一样工作。 一般来说,添加额外的硬件应该是透明的并且不会被每个人注意到。 OpenVPN 通过 TCP 工作,TAP 适配器处于桥接模式(服务器桥接)。

我决定使用路由器的一个端口,并将所有具有 VPN 桥接器的子网连接到 Orange Pi,而不是通过 USB 连接。 事实证明,硬件将物理挂在与路由器上的 VPN 服务器相同的网络中。 之后,我们在 Orange Pi 上安装完全相同的服务器,并在路由器上设置某种代理,以便它将所有传入连接发送到外部服务器,如果 Orange Pi 死机或不可用,则发送到内部后备服务器。 我采用了 HAProxy。

结果是这样的:

  1. 一位客户来了
  2. 如果外部服务器不可用,像以前一样,连接将转到内部服务器
  3. 如果可用,则 Orange Pi 接受该客户端
  4. Orange Pi 上的 VPN 解密数据包并将其吐回路由器
  5. 路由器将它们路由到某个地方

实施示例

因此,假设路由器上有两个网络 - main(1) 和 guest(2),每个网络都有一个用于外部连接的 OpenVPN 服务器。

网络配置

我们需要通过一个端口路由两个网络,因此我们创建 2 个 VLAN。

在路由器的“网络/交换机”部分中,创建 VLAN(例如 1 和 2)并在所需端口上以标记模式启用它们,将新创建的 eth0.1 和 eth0.2 添加到相应的网络(例如,将它们添加到桥)。

在 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 启用)。 现在重新启动后,Orange Pi 将挂在两个所需的网络上。 我们在路由器的静态租约中配置 Orange Pi 上的接口地址。

ip addr show

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。 对于来宾网格 - 类似地,直到服务器桥中的接口名称和地址。

外部路由请求和代理

到这一步,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

添加评论