从OpenVPN迁移到WireGuard,将网络加入一个L2网络



我想分享在三个地理位置遥远的公寓中组合网络的经验,在每个公寓中,带有OpenWRT的路由器用作通向一个公用网络的网关。选择将L3与子网路由和L2与桥接之间的网络组合在一起的方法时,当网络的所有节点都在同一子网上时,首选第二种方法,因为它计划在正在创建的网络中使用透明技术,因此第二种方法更难以配置,但是却提供了更多的机会。局域网唤醒和DLNA。

第1部分:背景


最初选择OpenVPN作为执行此任务的协议,因为首先,它可以创建可以轻松添加到网桥的Tap设备,其次,OpenVPN支持TCP协议操作,这也很重要,因为所有公寓都没有专用的IP地址,我无法使用STUN,因为由于某种原因,我的提供商阻止了UDP通过其网络传入的连接,而TCP允许我将VPN服务器的端口转发至使用SSH租用VPS。是的,这种方法带来了很大的负担,因为数据已被加密两次,但是我不想将VPS输入到我的专用网络中,因为存在第三方控制它的风险,因此,在家庭网络上拥有这样的设备是非常不希望的,因此决定以高额开销来支付安全性。

为了在计划部署服务器的路由器上转发端口,使用了sshtunnel程序。我不会描述其配置的复杂性-这很容易做到,我只是注意到它的任务是将TCP端口1194从路由器转发到VPS。接下来,在tap0设备上配置OpenVPN服务器,该设备缠绕在br-lan桥中。在检查了与您刚刚从笔记本电脑创建的服务器的连接之后,很明显,端口转发的想法已经奏效,尽管我实际上不在现场,但我的笔记本电脑已成为路由器网络的成员。

事情仍然很小:有必要在不同的公寓中分配IP地址,以免它们冲突,并将路由器配置为OpenVPN客户端。
选择了以下路由器IP地址和DHCP服务器范围:

  • 192.168.10.1射程192.168.10.2 - 192.168.10.80的服务器
  • 192.168.10.100具有一定范围的192.168.10.101 - 192.168.10.149在公寓2号路由器
  • 192.168.10.150具有一定范围的192.168.10.151 - 192.168.10.199在第3号公寓路由器

还需要通过在其配置中添加以下几行,将这些地址分配给OpenVPN服务器的客户端路由器:

ifconfig-pool-persist /etc/openvpn/ipp.txt 0

并将以下行添加到/etc/openvpn/ipp.txt文件中:

flat1_id 192.168.10.100
flat2_id 192.168.10.150

其中flat1_id和flat2_id是在创建用于连接到OpenVPN的证书时指定的设备名称

接下来,在路由器上配置了OpenVPN客户端,两个路由器上的tap0设备都添加到了br-lan网桥。在这个阶段,似乎一切都井然有序,因为所有三个网络都可以互相看到并整体运作。但是,事实证明这不是一个非常令人愉快的细节:有时设备无法从其路由器获取IP地址,随之而来的是所有后果。由于某些原因,某些公寓中的路由器没有时间及时响应DHCPDISCOVER,并且设备未收到其地址。我意识到我需要在每个路由器的tap0中过滤此类请求,但是事实证明,如果iptables是网桥的一部分,则iptables不能与该设备一起使用,而ebtables应该可以帮助我。不幸的是,它不在我的固件中,我不得不为每个设备重建映像。完成此操作并将此类行添加到每个路由器的/etc/rc.local后,问题得以解决:

ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP

这种配置持续了三年。

第2部分:WireGuard简介


最近,在Internet上,他们开始越来越多地谈论WireGuard,欣赏其配置的简单性,高传输速度,低ping和可比的安全性。搜索有关他的其他信息表明,他们既不支持作为桥接成员,也不支持与TCP一起工作,这使我认为对于我而言,OpenVPN仍然没有其他选择。所以我推迟了认识WireGuard。

几天前,通过资源,一种或另一种方式与IT连接,有消息传出,WireGuard最终将从5.6版开始包含在Linux内核中。新闻文章一如既往地赞扬WireGuard。我再次投入了寻找替代旧式OpenVPN的方法。这次我碰到这篇文章。它讨论了使用GRE在L3上构建以太网隧道的问题。这篇文章给了我希望。尚不清楚如何处理UDP协议。通过搜索,我找到了有关将socat与SSH隧道结合使用以转发UDP端口的文章,但是,他们指出,这种方法仅在单连接模式下有效,也就是说,无法使用多个VPN客户端。我想到了在VPS上安装VPN服务器并为客户端设置GRE的想法,但事实证明,GRE不支持加密,这将导致以下事实:如果第三方访问服务器,则我网络之间的所有流量都在他们的手中原则上不适合我。

同样,根据以下方案,通过在VPN上使用VPN来做出过度加密的决定:

