linuxserver/wireguardを使ってVPN構築する その1

これは何?

初代RPiに構築したOpenVPNサーバを他マシンに移管したい。
が、VPN用に物理マシン1個用意するのもコスト的にしんどい。
ので、仮想マシンに構築したい。
が、リソースもったいないので既にあるLinuxサーバのコンテナとして構築してみたくなった。DockerFileあれば手順メモ代わりにもなって良いし。

linuxserver.io提供Docker image発見

linuxserver.ioがほぼweeklyでメンテしているDocker imageを見つけた。ありがたく使わせていただく。具体的な手順は以下に詳細あるが、もちろん全て英語表記。
https://hub.docker.com/r/linuxserver/wireguard

Docker on macOSでは使えません

まずlatestなdocker imgeをpullした上で以下コマンドを叩き、コンテナ生成した後に、start -aする

$ sudo docker create \
  --name=wireguard \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  -e PUID=1000 -e PGID=1000 \
  -e TZ=Asia/Tokyo \
  -e SERVERPORT=51820 \
  -e PEERS=1 -e PEERDNS=auto \
  -e INTERNAL_SUBNET=10.13.13.0 -p 51820:51820/udp \
  --restart unless-stopped \
  linuxserver/wireguard

$ sudo docker start -a ${CONTAINER_HASH}

と、ここまで実行してドキュメント記載通りならkernel header等ダウンロード開始するはずが、うまくいかない。

理由は...Docker on macOSで実行したから。最初の一文に This image is designed for Ubuntu and Debian based systems とあるにも関わらず。

This image is designed for Ubuntu and Debian based systems mainly (it works on some others, but ymmv). During container start, it will first check if the wireguard module is already installed and loaded. If not, it will then check if the kernel headers are already installed (in /usr/src) and if not, attempt to download the necessary kernel headers from the ubuntu/debian/raspbian repos; then will compile and install the kernel module.

https://github.com/linuxserver/docker-wireguard#application-setup

Ubuntuでも特定のkernelバージョンでは使えません

気を取り直してUbuntu 18.04.4 LTS上でコンテナ生成した後にstart -aすると、今度はちゃんとkernel headerダウンロードとモジュールのビルドが始まる。

が、今度はipv6関連ソースのコンパイルでエラー発生。

**** Building the module ****
make: Entering directory '/app/wireguard-linux-compat/src'
  CC [M]  /app/wireguard-linux-compat/src/main.o
  CC [M]  /app/wireguard-linux-compat/src/noise.o
  CC [M]  /app/wireguard-linux-compat/src/device.o
  CC [M]  /app/wireguard-linux-compat/src/peer.o
  CC [M]  /app/wireguard-linux-compat/src/timers.o
  CC [M]  /app/wireguard-linux-compat/src/queueing.o
  CC [M]  /app/wireguard-linux-compat/src/send.o
  CC [M]  /app/wireguard-linux-compat/src/receive.o
  CC [M]  /app/wireguard-linux-compat/src/socket.o
  CC [M]  /app/wireguard-linux-compat/src/peerlookup.o
  CC [M]  /app/wireguard-linux-compat/src/allowedips.o
  CC [M]  /app/wireguard-linux-compat/src/ratelimiter.o
