大家好,最近读了
任务
有一台 TP-Link WDR3500 路由器和一台 Orange Pi Zero H2。 我们希望 Orange Pi 像往常一样加密隧道,如果发生问题,VPN 处理将返回到路由器。 路由器上的所有防火墙设置应该像以前一样工作。 一般来说,添加额外的硬件应该是透明的并且不会被每个人注意到。 OpenVPN 通过 TCP 工作,TAP 适配器处于桥接模式(服务器桥接)。
解
我决定使用路由器的一个端口,并将所有具有 VPN 桥接器的子网连接到 Orange Pi,而不是通过 USB 连接。 事实证明,硬件将物理挂在与路由器上的 VPN 服务器相同的网络中。 之后,我们在 Orange Pi 上安装完全相同的服务器,并在路由器上设置某种代理,以便它将所有传入连接发送到外部服务器,如果 Orange Pi 死机或不可用,则发送到内部后备服务器。 我采用了 HAProxy。
结果是这样的:
- 一位客户来了
- 如果外部服务器不可用,像以前一样,连接将转到内部服务器
- 如果可用,则 Orange Pi 接受该客户端
- Orange Pi 上的 VPN 解密数据包并将其吐回路由器
- 路由器将它们路由到某个地方
实施示例
因此,假设路由器上有两个网络 - 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