公众号旧文
原来 Linux 内核早就自带 WireGuard 了!
很多人第一次接触 WireGuard,会下意识认为它和普通软件一样,需要先安装 WireGuard,然后才能使用。
但实际上,从Linux 5.6开始,WireGuard 已经正式进入 Linux 主线内核。
这意味着,对于很多现代 Linux 发行版来说,WireGuard 已经不是一个额外安装的第三方内核模块,而是 Linux 内核本身就具备的网络能力。
WireGuard 是什么时候进入 Linux 内核的?
WireGuard 最早在 2015 年前后公开出现,由 Jason A. Donenfeld 开发。
经过多年发展之后,WireGuard 在 2020 年正式进入 Linux 5.6 主线内核。
从这一刻开始,WireGuard 的身份发生了一个很重要的变化。
当然,这里说的是“内核能力”。
你通常仍然需要安装 wireguard-tools,才能获得用户态管理命令。
但它们只是配置工具,不等于 WireGuard 内核驱动本身。
如何判断 Linux 是否真的支持 WireGuard?
很多人会先看:
modinfo wireguard
或者:
modprobe wireguard
如果成功,通常说明系统存在 WireGuard 内核模块。
例如:
filename: /lib/modules/5.10.0-39-cloud-amd64/kernel/drivers/net/wireguard/wireguard.ko
description: WireGuard secure network tunnel
intree: Y
其中最值得注意的是:
intree: Y
它表示这个 WireGuard 模块属于当前 Linux 内核树的一部分,而不是后来通过 DKMS 等方式额外安装进去的第三方模块。
但是,仅仅看 modinfo 还不够。
最直接的验证方式其实是:
ip link add dev wgtest type wireguard
然后:
ip link show wgtest
如果成功看到类似:
wgtest: mtu 1420
就说明当前内核真的能够创建 WireGuard 网络接口。
测试完可以删除:
ip link del wgtest
相比单纯检查内核版本,这种方式更加可靠。
因为有些 VPS 厂商会裁剪内核模块,而某些旧内核又可能通过 backport 提前获得 WireGuard 支持。
所以最靠谱的问题不是:这台机器是不是 Linux 5.6 以上?
而是:这台机器能不能真的创建 type wireguard 的网络接口?
我实际测试了一批 VPS
我手里有一批不同厂商、不同地区的 Linux VPS,于是做了一个批量测试。
测试范围包括:
- Debian 11 / Linux 5.10
- Debian 12 / Linux 6.1
- Debian 13 / Linux 6.12
- KVM VPS
- Google Cloud
- LXC VPS
最终结果是:
TOTAL: 14
SUPPORTED: 14
UNSUPPORTED: 0
也就是说,这 14 台机器全部可以实际创建 WireGuard 网络接口。
其中绝大多数都是这种情况:
WG CLASS: native in-tree kernel module
RESULT: SUPPORTED
说明 WireGuard 本身就在虚拟机自己的 Linux 内核里。
LXC 是一个很有意思的例外
测试过程中,有一台 VPS 表现得比较奇怪。
LXC 和 KVM 最大的区别之一,就是:
LXC 容器并没有自己的 Linux 内核,而是共享宿主机内核。
但只要宿主机已经加载 WireGuard,而且允许容器使用对应网络能力,那么容器一样可以创建 WireGuard 接口。
这也说明一个问题:
能不能用 WireGuard 和 WireGuard 模块是不是安装在当前文件系统里并不是完全等价的。
为什么 Linux 把 WireGuard 放进主线内核?
传统技术往往比较复杂。
例如 IPsec 涉及大量协议、算法组合和配置项。
Open 则主要工作在用户态。
WireGuard 的设计思路则更加简洁:
WireGuard 代码规模相对小,设计也非常克制。
它主要使用:
- Curve25519
- ChaCha20
- Poly1305
- BLAKE2s
而且不像很多传统软件那样提供大量可选算法。
这种设计带来的好处就是:
- 配置简单
- 攻击面较小
- 性能高
- 更容易审计
- 更适合进入 Linux 内核
所以 Linux 5.6 把 WireGuard 合入主线,其实是一个很重要的节点。
WireGuard 已经越来越像 Linux 的基础网络能力
今天再看 WireGuard,它已经不太像一个额外安装的软件。
它更像 Linux 已经内置的一种虚拟网络接口类型。
底层最重要的 WireGuard 内核能力,本来就已经在那里。
一个更准确的说法
所以以后如果有人问:Linux 默认带 WireGuard 吗?
更准确的回答应该是:
从 Linux 5.6 开始,WireGuard 已经进入 Linux 主线内核。现代发行版普遍具备原生 WireGuard 支持,但实际是否可用,仍然取决于发行版内核配置、云厂商裁剪方式以及虚拟化环境。
从这个角度看,WireGuard 已经从一个软件,逐渐变成了 Linux 网络栈里相当基础的一部分。