雑記帳

整理しない情報集

更新情報

ラズパイにWireGuardでVPNを構築する

公開日:

カテゴリ: Raspberry Pi

ラズパイにWireGuardを構築してみました。今回はDockerを使用して構築します。

Dockerイメージの取得

公式ではDockerイメージは準備されていないので、自力でビルドするか公開イメージを使う必要があります。

今回はLinuxServer.ioが管理しているDockerイメージを使います。

compose.ymlファイルの作成

基本的にGitHubのリポジトリページに書かれている通りに作成すれば問題ありません。なるべく最小限の記述になるように意識しています。

services:
  wireguard:
    image: linuxserver/wireguard
    restart: unless-stopped
    environment:
      PUID: "1000"
      PGID: "1000"
      TZ: "Asia/Tokyo"
      SERVERURL: "グローバルIP"
      PEERS: "接続する端末数"
#      LOG_CONFS: false
    volumes:
      - ./config:/config
    cap_add:
      - NET_ADMIN
    ports:
      - 51820:51820/udp

以下、特筆すべき設定項目です。

環境変数: PEERS

PEERS環境変数がセットされている場合はサーバモード、セットされていない場合はクライアントモードとして動作します。

今回はサーバとして動作させるため、必ずPEERSのセットが必要です。PEERSには接続する端末の数、もしくは接続端末名をカンマ区切りでセットします。ここにセットした数だけ接続設定(鍵など)が自動で生成されます。

# 数値で設定する例
PEERS: "3"
# 接続名で設定する例
PEERS: "desktop,phone1,phone2"

環境変数: LOG_CONFS

LOG_CONFS環境変数がtrueの場合、Dockerのログに接続用のQRコードが出力されます。初回接続時は便利ですが以降は邪魔なので、初回接続完了時にコメントアウトを外します。この環境変数がセットされていない場合はtrueとみなされます。

ボリュームのマウント

コンテナを再生成するたびに接続設定が変わっては困るため、設定ファイルの書き出し先をマウントします。コンテナ側の設定ファイルの保存パスは/configとなっています。

モジュール

ホスト側のWireGuardモジュールがロードされていない場合に、ロードを行う機能があります。Raspberry Pi OSでは初期状態でロードされているようなので基本的には不要です。ロードされていない環境ではロードするように設定するか、以下の記述を追記します。

cap_add:
  - SYS_MODULE
volumes:
  - /lib/modules:/lib/modules

ちなみにWireGuardはLinuxカーネル5.6から取り込まれており、以降は別途カーネルモジュールをインストールする必要はなくなりました(debian系ではbullseye以降)。

その他

  • sysctlsはサーバモードでは不要です

起動・接続

docker compose up -d

コンテナを立ち上げます。

docker logs wireguard

LOG_CONFS環境変数がセットされていない場合は、Dockerのログに接続設定用のQRコードが出力されているので、それを用いて接続します。

正常に接続できることを確認したらcompose.ymlLOG_CONFSのコメントアウトを外して、QRコードがログに出力されないようにして一先ずは完了です。

カテゴリ: Raspberry Pi