WireGuard是未来的绝佳VPN吗?


现在已经到了VPN不再是有胡子的系统管理员的某种奇特工具的时候了。 用户有不同的任务,但事实是每个人都需要VPN。


当前VPN解决方案的问题在于它们难以正确配置,维护成本高昂,并且还具有许多质量可疑的旧代码。


几年前,加拿大信息安全专家Jason A. Donenfeld决定必须忍受这一点,并开始从事WireGuard的研究 。 现在,WireGuard正在准备将其包含在Linux内核中;它甚至得到了Linus Torvalds美国参议院的赞誉。


与其他VPN解决方案相比,WireGuard具有明显的优势:


  • 易于使用。
  • 使用现代加密技术:Noise协议框架,Curve25519,ChaCha20,Poly1305,BLAKE2,SipHash24,HKDF等
  • 简洁易读的代码,更容易调查漏洞。
  • 高性能
  • 清晰详细的规范

找到银子弹了吗? 是时候深入研究OpenVPN和IPSec了吗? 我决定处理这个问题,与此同时,我制作了一个脚本来自动安装个人VPN服务器


工作原理


操作原理可以描述如下:


  • 将创建一个WireGuard接口,并为其分配一个私钥和IP地址。 已加载其他对等方的设置:其公共密钥,IP地址等。
  • 所有到达WireGuard接口的IP数据包都封装在UDP中,并安全地传递给其他对等方。
  • 客户端在设置中设置服务器的公共IP地址。 当正确的身份验证数据来自客户端时,服务器会自动识别客户端的外部地址。
  • 服务器可以更改公共IP地址,而不会中断工作。 同时,他将向连接的客户端发送警报,并且客户端将即时更新其配置。
  • 使用Cryptokey路由概念。 WireGuard根据对等方的公钥接收和发送数据包。 当服务器解密正确身份验证的数据包时,将检查其src字段。 如果它与已验证allowed-ipsallowed-ips匹配,则该数据包将由WireGuard接口接收。 发送外发数据包时,会发生相应的过程:获取数据包的dst字段,并根据该字段选择相应的对等方,并使用自己的密钥对数据包进行签名,并使用对等密钥进行加密,然后将其发送到远程端点。

WireGuard的所有核心逻辑仅占用不到4000行代码,而OpenVPN和IPSec则拥有数十万行代码。 为了支持现代密码算法,建议在Linux内核中包括新的Zinc密码API。 目前,正在讨论这个想法有多好。


性能表现


在Linux系统上,最大的性能优势(与OpenVPN和IPSec相比)是显而易见的,因为WireGuard是作为内核模块实现的。 此外,还支持macOS,Android,iOS,FreeBSD和OpenBSD,但WireGuard在用户空间上运行,从而影响所有性能。 Windows承诺在不久的将来会增加支持。


官方网站的基准测试结果:



我的使用经验


我不是VPN设置专家。 一旦我为OpenVPN配置了句柄,它就很沉闷,但是IPSec甚至没有尝试。 需要做出太多决定;将自己踢到脚上非常容易。 因此,我总是使用现成的脚本来配置服务器。


因此,从我的角度来看,WireGuard通常是用户的理想选择。 所有低级决策都是在规范中做出的,因此准备典型的VPN基础架构的过程仅需几分钟。 几乎不可能在配置中累积。


安装过程在官方网站上有详细描述 ,我想提到对OpenWRT的出色支持


加密密钥由wg实用程序生成:


 SERVER_PRIVKEY=$( wg genkey ) SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey ) CLIENT_PRIVKEY=$( wg genkey ) CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey ) 

接下来,您需要使用以下内容创建服务器配置/etc/wireguard/wg0.conf


 [Interface] Address = 10.9.0.1/24 PrivateKey = $SERVER_PRIVKEY [Peer] PublicKey = $CLIENT_PUBKEY AllowedIPs = 10.9.0.2/32 

并使用wg-quick脚本提升隧道:


 sudo wg-quick up /etc/wireguard/wg0.conf 

在具有systemd的系统上,可以sudo systemctl start wg-quick@wg0.service使用sudo systemctl start wg-quick@wg0.service


在客户端计算机上,创建/etc/wireguard/wg0.conf配置:


 [Interface] PrivateKey = $CLIENT_PRIVKEY Address = 10.9.0.2/24 [Peer] PublicKey = $SERVER_PUBKEY AllowedIPs = 0.0.0.0/0 Endpoint = 1.2.3.4:51820 #  IP  PersistentKeepalive = 25 

并以相同的方式提升隧道:


 sudo wg-quick up /etc/wireguard/wg0.conf 

仍然需要在服务器上配置NAT,以便客户端可以访问Internet,您就完成了!


由于拒绝了密钥分发功能,因此实现了代码库的这种易用性和紧凑性。 没有复杂的证书系统,也没有所有这些公司恐怖现象;短加密密钥的分布大致类似于SSH密钥。 但是在这方面,出现了一个问题:WireGuard在某些现有网络中将不太容易实现。


在这些缺点中,值得注意的是,WireGuard无法通过HTTP代理工作,因为只有UDP协议作为传输方式。 问题是,是否有可能混淆协议? 当然,这不是直接的VPN任务,但是对于OpenVPN,例如,有一些伪装成HTTPS的方法,可以帮助极权国家的居民充分利用Internet。


结论


总结起来,这是一个非常有趣且很有前途的项目,您现在可以在个人服务器上使用它。 什么是利润? Linux系统上的高性能,易于设置和支持,紧凑且易读的代码库。 但是,现在急于将复杂的基础结构转移到WireGuard还为时过早,值得等待将其包含在Linux内核中。


为了节省我(和您)的时间,我开发了WireGuard自动安装程序 。 有了它,您甚至可以不了解任何内容即可为自己和您的朋友创建一个个人VPN。

Source: https://habr.com/ru/post/zh-CN432686/


All Articles