WSL2를 사용하여 Win10에서 Wireguard를 클라이언트로 실행

WSL2를 사용하여 Win10에서 Wireguard를 클라이언트로 실행

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

감사의 말https://www.reddit.com/r/bashonubuntuonwindows/comments/jk4x24/is_there_a_way_to_run_wireguard_within_wsl2/gah860j/

원인은 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플래그가 없었습니다.

먼저 Microsoft에서 사용하는 커널 소스 코드를 가져와야 합니다. 다음 명령을 사용하여 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

그런 다음 start wsl 을 사용하십시오 wsl. uname -r이제 새로운 커널을 사용하고 있음을 알 수 있습니다 .

이제 위의 오류는 사라져야 하며 Wireguard 클라이언트가 제대로 작동하기를 바랍니다.

관련 정보