🦊

docker composeで作るVPN (WireGuard)

2025/02/20に公開

はじめに

出先で自宅鯖へアクセスしたいことがあり、docker compose + WireGuardで簡易的にVPNを構築。
やり方よく忘れるので忘備録として。

システム構成

  • サーバー
  • クライアント
    • WireGuardクライアントアプリを入れた任意の端末

ディレクトリ構成

compose.ymlに必要な設定をし、 docker compose up するとconfigディレクトリが自動生成される。

.
├── compose.yml ...................... # 事前に作成
└── config ........................... # 自動生成
    ├── coredns
    │   └── Corefile
    ├── peer_AAAAA ................... # Peer(接続先)名
    │   ├── peer_AAAAA.conf .......... # WireGuardクライアント用設定ファイル
    │   ├── peer_AAAAA.png ........... # WireGuardクライアント用設定(QRコード)
    │   ├── presharedkey-peer_AAAAA
    │   ├── privatekey-peer_AAAAA
    │   └── publickey-peer_AAAAA
    ├── peer_BBBBB ................... # Peer(接続先)名
    │   ├── peer_BBBBB.conf
    │   ├── peer_BBBBB.png
    │   ├── ...
    ├── server
    │   ├── privatekey-server
    │   └── publickey-server
    ├── templates
    │   ├── peer.conf
    │   └── server.conf
    └── wg_confs
        └── wg0.conf

構築方法

  • compose.yml定義
  • compose起動
  • クライアントアプリの設定

compose.yml定義

services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - TZ=Asia/Tokyo
      - SERVERURL=example.org  # WireGuardサーバのグローバルIP/ホスト名
      - SERVERPORT=51820  # WireGuardサーバの待受ポート
      - PEERS=AAAAA,BBBBB  # Peer名 (それぞれ鍵が発行される)
      - PEERDNS=192.168.0.2  # [省略可]: クライアントに割り当てるDNS (アドレスは自宅鯖のDNS)
    volumes:
      - ./config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped


他パラメータはこちらを参照。
https://github.com/linuxserver/docker-wireguard?tab=readme-ov-file#parameters

compose起動

docker compose up -d

起動するとconfigディレクトリが自動生成される。
(再起動時は作成済みのconfigディレクトリと設定ファイルをそのまま使用する)

└── config ........................... # 自動生成
    ├── coredns
    │   └── Corefile
    ├── peer_AAAAA ................... # Peer(接続先)名
    │   ├── peer_AAAAA.conf .......... # WireGuardクライアント用設定ファイル
    │   ├── peer_AAAAA.png ........... # WireGuardクライアント用設定(QRコード)
    │   ├── presharedkey-peer_AAAAA
    │   ├── privatekey-peer_AAAAA
    │   └── publickey-peer_AAAAA
    ├── peer_BBBBB ................... # Peer(接続先)名
    │   ├── peer_BBBBB.conf
    │   ├── peer_BBBBB.png
    │   ├── presharedkey-peer_BBBBB
    │   ├── privatekey-peer_BBBBB
    │   └── publickey-peer_BBBBB
    ├── server
    │   ├── privatekey-server
    │   └── publickey-server
    ├── templates
    │   ├── peer.conf
    │   └── server.conf
    └── wg_confs
        └── wg0.conf

クライアントアプリの設定

※Pear (AAAAA)の例で説明

├── peer_AAAAA ................... # Peer(接続先)名
│   ├── peer_AAAAA.conf .......... # WireGuardクライアント用設定ファイル
│   ├── peer_AAAAA.png ........... # WireGuardクライアント用設定(QRコード)

いずれかでクライアントアプリの接続設定をする

  • peer_AAAAA.confをクライアントアプリで読み込む
  • peer_AAAAA.pngのQRコードをクライアントアプリで読み込む

Discussion