はじめに
前回の広告ブロック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を取得
- 下記より、自分のNASのモデルにあったPackage Archを確認する。
https://kb.synology.com/en-me/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have - 下記より①で確認したspkファイルをダウンロードする。
https://drive.google.com/drive/folders/1bY1u32nXS0Sj6tKfdZmuYon0sqFGoJpw
ファイルバージョンはDSM7.2用だけど、このファイルでも動きました。
WireGuardのSPKインストール
- Synologyパッケージセンターの右上にある「手動インストール」よりダウンロードしたspkを指定してインストールする。
- インストールする途中で、「インストール後に実行する」のチェックを外して、次へ。
※これ、確実に実行に失敗します。
ターミナルを使ってWireGuardを実行
- Synologyの「端末とSNMP」より、SSHを有効にする。
- teratermとかを使ってSynology NASにアクセスする。
- 以下のコマンド実行する。
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と相談しながら作成していった、すごい時代になったものだ。
