前言/背景
刚装好系统,就遇到了一个新问题——openEuler社区提供的内核里面没有编译WireGuard。一时不知怎么吐槽这件事情,不过来都来了,就顺便解决一下吧。
关于WireGuard(需要梯子)
一点小插曲
把它配在公网上确实是一件不太明智的事情。主要是一直有流量攻击这台机器,尝试爆破它的SSH密码。一觉醒来发现有几万个登录失败,似乎是触发了openEuler自带的fail2ban或类似机制,导致我也登不上这台机器了。
于是赶紧在PVE上给这台VM的网卡下掉(爆破脚本?我拔网线咯),然后关机了一会才重新连上SSH。不得不感叹就算是测试机也真的不能放松一点,这才装好系统没多久就有人“光顾”了。
正文
为什么WireGuard不被包含在openEuler内核中?
装好系统后,从密钥服务器分了一个peer出来,打算给这台机器接上。没想到报错找不到设备,用modprobe一看才发现:

是的,这个内核模块压根就找不到。
但是众所周知,WireGuard早就在Linux 5.6时就被合入了内核代码主线:

也就是openEuler的内核有一点特殊,官方发行的内核里面并没有编译WireGuard模块?那就先把内核代码拉下来看一下吧:
yum install kernel-devel.x86_64 -y安装完成后的内核源代码应该在 /usr/src/kernels 目录下。cd到内核目录,然后看看WireGuard模块的相关代码是什么情况:
[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 无法安装,看来在openEuler上以正常方式安装WireGuard基本没有指望,那就只能自己动手了。
手动安装WireGuard
幸运的是WireGuard项目有提供从源码编译的方法,在这里。所以我们还是能继续推进。
在前文我说过,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内核。
先咕着吧,有空了继续完善...