ラズパイに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 wireguardLOG_CONFS環境変数がセットされていない場合は、Dockerのログに接続設定用のQRコードが出力されているので、それを用いて接続します。
正常に接続できることを確認したらcompose.ymlのLOG_CONFSのコメントアウトを外して、QRコードがログに出力されないようにして一先ずは完了です。
カテゴリ: Raspberry Pi