当尝试在 Docker 容器中或 WSL2 本身上运行 Wireguard 客户端时,您将遇到以下问题:
2022-04-27 17:15:45,035 DEBG 'start-script' stderr output:
[#] ip -4 rule add table main suppress_prefixlength 0
2022-04-27 17:15:45,036 DEBG 'start-script' stderr output:
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
2022-04-27 17:15:45,036 DEBG 'start-script' stderr output:
[#] iptables-restore -n
2022-04-27 17:15:45,247 DEBG 'start-script' stderr output:
iptables-restore v1.8.7 (legacy): unknown option "--save-mark"
Error occurred at line: 5
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
2022-04-27 17:15:45,247 DEBG 'start-script' stderr output:
[#] resolvconf -d wg0 -f
2022-04-27 17:15:45,251 DEBG 'start-script' stderr output:
could not detect a useable init system
2022-04-27 17:15:45,267 DEBG 'start-script' stderr output:
[#] ip -4 rule delete table 51820
2022-04-27 17:15:45,270 DEBG 'start-script' stderr output:
[#] ip -4 rule delete table main suppress_prefixlength 0
2022-04-27 17:15:45,283 DEBG 'start-script' stderr output:
[#] ip link delete dev wg0
2022-04-27 17:15:45,456 DEBG 'start-script' stdout output:
[warn] WireGuard interface failed to come 'up', exit code is '1'
或者你看到这个
sh-5.1# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.130.27 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n
iptables-restore v1.8.7 (legacy): unknown option "--save-mark"
Error occurred at line: 5
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg0
sh-5.1#
这是相同的错误消息,但范围缩小了。
答案1
罪魁祸首是 WSL2 内核未使用必要的 netfilter 目标或 iptables 或 nftables 工作匹配进行编译。
您可以通过运行以下命令来验证这一点:
$ iptables -C INPUT -m connmark --mark 0x10/0x10 -j DROP
iptables v1.8.4 (legacy): Couldn't load match `connmark':No such file or directory
我的 WSL 安装附带的 Linux 内核没有该CONFIG_NETFILTER_XT_MATCH_CONNMARK
标志。
首先你需要获取微软使用的内核源代码。你可以使用以下命令从他们的 github 页面获取它:
git clone --depth 1 https://github.com/microsoft/WSL2-Linux-Kernel.git
使用以下命令复制当前内核配置:
zcat /proc/config.gz > .config
使用 sed 进行搜索和替换
sed -i 's/# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set/CONFIG_NETFILTER_XT_MATCH_CONNMARK=y/g' .config
现在您可以在启用正确标志的情况下编译内核。使用:
yes "" | make -j $(nproc)
yes ""
当您按 Enter 键并填写未指定配置的默认值时,它将起作用。
$(nproc)
是你的CPU可以处理的线程数。
接下来你必须将新编译的内核映像复制到Windows端。您可以使用以下命令复制它:
cp arch/x86_64/boot/bzImage /mnt/c/Users/<user>/bzImage
通过添加配置文件告诉 WSL 使用新内核:
文件夹中/mnt/c/Users/<user>/
或C:\Users\<user>\
应该有一个.wslconfig
包含以下内容的文件:
[wsl2]
kernel=C:\\Users\\<user>\\bzImage
关闭 WSL 并通过提示将其关闭cmd
:
wsl --shutdown
然后使用 启动 wsl wsl
。您uname -r
可以看到您现在正在使用新的内核。
现在,上述错误应该消失了,希望您的 Wireguard 客户端能够正常工作。