QNAP を WireGuard サーバーにする

やりたい事

QNAP の Container Station で WireGuard をインストールし、QNAP経由でVPN接続ができるようにする。

サーバー設定(QNAPでのアプリインストール)

  1. App Center で Container Station をインストールする
  2. (初回起動時のみ)Container Station の保存場所を選択する。ここではデフォルトの Container を選択

サーバー設定(QNAPでのサーバー設定)

  1. [+ 作成] → [+アプリケーションの作成] をクリック
  2. アプリケーション名に WireGuard と入力
  3. YAML: に下記を入力 → [作成] をクリック
version: '3.3'
services:
  wireguard:
    image: masipcat/wireguard-go:latest
    container_name: wireguard
    cap_add:
     - NET_ADMIN
    sysctls:
     - net.ipv4.ip_forward=1
    volumes:
     - /dev/net/tun:/dev/net/tun
     - /share/Container/docker/wireguard:/etc/wireguard
    environment:
     - WG_COLOR_MODE=always
     - LOG_LEVEL=debug
    ports:
     - 51820:51820/udp
    privileged: true
    restart: unless-stopped
  • /share/Container/docker/wireguard は FileStation から見た場合 /Container/docker/wireguard フォルダーになる
  • ポートは必要に応じて変更する事
  1. [概要] をクリック
  2. ▶︎をクリックし [ >_ ] をクリック
  3. コマンドに /bin/bash を入力、[OK] をクリック
  4. 下記を順番に実行する
wg genkey | tee privatekey | wg pubkey > publickey

echo "## Server"; echo -n "PrivateKey = "; cat privatekey; echo -n "PublicKey = "; cat publickey

wg genkey | tee privatekey | wg pubkey > publickey

echo "## Client 1"; echo -n "PrivateKey = "; cat privatekey; echo -n "PublicKey = "; cat publickey

wg genkey | tee privatekey | wg pubkey > publickey

echo "## Client 2"; echo -n "PrivateKey = "; cat privatekey; echo -n "PublicKey = "; cat publickey

rm -r privatekey | rm -r publickey

実行結果は下記のように表示される

bash-5.0# wg genkey | tee privatekey | wg pubkey > publickey
bash-5.0# 
bash-5.0# echo "## Server"; echo -n "PrivateKey = "; cat privatekey; echo -n "PublicKey = "; cat publickey
## Server 
PrivateKey = SP41OumiNfJ+E1hA39yY2WsCnZaIFNLi3xlXpAIgQF4= 
PublicKey = N19gkc6Xqp3Fr0jtigs7ZVBcn6eTfhuctmT7Yb8ISR8=
bash-5.0# 
bash-5.0# wg genkey | tee privatekey | wg pubkey > publickey
bash-5.0# 
bash-5.0# echo "## Client 1"; echo -n "PrivateKey = "; cat privatekey; echo -n "PublicKey = "; cat publickey
## Client 1
PrivateKey = aA4npiwlLmv2E03Tw55LCpLIPrKN8x3mDY+9zvsCi1g= 
PublicKey = LhlVwduKa3HTMXf7lj24W70RoBgKz1F0K6Fan8/MIFw=
bash-5.0# 
bash-5.0# wg genkey | tee privatekey | wg pubkey > publickey
bash-5.0# 
bash-5.0# echo "## Client 2"; echo -n "PrivateKey = "; cat privatekey; echo -n "PublicKey = "; cat publickey
## Client 2 
PrivateKey = KO4Snz4Z8KzpyVaYfGEQ6VHwrjSXDktRA4Y3zGtfdlI=
PublicKey = /lTtGojUV6Zk0TxFvGsw6WdJqSxawELm2dwX9W8eN2I=
bash-5.0# 
bash-5.0# rm -r privatekey | rm -r publickey
bash-5.0#
  1. テキストエディタで下記を作成し、QNAP の /Container/docker/wireguard 下にファイル名 wg0.conf で保存する
## Server (wg0.conf) ##

[Interface]
Address = 192.168.10.99/24
ListenPort = 51820

#Server の PrivateKey
PrivateKey = SP41OumiNfJ+E1hA39yY2WsCnZaIFNLi3xlXpAIgQF4= 

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
#Client 1 の PublicKey
PublicKey = LhlVwduKa3HTMXf7lj24W70RoBgKz1F0K6Fan8/MIFw=
Address = 192.168.10.11/32

