Synology NASにWireGuard VPN導入

はじめに

前回の広告ブロックDNS導入に続いて、VPNサーバーを構築した。synologyのパッケージにVPN Serverアプリがあるから、基本それを使えばいいだけども、やはり外出先からも広告ブロックDNSが使えると、Webも見やすくなると思い、別途導入した。VPN Serverアプリで最初Open VPN使ってみたけども、広告ブロックDNSを指定することができなかったので。やり方が見つからなかっただけかもしれないけど、サーバー側もクライアント側も任意のDNSを指定できず。それで、最終的にDocker上でWireGuard VPNを動作させることにした。

環境

  • Synology DS124
  • DSM 7.3

方針

dockerコンテナ上でVPNのWireGuardを動作させる。ネットワークはhostモードで動作 →NASと同一IPアドレス。NASのIPアドレスを、192.168.1.150とした場合の設定です。

構築手順

DDNSを取得

Synologyの外部アクセスより、DDNSを設定する(外出先からアクセスするドメインを取得)。

WireGuardのSPKを取得

  1. 下記より、自分のNASのモデルにあったPackage Archを確認する。
    https://kb.synology.com/en-me/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have
  2. 下記より①で確認したspkファイルをダウンロードする。
    https://drive.google.com/drive/folders/1bY1u32nXS0Sj6tKfdZmuYon0sqFGoJpw
    ファイルバージョンはDSM7.2用だけど、このファイルでも動きました。

WireGuardのSPKインストール

  1. Synologyパッケージセンターの右上にある「手動インストール」よりダウンロードしたspkを指定してインストールする。
  2. インストールする途中で、「インストール後に実行する」のチェックを外して、次へ。
    ※これ、確実に実行に失敗します。

ターミナルを使ってWireGuardを実行

  1. Synologyの「端末とSNMP」より、SSHを有効にする。
  2. teratermとかを使ってSynology NASにアクセスする。
  3. 以下のコマンド実行する。
sudo /var/packages/WireGuard/scripts/start

④パスワードを入力して、実行する(※パスワードは表示されません)。⑤「successfully started」が出たらok。

WireGuardのHASH値を用意しておく

WireGuard管理画面にアクセスするときのパスワードを作成する。いつからか平文のパスワードが設定できなくなったみたい。以下のコマンドを実行する。bcryptをインストールして、bcryptハッシュ値を作成(your_secure_passwordには任意のパスワード入力)。

npm install bcrypt
node -e "console.log(require('bcrypt').hashSync('your_secure_password', 10))"

このコマンドで作成されたのが、ハッシュ値のパスワードです。コピーしておく。

プロジェクト作成

container managerを起動し、プロジェクトを下記のように作成する。

  • プロジェクト名:wg-easy
  • パス:/docker/wireguard
  • ソース:docker-compose.ymlを作成

.docker-compose.ymlに下記を入力する。

version: "3.8"
services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy

    # Hostネットワークモードを使用
    network_mode: host

    # 外部設定 (ルーターのポートフォワードと合わせる)
    environment:
      # ↓↓↓ 自宅外からアクセスする際のIPアドレスまたはDDNSホスト名に置き換えてください ↓↓↓
      - WG_HOST=XXX.synology.YYY (1で取得したDDNS)

      # ↓↓↓ WireGuardのVPN接続用ポート (ルーターでこのUDPポートを開放) ↓↓↓
      - WG_PORT=51820

      # ↓↓↓ Web管理画面のパスワード (必ず変更してください) ↓↓↓
      - PASSWORD_HASH= 5で出力したハッシュ値をペーストする

      # Web管理画面のポート (Hostモードで直接ホストの51821ポートを使用)
      - WG_HTTP_PORT=51821

    # データを永続化するためのボリューム設定
    volumes:
      # コンテナ内の設定ファイルと鍵を永続化
      - wg_easy_data:/etc/wireguard

    # NET_ADMIN権限の追加(VPN機能に必須)
    cap_add:
      - NET_ADMIN

    restart: always

# 永続化ボリュームの定義
volumes:
  wg_easy_data:
    name: wg_easy_data

「次へ」を押す。「ウェブポータルをWebStation経由でセットアップ」のチェックを外して、「次へ」を押して、完了する。無事動作すればok。

ルータのポート開放をする

VPNで使用するポート51820ポートをUDPで開放。

WireGuard管理画面へアクセス

http://192.168.1.150:51821/(自分はSynology IPアドレスを192.168.1.150にしているので。)パスワードはハッシュ値ではなく、5で決めた任意のパスワードです。開いたらクライアント追加設定しておわり。QRコードを表示して、VPN接続したい端末よりWireGuardのクライアントアプリで読み取る。

最後に広告ブロックDNSをクライアント側で設定

WireGuardのクライアントアプリを開いて、ユーザー名のところをタップすると設定画面が出るので、鉛筆マークを押して、編集する。DNSサーバーを広告ブロックDNSサーバーのアドレスに指定する。私はpiholeをHOSTモードとしているので、192.168.1.150を指定する。VPNをONにする。

まとめ

これで、外出先からも自宅のpiholeのDNSを参照するので、広告なしのブラウジングができるようになる。主にyamlをGoogle Geminiと相談しながら作成していった、すごい時代になったものだ。

タイトルとURLをコピーしました