RouterOS v7加入了WireGuard,WireGuard是一个极简而快速的加密VPN协议。其设计目标是比IPsec更快、更精简和高效,同时性能要比OpenVPN提升很多。WireGuard被设计成一种通用VPN,可以在多个平台上运行,适合许多不同的环境。最初是为Linux内核发布的,后支持跨平台(Windows, macOS, BSD, iOS, Android),能进行广泛的部署。

这个协议之前就看过,但没具体测试,后来大连小方提到,自己就动手测试了下,由于Wireguard极简的代码,加上高效性能,被加入Linux 5.5的内核中,RouterOS v7采用的是5.6的内核,所以RouterOS v7加入该功能是顺理成章的事情。WireGuard到底有啥特点,我们先从性能表现来看,从官网看到的测试数据:

测试平台与配置

  • Intel Core i7-3820QM和 Intel Core i7-5200U
  • Intel 82579LM 和Intel I218LM gigabit 以太网卡
  • Linux 4.6.1
  • WireGuard 配置: 256-bit ChaCha20 with Poly1305 for MAC
  • IPsec配置1: 256-bit ChaCha20 with Poly1305 for MAC
  • IPsec 配置2: AES-256-GCM-128 (with AES-NI)
  • OpenVPN配置: equivalently secure cipher suite of 256-bit AES with HMAC-SHA2-256, UDP mode
  • 使用iperf3测试,取30分钟平均值

从这个测试数据看使用的是1Gbit的网卡,跑出1011mbps的结果,说明带宽测试采用的是UDP协议,而非TCP。从官方测试性能看,WireGurad对于IPsec优势非常明显,而对于OpenVPN几乎是碾压。

在部署方面,WireGurad各个节点是Peer对等体的概念,而非是Server与Client关系,相互之间是对等的,一个节点既可以是发起者,也可以是接收者,比如网上提到VPN的拓扑方案中,可以是点对点,点对多点的中心覆盖,而WireGuard不一样了,不仅可以点对点,也可以点对多点,每个节点同时可连接多个 Peer,看到过有人通过WireGuard建立全互联模式,三层的Mesh网状网络。

WireGuard只支持UDP协议,不支持传统的TCP-over-TCP隧道,因为TCP网络性能并不理想,在Linux平台,如果对TCP连接有需求,将wiredguard的UDP包转换为TCP,可以使用如udptunnel和udp2raw来协助完成。

关于NAT穿透,通常情况下,WireGuard网络在未被使用的情况下,会尽量保持“安静”,并非一个话痨协议。在大多数情况下,它只在Peer对等体,希望发送数据包时传输数据,当它没有被要求发送数据包时,它就停止发送,直到再次被请求。在点对点公网IP连接的网络环境是这样的,然而,当一个Peer端位于NAT或防火墙之后时,即使它不发送任何数据包的情况下,也希望能接收传入的数据包。因为NAT和防火墙会跟踪“会话连接”,他必须通过定期发送数据包来维持NAT/防火墙连接会话映射的有效,即UDP的timeout时间。WireGuard可以开启此选项,每隔一秒向对端点发送一个keepalive报文,当然适用于各种NAT/防火墙的合理间隔在25秒。默认设置keepalive是关闭状态,因为公网IP连接的用户不需要这个功能。

WireGuard使用的是ChaCha20Poly1305,它几乎在所有通用CPU上的运行速度都非常快。虽然未被专用硬件支持(IPsec支持硬件加速),但在CPU上的矢量指令(vector instructions)与AES-NI指令处于相同的优先级(有时甚至更快)。

总结下WireGuard的特点:

  1. 是基于UDP协议连接,具备网络性能优势
  2. 运行在Linux内核,在性能上优于IPsec和OpenVPN
  3. 每个节点通过公钥识别进行验证,加密采用的是ChaCha20Poly1305。
  4. 每个节点是平等的,既可以作为server,又可以作为client
  5. 两端仅需要一个配置公网IP,另一端在nat后也能连接,nat后的节点,仅需要对端节点公钥,以及公网IP (endpoint)和端口(endpoint port),而公网节点只需要填写连接端的公钥即可

下面通过RouterOS配置WireGuard隧道,并搭建一个测试环境,对比测试多个隧道协议的传输带宽,这个环境是在自己家里搭建,采用RB设备测试,其中一台是当前在售性能最低端的hAP mini,拓扑结构如下:

在这个环境中,一共使用了4台RB设备,分别是:

  1. R1:RB951Ui-2HnD和R2: hAP mini 作为wireguard的互联(RouterOS v7.1beta6)
  2. 用户端RB951Ui-2HnD,作为模拟终端设备进行bandwidth-test带宽测试发起端(RouterOS v6.48.2)
  3. cAP ac:作为bandwidth-test带宽测试节点(RouterOS v6.47.1)

