
VPN 不再是大胡子系统管理员的奇特工具的时代已经到来。 用户有不同的任务,但事实是每个人都需要VPN。
当前 VPN 解决方案的问题在于,它们难以正确配置、维护成本高昂,并且充满了质量有问题的遗留代码。
几年前,加拿大信息安全专家 Jason A. Donenfeld 认为他已经受够了,并开始致力于 。 现在 WireGuard 正在准备纳入核心 Linux他甚至还获得了赞扬。 和 .
声称的福利 WireGuard 优于其他 VPN 解决方案:
- 易于使用。
- 采用现代密码学:Noise协议框架、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF等。
- 紧凑、可读的代码,更容易调查漏洞。
- 高性能。
- 清晰且详尽 .
找到灵丹妙药了吗? OpenVPN 是时候放弃IPSec了吗?我决定弄清楚这个问题,同时我也做了一些其他的事情。 .
工作原理
其工作原理可以这样描述:
- 已创建 WireGuard 接口会被分配一个私钥和一个 IP 地址。其他对等方的设置也会被加载,包括它们的公钥、IP 地址等。
- 所有到达的 IP 数据包 WireGuard 该接口封装在UDP协议中, 其他同行。
- 客户端在设置中指定服务器的公共IP地址。 当从客户端接收到经过正确验证的数据时,服务器会自动识别客户端的外部地址。
- 服务器可以在不中断其工作的情况下更改公共IP地址。 同时,它会向连接的客户端发送警报,他们将动态更新其配置。
- 使用了路由的概念 . WireGuard 根据对端的公钥接收和发送数据包。当服务器解密一个经过正确认证的数据包时,会检查其源字段。如果源字段与配置匹配,
allowed-ips如果对等方已认证,则该数据包将被接口接受。 WireGuard发送外发数据包时,会执行以下步骤:首先获取数据包的 dst 字段,并据此选择对应的对等节点。然后,使用数据包自身的密钥对其进行签名,再使用对等节点的密钥对其进行加密,最后将数据包发送到远程端点。
所有基本逻辑 WireGuard 只需不到 4 行代码,而 OpenVPN IPSec 拥有数十万行代码。为了支持现代加密算法,建议将它们集成到内核中。 Linux 新的加密 API 。 目前正在讨论这是否是一个好主意。
Производительность
最大性能优势(与……相比) OpenVPN 和 IPSec)将会很明显 Linux 系统,因为那里 WireGuard 它以内核模块的形式实现。此外,它还支持 macOS, AndroidiOS、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 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,这有助于极权国家的居民充分利用互联网。
发现
总而言之,这是一个非常有趣且前景广阔的项目;您现在就可以在个人服务器上使用它。它的优势是什么?高性能。 Linux 系统、易于设置和支持、代码库简洁易读。然而,仓促地将复杂的基础设施迁移到 WireGuard 现在还为时尚早,值得等待将其纳入核心代码。 Linux.
为了节省我(和你)的时间,我开发了 。 借助它的帮助,您可以为自己和您的朋友设置个人 VPN,甚至无需了解任何内容。
来源: habr.com