一级VPN:
VPS内部地址为192.168.30.1 服务器
MS内部地址为192.168.30.2 VPS 客户端MK2内部地址为192.168.30.3 VPS 客户端MK3内部地址为192.168.30.3 VPS 客户端
MK2第二级VPN:MS服务器具有外部地址192.168.30.2和内部192.168.31.1的MK2一个MS 客户端,其地址为192.168.30.2并具有内部IP 192.168.31.2 MK3一个MS 客户端





地址为192.168.30.2,内部IP为192.168.31.3

* MS-公寓1中的路由器-服务器,MK2-公寓2中的路由器MK3-公寓3中的路由器
*设备配置在本文结尾处的扰流器中发布。

因此,在网络192.168.31.0/24的节点之间执行ping操作,是时候继续建立GRE隧道了。在此之前,为了不失去对路由器的访问权限,值得设置SSH隧道以转发VPS上的22个端口,例如,第2套公寓的路由器将在第10022个VPS端口上可用,而在第11122个端口上将可用VPS路由器来自3号公寓。最好使用相同的sshtunnel配置转发,因为如果隧道掉线,它将恢复隧道。

隧道已配置,您可以通过转发的端口连接到SSH:

ssh root@_VPS -p 10022

接下来,禁用OpenVPN:

/etc/init.d/openvpn stop

现在,从公寓2在路由器上配置GRE隧道:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set grelan0 up

并将创建的接口添加到网桥:

brctl addif br-lan grelan0

我们将在路由器服务器上执行类似的过程:

ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set grelan0 up

并且,还将创建的接口添加到网桥:

brctl addif br-lan grelan0

从这一刻开始,Ping开始成功进入新网络,而我满意地将要喝咖啡。然后,为了评估网络另一端的工作方式,我尝试通过SSH连接到2号公寓中的一台计算机,但是ssh客户端冻结,而没有提示输入密码。我尝试通过telnet连接到这台计算机,并连接到端口22,我看到一条线,从中可以了解到正在建立连接,SSH服务器正在响应,仅出于某种原因不提供我登录。

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

我尝试通过VNC连接到它并看到黑屏。我向自己保证这是一台远程计算机,因为我可以从内部地址的这套公寓轻松地连接到路由器。但是,我决定通过路由器连接到此计算机的SSH,很惊讶地发现连接成功并且远程计算机可以正常工作,但是它也无法连接到我的计算机。

我从网桥上卸下了grelan0设备,并在2号公寓的路由器上运行OpenVPN,并确保网络再次按预期工作并且连接不会中断。当我进行搜索时,我会遇到一些论坛,在该论坛上人们会抱怨同样的问题,建议他们提高MTU。但是,我无法提高第一级VPN(wg0)的MTU:如果MTU高于1420(会自动设置),则会开始中断,但与此同时,在wg0之上工作的第二级VPN wg1在MTU 1600上也可以正常工作。这足以安装gretap设备的MTU为1500,因此该接口的MTU值与计划将gretap添加到其中的br-lan桥相同。据我了解,网桥将MTU设置为等于所有设备上可用值中的较小者。

我在3号公寓的路由器上进行了类似的配置,唯一的区别是服务器在服务器上添加了第二个gretap接口,名为grelan1,该接口也已添加到br-lan网桥中。

一切正常。现在,您可以在启动时放置gretap程序集。为此,请执行以下操作:

将这些行放在单元2的路由器上的/etc/rc.local中:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set dev grelan0 mtu 1500
ip link set grelan0 up
brctl addif br-lan grelan0

将此添加到单元3中的路由器的/etc/rc.local中:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3
ip link set dev grelan0 mtu 1500
ip link set grelan0 up
brctl addif br-lan grelan0

并在服务器路由器上:

ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set dev grelan0 mtu 1500
ip link set grelan0 up
brctl addif br-lan grelan0

ip link add grelan1 type gretap remote 192.168.31.3 local 192.168.31.1
ip link set dev grelan1 mtu 1500
ip link set grelan1 up
brctl addif br-lan grelan1

重新启动客户端路由器后,我发现由于某种原因它们没有连接到服务器。连接到他们的SSH(幸运的是,我为此预先配置了sshtunnel)后,发现WireGuard出于某种原因正在为端点创建路由,但这是不正确的。因此,对于192.168.30.2,路由表指示了通过pppoe-wan接口(即,通过Internet)的路由,尽管到该路由的路由应该已经通过wg0接口进行了路由。删除此路由后,恢复了连接。我在某处找不到有关如何使WireGuard不创建这些路由的说明。而且,我什至不知道,功能是OpenWRT还是WireGuard本身。不用长时间解决这个问题,我只是在此路由器上添加了一行到由计时器循环的脚本中以删除此路由:

route del 192.168.30.2

总结一下


我还没有完全拒绝使用OpenVPN,因为有时我需要从笔记本电脑或手机连接到新网络,并且通常无法在它们上安装gretap设备,但是尽管如此,我还是获得了公寓之间数据传输速度的优势并且,例如,现在使用VNC不会带来任何不便。Ping略有下降,但变得更加稳定:

使用OpenVPN时:

[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=133 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=125 ms

--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19006ms
rtt min/avg/max/mdev = 124.722/126.152/136.907/3.065 ms

使用WireGuard时:

[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=124 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=124 ms
--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19003ms
rtt min/avg/max/mdev = 123.954/124.423/126.708/0.675 ms

VPS之前的高ping(大约61.5 ms)对它的影响更大,

但是速度显着提高。因此,在带有路由器服务器的公寓中,我的Internet连接速度为30 Mbit / s,在其他公寓中为5 Mbit / s。同时,根据iperf,在使用OpenVPN时,我无法实现网络之间的数据传输速率超过3.8 Mb / s,而WireGuard将其“抽取”到相同的5 Mb / s。

VPS上的WireGuard配置
[Interface]
Address = 192.168.30.1/24
ListenPort = 51820
PrivateKey = <___VPS>

[Peer]
PublicKey = <__VPN_1_>
AllowedIPs = 192.168.30.2/32

[Peer]
PublicKey = <__VPN_2_2>
AllowedIPs = 192.168.30.3/32

[Peer]
PublicKey = <__VPN_2_3>
AllowedIPs = 192.168.30.4/32


MS上的WireGuard配置(添加到/ etc / config / network)
#VPN   - 
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.2/24'
        option private_key '__VPN_1_'
        option auto '1'

config wireguard_wg0
        option public_key '__VPN_1_VPS'
        option endpoint_port '51820'
        option route_allowed_ips '1'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP__VPS'

#VPN   - 
config interface 'wg1'
        option proto 'wireguard'
        option private_key '__VPN_2_'
        option listen_port '51821'
        list addresses '192.168.31.1/24'
        option auto '1'
        option mtu '1600'

config wireguard_wg1
        option public_key '__VPN_2_2'
        list allowed_ips '192.168.31.2'

config wireguard_wg1ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3
        option public_key '__VPN_2_3'
        list allowed_ips '192.168.31.3'


MK2上的WireGuard配置(添加到/ etc / config / network)
#VPN   - 
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.3/24'
        option private_key '__VPN_1_2'
        option auto '1'

config wireguard_wg0
        option public_key '__VPN_1_VPS'
        option endpoint_port '51820'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP__VPS'

#VPN   - 
config interface 'wg1'
        option proto 'wireguard'
        option private_key '__VPN_2_2'
        list addresses '192.168.31.2/24'
        option auto '1'
        option listen_port '51821'
        option mtu '1600'

config wireguard_wg1
        option public_key '__VPN_2_'
        option endpoint_host '192.168.30.2'
        option endpoint_port '51821'
        option persistent_keepalive '25'
        list allowed_ips '192.168.31.0/24'


MK3上的WireGuard配置(添加到/ etc / config / network)
#VPN   - 
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.4/24'
        option private_key '__VPN_1_3'
        option auto '1'

config wireguard_wg0
        option public_key '__VPN_1_VPS'
        option endpoint_port '51820'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP__VPS'

#VPN   - 
config interface 'wg1'
        option proto 'wireguard'
        option private_key '__VPN_2_3'
        list addresses '192.168.31.3/24'
        option auto '1'
        option listen_port '51821'
        option mtu '1600'

config wireguard_wg1
        option public_key '__VPN_2_'
        option endpoint_host '192.168.30.2'
        option endpoint_port '51821'
        option persistent_keepalive '25'
        list allowed_ips '192.168.31.0/24'


在所描述的第二层VPN配置中,我为WireGuard客户端指定了51821端口,原则上这是没有必要的,因为客户端将通过任何免费的非特权端口建立连接,但是我这样做是为了阻止所有路由器的wg0接口上的所有传入连接。到端口51821的UDP传入连接。

我希望本文对某人有用。

PS另外,我想共享我的脚本,当网络上出现新设备时,该脚本会在电话中向我发送一个PUSH通知到WirePusher应用程序。这是脚本的链接:github.com/r0ck3r/device_discover

更新:配置OpenVPN服务器和客户端

OpenVPN服务器
client-to-client

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vpn-server.crt
dh /etc/openvpn/server/dh.pem
key /etc/openvpn/server/vpn-server.key

dev tap
ifconfig-pool-persist /etc/openvpn/ipp.txt 0
keepalive 10 60
proto tcp4
server-bridge 192.168.10.1 255.255.255.0 192.168.10.80 192.168.10.254
status /var/log/openvpn-status.log
verb 3
comp-lzo


OpenVPN客户端
client
tls-client
dev tap
proto tcp
remote VPS_IP 1194 # Change to your router's External IP
resolv-retry infinite
nobind

ca client/ca.crt
cert client/client.crt
key client/client.key
dh client/dh.pem

comp-lzo
persist-tun
persist-key
verb 3



生成使用easy-rsa的证书

Source: https://habr.com/ru/post/undefined/


All Articles