/app/wireguard-linux-compat/src/socket.c: In function ‘send6’:
/app/wireguard-linux-compat/src/socket.c:139:20: error: ‘const struct ipv6_stub’ has no member named ‘ipv6_dst_lookup_flow’; did you mean ‘ipv6_dst_lookup’?
   dst = ipv6_stub->ipv6_dst_lookup_flow(sock_net(sock), sock, &fl,
                    ^~~~~~~~~~~~~~~~~~~~
                    ipv6_dst_lookup
scripts/Makefile.build:330: recipe for target '/app/wireguard-linux-compat/src/socket.o' failed
make[2]: *** [/app/wireguard-linux-compat/src/socket.o] Error 1
make[2]: *** Waiting for unfinished jobs....
Makefile:1577: recipe for target '_module_/app/wireguard-linux-compat/src' failed
make[1]: *** [_module_/app/wireguard-linux-compat/src] Error 2
Makefile:26: recipe for target 'module' failed
make: *** [module] Error 2
make: Leaving directory '/app/wireguard-linux-compat/src'
make: Entering directory '/app/wireguard-linux-compat/src'
  DEPMOD  4.15.0-96-generic
depmod -b "/" -a 4.15.0-96-generic
depmod: WARNING: could not open //lib/modules/4.15.0-96-generic/modules.order: No such file or directory
depmod: WARNING: could not open //lib/modules/4.15.0-96-generic/modules.builtin: No such file or directory

エラーメッセージを単純にググると、wireguardのビルドで似たような現象に遭遇した人が多数いる模様。その中で、日本語記事は以下のみだった。

Ubuntu 18.04.4 LTS (bionic) でカーネルが linux-image-4.15.0-101-generic から linux-image-4.15.0-106-generic に更新されたところ、 wireguard-dkms でのカーネルモジュールのビルドが失敗して wireguard での接続ができなくなっていたので、 応急処置をして復旧しました。

wireguard が使っているカーネルの機能の一部がバックポートの影響を受けやすいらしく、 同じようなビルドの失敗が繰り返されていて、 不便なことがたまに起きていましたが、 Ubuntu 20.04 からはカーネル本体に wireguard が入っていて、 wireguard-dkms で問題が起きることはないのと、 該当する修正差分の付近のバージョン分岐で 18.04 だけ抜けていたのが追加されたようなので、 今後は大丈夫なのではないかと思っています。

https://blog.n-z.jp/blog/2020-06-10-wireguard-dkms-error.html

自環境で発生したkernel versionはちょっと異なるが、まぁ原因は同じでしょう。かと言って今からUbuntu 20.04以降にアップグレードする気力も時間もないので、取り急ぎは18.04維持したままkernel関連のパッケージを最新にアップグレードして再チャレンジ。

Ubuntu 18.04.4 LTS with kernel 4.15.0-112なら使えます

少なくとも下記組み合わせのバージョンなら使えそう。

$ sudo docker image ls
REPOSITORY                       TAG                  IMAGE ID            CREATED             SIZE
linuxserver/wireguard            latest               0677df8c385b        25 hours ago        446MB
linuxserver/wireguard            v1.0.20200513-ls22   0677df8c385b        25 hours ago        446MB
$ uname -a
Linux espresso 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

こんな風に、それっぽい起動ログが出力された。SERVERURL は以前取得したmydnsの名前でいいかな。wg0.conf は初回起動でwireguardが自動生成してくれる模様。-v 指定でローカルマシン側の適当なディレクトリに生成してもらってヘルプ見ながら設定することになりそう。

$ sudo docker start -a 2986dd1d2141
[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] 01-envfile: executing... 
[cont-init.d] 01-envfile: exited 0.
[cont-init.d] 10-adduser: executing... 

-------------------------------------
          _         ()
         | |  ___   _    __
         | | / __| | |  /  \ 
         | | \__ \ | | | () |
         |_| |___/ |_|  \__/


Brought to you by linuxserver.io
-------------------------------------

To support the app dev(s) visit:
WireGuard: https://www.wireguard.com/donations/

To support LSIO projects visit:
https://www.linuxserver.io/donate/
-------------------------------------
GID/UID
-------------------------------------

User uid:    1000
User gid:    1000
-------------------------------------

[cont-init.d] 10-adduser: exited 0.
[cont-init.d] 30-config: executing... 
**** It seems the wireguard module is already active. Skipping kernel header install and module compilation. ****
**** Server mode is selected ****
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    15  100    15    0     0      9      0  0:00:01  0:00:01 --:--:--     9
**** SERVERURL var is either not set or is set to "auto", setting external IP to auto detected value of ... ****
**** External server port is set to 51820. Make sure that port is properly forwarded to port 51820 inside this container ****
**** Internal subnet is set to 10.13.13.0 ****
**** PEERDNS var is either not set or is set to "auto", setting peer DNS to 10.13.13.1 to use wireguard docker host's DNS. ****
**** No found wg0.conf found (maybe an initial install), generating 1 server and 1 peer/client confs ****
PEER 1 QR code:
[cont-init.d] 30-config: exited 0.
[cont-init.d] 99-custom-scripts: executing... 
[custom-init] no custom files found exiting...
[cont-init.d] 99-custom-scripts: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.13.13.1 dev wg0
[#] ip link set mtu 1420 up dev wg0
.:53
CoreDNS-1.7.0
linux/amd64, go1.14.4, f59c03d
[#] ip -4 route add 10.13.13.2/32 dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

その2へ続く

今日はここまで。次回へ続く。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

Close Bitnami banner
Bitnami