[Peer]
#Client 2 の PublicKey
PublicKey = /lTtGojUV6Zk0TxFvGsw6WdJqSxawELm2dwX9W8eN2I=
Address = 192.168.10.12/32
  • PrivateKey, PublicKeyは実際に表示された値に置き換える事
  • [Interface] は Server の PrivateKey, [Peer] は Client の PublicKey
  • Address は必要に応じて変更する事
  • ListenPort はQNAPで使っているポートと被らない事
  • Address の /24 /32 を間違えない事
  1. アクションの隣のボタンをクリックし、コンテナの再起動をする
  2. ▶︎をクリックし WireGuard という文字列をクリック
  3. コンソールに下記のように表示されていればOK
DEBUG: (wg0) 2021/06/23 05:12:51 peer(LhlV…MIFw) - Starting...
DEBUG: (wg0) 2021/06/23 05:12:51 peer(LhlV…MIFw) - Routine: sequential receiver - started 
DEBUG: (wg0) 2021/06/23 05:12:51 peer(LhlV…MIFw) - Routine: nonce worker - started
DEBUG: (wg0) 2021/06/23 05:12:51 peer(LhlV…MIFw) - Routine: sequential sender - started 
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  1. テキストエディタで下記を作成し、QNAP の /Container/docker/wireguard 下にファイル名 client1.conf, client2.conf で保存する
## client (client1.conf) ##
[Interface]
Address = 192.168.10.11/24
#Client 1 の PrivateKey
PrivateKey = aA4npiwlLmv2E03Tw55LCpLIPrKN8x3mDY+9zvsCi1g=
DNS = 1.1.1.1

[Peer]
#Server の PublicKey
PublicKey = N19gkc6Xqp3Fr0jtigs7ZVBcn6eTfhuctmT7Yb8ISR8=
Endpoint = sample.myqnapcloud.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
## client (client2.conf) ##
[Interface]
Address = 192.168.10.12/24
#Client 2 の PrivateKey
PrivateKey = KO4Snz4Z8KzpyVaYfGEQ6VHwrjSXDktRA4Y3zGtfdlI=
DNS = 1.1.1.1

[Peer]
#Server の PublicKey
PublicKey = N19gkc6Xqp3Fr0jtigs7ZVBcn6eTfhuctmT7Yb8ISR8=
Endpoint = sample.myqnapcloud.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
  • PrivateKey, PublicKeyは実際に表示された値に置き換える事
  • [Interface] は Client の PrivateKey, [Peer] は Server の PublicKey
  • Endpoint はサーバーのアドレス、ポートを指定する事
  • Addressの /24 を間違えない事
  1. ルーターのポート設定変更をする。例えばQNAPのローカルIPアドレスが 192.168.1.99 の場合、ルーター外側の 51820 UDP を 192.168.1.99 51820 UDP にポートフォワードまたはマッピングをする。

クライアント設定(アプリインストール)

クライアント設定(設定インストール)

■スマホの場合(QRコード)
 QNAP に保存した client1.conf のテキストをPCかMacでQRコードに変換する(ウェブの変換サービスは絶対に使わない事)
 WireGuard アプリを起動する
 右上の + をクリック、QRコードから作成 を選択
 PCかMacでQRコードを表示する
 QRコードをカメラで読み込んだあと「スキャンしたトンネル設定に名前をつけてください」に client1.conf を入力する

■iOSの場合(QRコード作成できない場合)
 QNAP に保存した client1.conf をiCloudに保存するか、iOS に Qfile をインストールして ファイル アプリに追加する
 WireGuard アプリを起動する
 右上の + をクリック、ファイル、アーカイブからの作成 を選択
 ブラウズから保存した場所を探し client1.conf を選択、Import をクリックする

■Macの場合
 QNAP に保存した client1.conf をMacにコピーする
 画面上部のドラゴンのようなロゴをクリックし Manage Tunnels をクリックする
 左下の + をクリック、Import Tunnel(s) from File… を選択
 client1.conf を選択、Import をクリックする

■Windowsの場合
 QNAP に保存した client1.conf をWindowsにコピーする
 アプリを起動する
 左下の トンネルの追加 をクリック、トンネルをファイルからインポート…(i) を選択
 client1.conf を選択、Import をクリックする

接続方法

■スマホの場合
 WireGuard アプリを起動し client1.conf のスイッチをオンにする

■Macの場合
 画面上部のドラゴンのようなロゴをクリックし client1.conf をクリックする

■Windowsの場合
 WireGuard アプリを起動し client1.conf を選択し、[有効化(A)]をクリックする

メモ

  • 接続は一瞬
  • 転送速度は IPsec/L2TP の二倍くらい
  • データ通信やWifiが切り替わっても接続が切れない
  • /bin/bash でターミナルを起動後 wg[enter] で接続状況を確認可能
  • QTS5ではWireGuardが実装される予定

参考

Wireguard on qnap docker container