📌

WireGuard設定の永続化

2023/01/21に公開

はじめに

以前、以下の記事でWireGuardの設定方法を紹介しました。
但し、前回の設定だけでは、OSを再起動した際に設定が消えてしまうため、再度設定し直す必要が出てきます。
今回は、OS再起動を行った後でも設定が残るようにするにはどうしたらいいかを書いていこうと思います。

https://zenn.dev/motisan/articles/20221230_wireguard

OS再起動した場合

前回の記事の設定のみ行なってOSを再起動した後にどのような状態かを確認します。

### wgコマンド実行
$ wg

### wg0のNICがあるか確認
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.244/24 brd 192.168.1.255 scope global dynamic eth0
       valid_lft 3436sec preferred_lft 3436sec
    inet6 fe80::817:4dff:fe5f:1e69/64 scope link 
       valid_lft forever preferred_lft forever

上記の通り、NICの設定もなくなっていますし、wgコマンドを実行しても何も返ってきません。

設定を永続化するために必要なこと

設定を永続化して、かつOS起動時に自動でWireGuardが利用できるようにするには、以下のことが必要になります。

  1. wg0の設定ファイル作成
  2. OS起動時にwg0を起動させる設定

wg0の設定ファイル作成

まずは、wg0の設定ファイルを作成します。
前回と同じコマンドを実行して、WireGuardとNICの設定を行なっておきます。
現在の設定は以下のような感じです。

$ sudo wg show
interface: wg0
  public key: AAAAAAAA
  private key: (hidden)
  listening port: 44455

peer: BBBBBBBB
  endpoint: 43.207.47.224:55544
  allowed ips: 172.16.12.2/32
  persistent keepalive: every 25 seconds

$ sudo wg showconf wg0
[Interface]
ListenPort = 44455
PrivateKey = AAAAAAAA

[Peer]
PublicKey = BBBBBBBB
AllowedIPs = 172.16.12.2/32
Endpoint = 43.207.47.224:55544
PersistentKeepalive = 25

wg0の設定ファイルの作成は簡単で、wg showconfの結果を、ファイルに保存するだけです

$ cd /etc/wireguard/ # rootで実行
$ wg showconf wg0 > wg0.conf # rootで実行

注意点としては以下です。

  1. 設定ファイルは、/etc/wireguard/配下 に作成すること
  2. ファイル名は 'NIC名'.conf とすること

設定ファイルを作成したら、NICに割り当てるIPアドレスを設定ファイルに書き込みます。

wg0.conf
@@ -1,6 +1,7 @@
 [Interface]
 ListenPort = 44455
 PrivateKey = AAAAAAAA
+Address = 172.16.12.1/32
 
 [Peer]
 PublicKey = BBBBBBBB

以上で、設定ファイルの作成は完了です。

起動時にwg0を起動させる設定

wg0を起動させるコマンドとして、wg-quick があります。
wg-quickコマンドを実行すると、先ほど作成した設定ファイルを自動で読み込んで、NICの作成まで行ってくれます。
 wg-quick up NIC名 NICを起動
 wg-quick down NIC名 NICを停止

$ wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 172.16.12.1/32 dev wg0
[#] ip link set mtu 8921 up dev wg0
[#] ip -4 route add 172.16.12.2/32 dev wg0

$ ip a
・・・・
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8921 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 172.16.12.1/32 scope global wg0
       valid_lft forever preferred_lft forever

設定ファイルから、NICを起動させることができました。

ちなみに、設定ファイル名を誤っている場合、以下のようにエラーとなります。

$ wg-quick up wg0
wg-quick: `/etc/wireguard/wg0.conf' does not exist

上記コマンドは、あくまで作成した設定ファイルから、自動で設定を読み込んでNICを起動させるだけです。

ここから、OS起動時に自動で設定ファイルが読み込まれるようにしたいと思います。
systemctlコマンドで wg-quick@wg0 の自動起動を設定します。

### 初期状態 ###
$ sudo systemctl status wg-quick@wg0
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
   Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:wg-quick(8)
           man:wg(8)
           https://www.wireguard.com/
           https://www.wireguard.com/quickstart/
           https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
           https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
$ sudo systemctl is-enabled wg-quick@wg0
disabled

### 自動起動設定 ###
$ sudo systemctl enable wg-quick@wg0
Created symlink from /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service to /usr/lib/systemd/system/wg-quick@.service.
$ sudo systemctl is-enabled wg-quick@wg0
enabled

上記で自動起動設定ができましたので、OSの再起動をしてみます。

### OS再起動後 ###
$ sudo systemctl status wg-quick@wg0
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
   Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; enabled; vendor preset: disabled)
   Active: active (exited) since Fri 2023-01-20 15:22:45 UTC; 52s ago
     Docs: man:wg-quick(8)
           man:wg(8)
           https://www.wireguard.com/
           https://www.wireguard.com/quickstart/
           https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
           https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
  Process: 3086 ExecStart=/usr/bin/wg-quick up %i (code=exited, status=0/SUCCESS)
 Main PID: 3086 (code=exited, status=0/SUCCESS)

Jan 20 15:22:44 ip-192-168-1-244.ap-northeast-1.compute.internal systemd[1]: Starting WireGuard via wg-quick(8) for wg0...
Jan 20 15:22:44 ip-192-168-1-244.ap-northeast-1.compute.internal wg-quick[3086]: [#] ip link add wg0 type wireguard
Jan 20 15:22:45 ip-192-168-1-244.ap-northeast-1.compute.internal wg-quick[3086]: [#] wg setconf wg0 /dev/fd/63
Jan 20 15:22:45 ip-192-168-1-244.ap-northeast-1.compute.internal wg-quick[3086]: [#] ip -4 address add 172.16.12.1/32 dev wg0
Jan 20 15:22:45 ip-192-168-1-244.ap-northeast-1.compute.internal wg-quick[3086]: [#] ip link set mtu 8921 up dev wg0
Jan 20 15:22:45 ip-192-168-1-244.ap-northeast-1.compute.internal wg-quick[3086]: [#] ip -4 route add 172.16.12.2/32 dev wg0
Jan 20 15:22:45 ip-192-168-1-244.ap-northeast-1.compute.internal systemd[1]: Started WireGuard via wg-quick(8) for wg0.

$ ip a
・・・
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8921 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 172.16.12.1/32 scope global wg0
       valid_lft forever preferred_lft forever

WireGuardのNICであるwg0が設定されていることが確認できました。

WireGuard を本格的に利用する上での補足

WireGuardを利用する上で、もう一つだけ重要な点があるので補足しておきたいと思います。
WireGuardを利用してVPN接続を行なっても、通信が取れるのはWireGuardで設定しているIPアドレス間のみ(今回でいうと172.16.12.0/24)になります。
クライアントから、その先のサーバにアクセスさせたい場合は、WireGuardのサーバにてフォワード設定が必要になります。設定でいうと以下です。

$ sysctl net.ipv4.ip_forward=1 # rootで実行

他のサイトでも記事はいくつか出ているのでこの辺りは詳しく触れませんが、そういった設定が必要である点は留意ください。

おわりに

一旦、WireGuardの記事はこれでおわりにしたいと思います。
当初はLPICの勉強がてら始めたことでしたが、思ったより奥が深かったです。
自社で使うことはないでしょうが、知識として覚えておこうと思います。

Discussion