WireGuard 是未来伟大的 VPN 吗?

WireGuard 是未来伟大的 VPN 吗?

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

当前 VPN 解决方案的问题在于,它们难以正确配置、维护成本高昂,并且充满了质量有问题的遗留代码。

几年前,加拿大信息安全专家 Jason A. Donenfeld 认为他已经受够了,并开始致力于 WireGuard。 WireGuard 现在正准备纳入 Linux 内核,甚至受到了来自 莱纳斯·托瓦兹美国参议院.

WireGuard 声称相对于其他 VPN 解决方案的优势:

  • 易于使用。
  • 采用现代密码学:Noise协议框架、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF等。
  • 紧凑、可读的代码,更容易调查漏洞。
  • 高性能。
  • 清晰且详尽 规格.

找到银弹了吗? 是时候埋葬 OpenVPN 和 IPSec 了吗? 我决定解决这个问题,同时我也这么做了 自动安装个人VPN服务器的脚本.

工作原理

其工作原理可以这样描述:

  • 创建 WireGuard 接口并为其分配私钥和 IP 地址。 加载其他对等点的设置:它们的公钥、IP 地址等。
  • 所有到达 WireGuard 接口的 IP 数据包都封装在 UDP 中 安全交付 其他同行。
  • 客户端在设置中指定服务器的公共IP地址。 当从客户端接收到经过正确验证的数据时,服务器会自动识别客户端的外部地址。
  • 服务器可以在不中断其工作的情况下更改公共IP地址。 同时,它会向连接的客户端发送警报,他们将动态更新其配置。
  • 使用了路由的概念 加密密钥路由。 WireGuard 根据对等方的公钥接受和发送数据包。 当服务器解密经过正确验证的数据包时,会检查其 src 字段。 如果符合配置 allowed-ips 经过身份验证的对等方,数据包由 WireGuard 接口接收。 发送传出数据包时,会发生相应的过程:获取数据包的 dst 字段,并根据该字段选择相应的对等点,使用其密钥对数据包进行签名,使用对等点的密钥进行加密并将其发送到远程端点。

WireGuard的所有核心逻辑只占用了不到4千行代码,而OpenVPN和IPSec则有数十万行代码。 为了支持现代加密算法,建议在 Linux 内核中包含一个新的加密 API 。 目前正在讨论这是否是一个好主意。

Производительность

最大的性能优势(与 OpenVPN 和 IPSec 相比)在 Linux 系统上将非常明显,因为 WireGuard 是作为内核模块实现的。 此外,还支持 macOS、Android、iOS、FreeBSD 和 OpenBSD,但在这些操作系统中,WireGuard 在用户空间中运行,从而产生所有随之而来的性能后果。 预计在不久的将来会添加 Windows 支持。

基准测试结果 官方网站:

WireGuard 是未来伟大的 VPN 吗?

我的使用体验

我不是 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 [email protected].

在客户端机器上,创建一个配置 /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,这有助于极权国家的居民充分使用互联网。

发现

总而言之,这是一个非常有趣且有前途的项目,您已经可以在个人服务器上使用它。 有什么利润? Linux 系统上的高性能、易于设置和支持、紧凑且可读的代码库。 然而,急于将复杂的基础设施转移到 WireGuard 还为时过早;值得等待将其纳入 Linux 内核。

为了节省我(和你)的时间,我开发了 WireGuard 自动安装程序。 借助它的帮助,您可以为自己和您的朋友设置个人 VPN,甚至无需了解任何内容。

来源: habr.com

添加评论