Docker で Wireguard server (準備編)

Wireguard VPN サーバを Docker コンテナで構築します。このページでは、サーバーモードの起動手順をご紹介します。

docker-compose.yml

linuxserver/wireguard (docker.com)
こちらのイメージと docker-compose.yml サンプルを使用します。上記ページに掲載されている下記サンプルを修正して使います。

version: "2.1"
services:
  wireguard:
    image: ghcr.io/linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
      - SERVERURL=wireguard.domain.com #optional
      - SERVERPORT=51820 #optional
      - PEERS=1 #optional
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.13.13.0 #optional
      - ALLOWEDIPS=0.0.0.0/0 #optional
    volumes:
      - /path/to/appdata/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

ほとんど変更する必要はありませんが、ほぼ書き換え必須の箇所と、必要に応じて書き換える箇所があります。

変更する箇所

まず、ほぼ必須で変更する項目です。

  • – TZ=Europe/London
  • – SERVERURL=wireguard.domain.com #optional
  • – PEERS=1 #optional
  • sysctls:
    – net.ipv4.conf.all.src_valid_mark=1

– TZ=Asia/Tokyo
タイムゾーンを東京に変更しときます。VPN を利用するだけなら、変更しなくても多分問題はないです。サーバーログに残る日時を合わせるだけではないかと。

– SERVERURL=ohyou.hopto.org
このサイトのドメイン名を例に変更しました。これから構築しようとしている Wireguard サーバーのアドレスを指定する部分です。VPN サービスを利用したい端末(スマホとか)が、インターネット越しにどこに接続するかを示します。つまり、自宅にサーバーを置くなら、自宅の IP アドレスを指します。
Global IP アドレスか、DDNS サービスを利用している場合はドメイン名を書きます。
プロバイダから固定の Global IP アドレスを割り当てられている場合はそのアドレスを直書きしても構いませんが、モデムやルーターの電源を落とすと Global IP アドレスが変更され、IP アドレスは不定の場合が多いと思います。その場合は、DDNS サービスを利用してドメイン名を 取得しておくと良いです。ルーターメーカーが無料で DDNS サービスを提供していたりします。取得したドメイン名をここに書きます。

– PEERS=10
Wireguard VPN 接続を利用する端末の数を書きます。あとで端末が増えても良いように、多めにしておけば良いでしょう。ここでの設定の数だけ端末用の鍵や QRコードが生成されます。

sysctls:
– net.ipv4.conf.all.src_valid_mark=1

この部分は全部消します。ここは、クライアントモードで利用するときに必要な箇所です。今回はサーバーモードで起動しますので、丸ごと不要です。

環境次第で変更する箇所

  • – SERVERPORT=51820 #optional
  • volumes:
    – /path/to/appdata/config:/config
  • ports:
    – 51820:51820/udp

– SERVERPORT=55555
ホストマシン外部からアクセスするポートの設定です。51820 では都合が悪ければ変更します。例として、55555 にします。ここを変更した場合は、あとで説明する ports の部分も書き換える必要があります。

volumes:
– /path/to/appdata/config:/config

コロン ( : ) より左の /path/to/appdata/config は、ホストマシンのディレクトリです。右の /config は、コンテナ内でのディレクトリです。ここに置かれた設定ファイルや鍵情報、QRコードなどが、ホストマシンの /path/to/appdata/config に置かれます。
事情があれば左の /path/to/appdata/config を変更します。今回の例では変更しません。右の /config は、変更してはいけません。

ports:
– 55555:51820/udp

左右の数字は、外部ポート:コンテナ内ポート を表しています。
“- SERVERPORT=51820” を変更する場合は、ここもセットで変更します。ホストマシンで使用するポート、言い換えると外部公開するポートを 51820 から変更する場合は、左の 51820 を書き換えます。右の 51820/udp は、変更してはいけません。

修正例

version: "2.1"
services:
  wireguard:
    image: ghcr.io/linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
      - SERVERURL=ohyou.hopto.org
      - SERVERPORT=55555
      - PEERS=10
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.13.13.0 #optional
      - ALLOWEDIPS=0.0.0.0/0 #optional
    volumes:
      - /path/to/appdata/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 55555:51820/udp
    restart: unless-stopped

TZ, SERVERURL, SEVERPORT, PEERS, ports を修正してみました。sysctls は消しています。あとは、

docker-compose up -d

これを実行すれば wireguard コンテナが起動し、指定の場所(上記例では、/path/to/appdata/config)に VPN 通信用の設定ファイルが出力されます。

ルーターのポート転送

インターネットから ohyou.hopto.org:55555 に届いた通信がホストマシンに届くよう、ルーターのポート転送規則を設定します。Wireguard コンテナを起動させているホストマシンのローカル IP アドレス (192.168.~.~ とか)に、SERVERPORT 55555 の UDP を転送します。パブリックポートとプライベートポートは、どちらも 55555 にします。コンテナで動作している wireguard は 51820 を待っていますが、55555 から 51820 への変換は Docker がやってくれますので、ルーターの転送規則はパブリック 55555 をそのままプライベート 55555 に転送します。

VPN 利用端末側の設定

長くなったので、続きはまた別でご紹介します。