Loading... # 前言/背景 刚装好系统,就遇到了一个新问题——openEuler社区提供的内核里面**没有编译WireGuard**。一时不知怎么吐槽这件事情,不过来都来了,就顺便解决一下吧。 关于[WireGuard](https://zh.wikipedia.org/wiki/WireGuard)(需要梯子) ## 一点小插曲 把它配在公网上确实是一件不太明智的事情。主要是一直有流量攻击这台机器,尝试爆破它的SSH密码。一觉醒来发现有几万个登录失败,似乎是触发了openEuler自带的fail2ban或类似机制,导致我也登不上这台机器了。 于是赶紧在PVE上给这台VM的网卡下掉(~~爆破脚本?我拔网线咯~~),然后关机了一会才重新连上SSH。不得不感叹就算是测试机也真的不能放松一点,这才装好系统没多久就有人“光顾”了。 # 正文 ## 为什么WireGuard不被包含在openEuler内核中? 装好系统后,从密钥服务器分了一个peer出来,打算给这台机器接上。没想到报错找不到设备,用modprobe一看才发现: ![][1] 是的,这个内核模块压根就找不到。 但是众所周知,WireGuard早就在Linux 5.6时就被合入了内核代码主线: ![][2] 也就是openEuler的内核有一点特殊,官方发行的内核里面并没有编译WireGuard模块?那就先把内核代码拉下来看一下吧: ```sh yum install kernel-devel.x86_64 -y ``` 安装完成后的内核源代码应该在 `/usr/src/kernels` 目录下。cd到内核目录,然后看看WireGuard模块的相关代码是什么情况: ```sh [root@localhost /]# cd /usr/src/kernels/6.6.0-64.0.0.61.oe2403.x86_64/drivers/net/wireguard/ [root@localhost wireguard]# ls -l total 4 -rw-r--r--. 1 root root 483 Dec 11 15:46 Makefile [root@localhost wireguard]# ``` 没想到openEuler直接把整个模块的源代码都做掉了,那就有点难办了。 同时我也注意到官方仓库有这个issue: [wireguard 无法安装](https://gitee.com/openeuler/kernel/issues/I4YT74),看来在openEuler上以正常方式安装WireGuard基本没有指望,那就只能自己动手了。 ## 手动安装WireGuard 幸运的是WireGuard项目有提供从源码编译的方法,[在这里](https://www.wireguard.com/compilation/)。所以我们还是能继续推进。 在前文我说过,openEuler其实是基于红帽系发行版修改而来的,所以跟CentOS、RHEL、Fedora等发行版都非常像,包括包管理器和很多系统管理组件。所以这里我们参考RHEL/CentOS的方法来安装。 安装编译工具链: ``` yum install elfutils-libelf-devel kernel-devel pkgconfig "@Development Tools" -y ``` 安装内核头文件: ``` yum install kernel-devel-$(uname -r) -y yum install kernel-headers-$(uname -r) -y ``` 拉取WireGuard代码仓库: ``` git clone https://git.zx2c4.com/wireguard-linux-compat ``` 如果网络不畅,也可以试一下GitHub上的镜像仓库: https://github.com/WireGuard/wireguard-linux-compat。 然后在开始之前,我们需要先去除WireGuard的头文件中对Linux内核版本的校验。这个头文件在 `wireguard-linux-compat/src/compat/compat.h` 的第37行: ``` #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) #error "WireGuard has been merged into Linux >= 5.6 and therefore this compatibility module is no longer required." #endif ``` 用来警告编译人员不要在Linux 5.6.0及以上单独编译这个模块。事实上也确实如此,对于一般的内核,在Linux 5.6之后确实不需要单独编译它,我前面说过WireGuard在Linux 5.6已经被合并入内核主线。不过我们需要再单独编译它纯粹是因为openEuler社区维护的内核仓库把WireGuard模块和它的源代码都一锅端了。 不过很可惜,也许是这个仓库只维护Linux 3.14-5.6区间的WireGuard内核模块,所以我编译遇到了许多兼容性问题,并没有成功。我们可能只能考虑从头编译整个openEuler Linux内核。 先咕着吧,有空了继续完善... [1]: https://0x.c4a1.net/usr/uploads/2024/12/188738399.png [2]: https://0x.c4a1.net/usr/uploads/2024/12/3570961061.png 最后修改:2025 年 09 月 30 日 © 允许规范转载 赞 如果这对你有用,我乐意之至。