这样网络把两台WireGuard隧道设备放在带宽测试设备中间,更能反映实际的使用环境和吞吐量,如果只是两台R1和R2两台设备测试,本地带宽测试会消耗CPU,影响转发性能。在这个环境中,R1和R2在ether1接口上都做nat,非静态路由模式,也未开启fasttrack,以下的配置仅提供隧道配置过程,其他基本网络配置不在此文描述。

首先在R1创建接口

[admin@R1] /interface/wireguard> add disabled=no listen-port=13231 mtu=1420 name=wireguard1

查看public key

[admin@R1] /interface/wireguard> print

Flags: X - disabled; R - running

0   name="wireguard1" mtu=1420 listen-port=13231 private-key="qAgK90ek…X+kt/GU=" public-key="JwTMcEc…TRXg0="

在R2创建接口

[admin@R2] /interface/wireguard> add disabled=no listen-port=13231 mtu=1420 name=wireguard1

查看public key

[admin@R2] /interface/wireguard> print

Flags: X - disabled; R - running

0 X  name="wireguard1" mtu=1420 listen-port=13231 private-key="GJb2dFT…FttkDLEc="
public-key="f0FjnuH…288Wc="

在R1创建peer,将R1作为发起端,配置对端的IP和端口,添加R2的public key和allowed-address允许通过的IP段,

[admin@R1] /interface/wireguard/peers>add allowed-address=192.168.88.0/24,10.20.30.0/24,192.168.99.0/24 \
endpoint-address=192.168.88.10 endpoint-port=13231 interface=wireguard1 \
public-key="f0FjnuH…0Y288Wc="

在WireGuard中,对等体严格通过其公钥(32字节的Curve25519)来识别。即在公钥和允许的IP地址段之间存在关联映射,要通过WireGuard隧道的所有IP都需要加入allowed-address中与对端的public key建立对应关系。

我们将R2作为接收端,在R2创建Peer,添加R1的public key和允许通过的的IP段

[admin@R2] /interface/wireguard/peers> add allowed-address=192.168.88.0/24,10.20.30.0/24,192.168.99.0/24 interface=wireguard1 public-key=\
"JwTMcE…cTRXg0="

在R1上添加wireguard接口ip地址

[admin@R1] /interface/wireguard/peers> /ip address/
[admin@R1] /ip/address>add address=10.20.30.2/24 interface= wireguard1

在R2上添加wireguard接口ip地址

[admin@R2] /interface/wireguard/p eers> /ip address/
[admin@R2] /ip/address>add address=10.20.30.1/24 interface= wireguard1

由于当前v7还不支持wireguard的log日志支持和状态现实,所以无法判断是否连接成功,只能通过ping测试,对端IP判断是否连接,在R2上测试R1的WireGuard接口IP是否连接。

[admin@R2] > ping 10.20.30.2

SEQ HOST                                     SIZE TTL TIME
0 10.20.30.2                               56  64 1ms106us
1 10.20.30.2                               56  64 517us
2 10.20.30.2                               56  64 520us
3 10.20.30.2                               56  64 511us

sent=4 received=4 packet-loss=0% min-rtt=474us  avg-rtt=605us max-rtt=1ms106us

连接成功后,在R2路由器上将到192.168.99.2的静态路由指向wireguard1,并配置从wireguard1接口出方向的nat规则

[admin@R2] /ip/route>add dst-address=192.168.99.2/32 gateway= wireguard1
[admin@R2] /ip/route>/ip/firewall/nat
[admin@R2] /ip/firewall/nat>add chian=srcnat out-interface= wireguard1 action=masquerade

下面是我对几种VPN隧道协议的bandwidth-test工具,使用tcp协议,单向测试结果如下图:

L2Tp隧道,未启用IPsec

L2TP隧道,启用IPsec

SSTP隧道

最后是WireGuard隧道测试

带宽测试除了看各种隧道在当前设备支持的最大带宽,还要看CPU使用率,如果CPU 100%说明硬件到了瓶颈,隧道协议的传输带宽还有提升的空间。如果CPU未达到100%,几乎说明该隧道协议传输带宽已经是最大了。

从测试结果看未使用IPsec加密的L2TP的传输带宽性能最好,超过了WireGuard,但在使用IPsec的L2TP加密后,性能远不如WireGuard,我平时喜欢使用SSTP在RouterOS设备之间建立连接,因为SSTP端口灵活,在RouterOS建立隧道无需证书,但SSTP的传输性能在RouterOS支持的所有隧道协议中性能是最差的,现在v7有了WireGuard就不一样了。

 

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章很值,打赏犒劳作者一下