公众号旧文

原来 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 网络栈里相当基础的一部分。