WireGuard トンネルを systemd サービスとして起動する方法
wg-quick@ テンプレートは名前付きプロファイルを起動し、ルート、DNS、フックを設定します。ユニットを確認し、管理者を一つに絞り、停止処理をテストします。
WireGuard プロファイルが /etc/wireguard/wg0.conf にあり、再起動のたびに手で wg-quick up と入力せずに起動したいとします。パッケージ付属の systemd テンプレートはまさにそれを行い、[email protected] が wg0 という名前のプロファイルに対して wg-quick を実行します。アドレス、ルート、DNS、そしてプロファイルが宣言するフックも設定するので、カーネルに鍵を読み込むだけではありません。テンプレートがあると決めつける前に、システム上に実在するか確認してください。
この後の手順は、実際に作業する順番に沿っています。
ユニットと、それが読むプロファイルを探す
systemctl list-unit-files 'wg-quick*' でユニットファイルを一覧します。これをパッケージしているディストリビューションでは [email protected] が見つかり、インスタンス名はプロファイルから取られます。インスタンスは /etc/wireguard/<name>.conf に解決されるので、wg-quick@wg0 が読むのは wg0.conf だけです。一覧が空ならツールパッケージが入っておらず、いくら有効化しても解決しません。
プロファイルはモード 600、所有者 root のままにします。秘密鍵を含んでおり、放っておけばユニットはより緩い権限でも平然と動きます。
起動してジャーナルを読む
systemctl start wg-quick@wg0 でインスタンスを起動し、続いて systemctl status wg-quick@wg0 と journalctl -u wg-quick@wg0 -b を確認します。起動してすぐ終了するユニットはたいていプロファイルの誤りで、ジャーナルがその行を示します。wg show でインターフェースが存在し、最後のハンドシェイクが最近のものだと確認します。wg-quick のマニュアル には、スクリプトがインターフェース以外に何をするかが書かれています。
設定済みのインターフェースでハンドシェイクがないのは、経路か鍵の問題であり、サービスの問題ではありません。
管理者は一つに絞る
NetworkManager などのクライアントがすでにトンネルを所有している場合、systemd ユニットを起動すると同じインターフェース、ルート、DNS に 二人目の所有者ができます。症状は紛らわしく、トンネルは上がるのにルートが消えたり、数秒後に DNS が元に戻ったりします。管理者を一つ選び、そのプロファイルでもう一方を無効にしてください。ユニットが成功を報告した直後に、ジャーナルは通常、乗っ取りをルートやリゾルバの変更として示します。
二人の管理者が所有権を分け合うことはありません。互いに上書きし合います。
停止、再起動、起動をテストする
systemctl stop wg-quick@wg0 を実行し、インターフェースが消えてルートが削除されたことを確認します。停止処理の不具合は起動失敗ではなく残留ルートとして現れるので、次に再度起動してルートが戻ることを確かめます。最後に systemctl enable --now wg-quick@wg0 で起動時に有効化し、一度再起動します。
起動時には、ユニットが動く前にエンドポイント名が解決されている必要があります。DNS がまだ上がっていないとユニットは失敗し、手で起動するまで失敗のままです。
所有者を記録する
ユニットが読むプロファイル、インターフェースを所有する管理者、ファイルの出どころを書き留めます。後で誰かが同じトンネルをデスクトップクライアントに取り込むとき、そのメモが移行と、一つのアドレスを奪い合う 二つの配備とを分けます。似た名前の二つのプロファイルが混乱の定番の原因なので、インターフェース名も記録してください。
所有者が 二人いるトンネルは最初の再起動までは動き、その後は謎になります。だからメモはチャットのスレッドではなくリポジトリに置くべきなのです。