VPN 不再是大胡子系统管理员的奇特工具的时代已经到来。 用户有不同的任务,但事实是每个人都需要VPN。
当前 VPN 解决方案的问题在于,它们难以正确配置、维护成本高昂,并且充满了质量有问题的遗留代码。
几年前,加拿大信息安全专家 Jason A. Donenfeld 认为他已经受够了,并开始致力于
WireGuard 声称相对于其他 VPN 解决方案的优势:
- 易于使用。
- 采用现代密码学:Noise协议框架、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF等。
- 紧凑、可读的代码,更容易调查漏洞。
- 高性能。
- 清晰且详尽
规格 .
找到银弹了吗? 是时候埋葬 OpenVPN 和 IPSec 了吗? 我决定解决这个问题,同时我也这么做了
工作原理
其工作原理可以这样描述:
- 创建 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 支持。
基准测试结果
我的使用体验
我不是 VPN 专家。 我曾经手动设置过 OpenVPN,非常繁琐,而且我什至没有尝试过 IPSec。 要做的决定太多,很容易搬起石头砸自己的脚。 因此,我总是使用现成的脚本来配置服务器。
因此,从我的角度来看,WireGuard 通常是用户的理想选择。 所有低级决策均在规范中做出,因此准备典型 VPN 基础设施的过程只需几分钟。 在配置上作弊几乎是不可能的。
安装过程
加密密钥由实用程序生成 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 内核。
为了节省我(和你)的时间,我开发了
来源: habr.com