[Technical exchange] 关于UOS V20下的WireGuard安装
Tofloor
poster avatar
浅蓝喜灰
deepin
2026-04-22 09:48
Author

一、背景

有一台联想开天的笔记本,操作系统为UOS V20,内核版本为4.19.0,兆芯amd64。

image.png

现有安装WireGuard的需要,但UOS V20的内核没有并入WireGuard,因此需要进行一下手动安装,整体操作不算复杂,不过我看了一下(UOS)论坛上似乎有人遇到了安装的问题,遂整理了一份安装手册,以供参考。

二、安装流程

大体的安装流程和WireGuard官网的手册一样,差异化部分会着重强调。

2.1 安装前置依赖

执行

$ sudo apt-get install libelf-dev linux-headers-$(uname -r) build-essential pkg-config

2.2 下载源代码

正如前文所述,UOS V20的内核没有并入WireGuard,因此必须自己编译安装。请执行

$ git clone https://git.zx2c4.com/wireguard-linux-compat
$ git clone https://git.zx2c4.com/wireguard-tools

2.3 修改源代码(重点)

官网手册没有包含这一步,还请特别注意。

我们需要修改wireguard-linux-compat/src/compat/compat.h的这几行代码,在82-90行的位置

#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0) && !defined(ISRHEL7)
#define ipv6_dst_lookup(a, b, c, d) ipv6_dst_lookup(b, c, d)
#endif

#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0) && LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 83)
#define ipv6_dst_lookup_flow(a, b, c, d) ipv6_dst_lookup_flow(b, c, d)
#elif (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 5) && LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) || (LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 18) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0) && !defined(ISUBUNTU1904)) || (!defined(ISRHEL8) && !defined(ISDEBIAN) && !defined(ISUBUNTU1804) && LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 119) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)) || (LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 181) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)) || (LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 224) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)) || (LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 224) && !defined(ISUBUNTU1604) && !defined(ISRHEL7))
#define ipv6_dst_lookup_flow(a, b, c, d) ipv6_dst_lookup(a, b, &dst, c) + (void *)0 ?: dst
#endif

将上述代码块除了第二行以外的内容全部注释,仅保留

#define ipv6_dst_lookup(a, b, c, d) ipv6_dst_lookup(b, c, d)

如下图蓝框处进行修改即可

image.png

2.4 编译与安装

经过修改,现在可以正确安装WireGuard了,请执行

$ make -C wireguard-linux-compat/src -j$(nproc)
$ sudo make -C wireguard-linux-compat/src install

将编译wireguard-linux-compat文件夹下的src文件夹里面的源代码并进行安装操作。接着请执行

$ make -C wireguard-tools/src -j$(nproc)
$ sudo make -C wireguard-tools/src install

到这一步,你就已经顺利安装好了WireGuard(前提是一切顺利),写好你的WireGuard配置文件,姑且假设名字是wg0.conf,然后启用它,看看是否一切顺利

$ sudo wg-quick up wg0.conf

三、潜在问题

3.1 不支持操作或接口

如果你在2.4中执行wireguard-linux-compat的编译时出现了问题(选择无视并且直接进行之后的步骤),那么你可能会在最终测试时遇到这样的报错信息

$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
RTNETLINK answers: Operation not supported
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device "wg0"

请检查是否参照2.3正确修改了compat.h文件的代码,然后重新执行一遍2.4的编译安装操作即可。

3.2 ipv6_dst_lookup错误

在执行下列代码时

$ make -C wireguard-linux-compat/src -j$(nproc)

如果遇到错误提示

error: ‘const struct ipv6_stub’ has no member named ‘ipv6_dst_lookup’; did you mean ‘ipv6_dst_lookup_flow’?

说明compat.h没有修改完毕,请重新回顾2.3中的代码修改部分。

Reply Favorite View the author
All Replies
jjcui8595
deepin
2026-04-22 10:20
#1

感谢分享like

Reply View the author
晚秋(lateautumn)
Moderator
2026-04-22 10:37
#2

厉害applaud

Reply View the author
罐子
Moderator
2026-04-22 12:02
#3

组网

Reply View the author
罐子
Moderator
2026-04-22 12:03
#4

tailscale

直接用户态

Reply View the author