はじめに
以前、こんな感じで内向きDNSを作りました。
しかし、サーバー1台のみで動作しているのでこのDNSを動かしているサーバーが落ちてしまうと家の中のネットワーク接続が全て死んでしまいます。
そこでAdGuard Home
で広告をブロックしつつ、AdGuardHome-Sync
を使用して冗長化したいと思います。
OSによる設定手順の違いについて
今回はAlmaLinux 9
で設定を進めていきます。UbuntuなどのDebian系ディストロは、systemd-resolve
が53番ポートをリッスンしているらしいので止めておいてください。
AdGuard Home構築
AdGuard Homeのインストール
まずはAdGuard本体をインストールしていきます。
公式でワンラインインストールコマンドがあるのでそちらを利用します。
# wget --no-verbose -O - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
インストールが完了したら自動でサービス登録されているはずなので起動します。
# systemctl enable --now AdGuardHome.service
AdGuard Homeの初期設定
無事起動したら、http://SERVER_ADDRESS:3000
にアクセスすると初期セットアップ画面が開くと思います。
ウェルカム画面
基本的にはウィザードに従って必要なところを入力していけばOKです。
インターフェース設定
Webインターフェース用のポートが埋まっている場合は好きなポート番号に変えても構いませんが、この後に同期用ツールでベーシック認証に使用するので覚えておいてください。
ユーザー設定
こちらのユーザー名とパスワードも後で使用します。
完了画面
これで初期セットアップは完了です。
ここまで設定が終わったら、2台目も初期セットアップをしてダッシュボードにログインできる状態までセットアップしてください。
2台目のサーバーは自動で設定が同期されるので、この下のDNS及び広告ブロック設定は必要ありません。
DNS及び広告ブロック設定
DNS設定
アップストリームDNSサーバー設定
AdGuard Homeが問い合わせ先として使用するDNSサーバーを設定します。
設定
->DNS設定
のアップストリームDNSサーバー
を追加します。
今回はQuad9
・1.1.1.1
を追加します。
ついでにおまけでGoogle Public DNS
もTCPのみ入れておきます。
1.1.1.1
1.0.0.1
2606:4700:4700::1111
2606:4700:4700::1001
https://cloudflare-dns.com/dns-query
https://dns10.quad9.net:443/dns-query
8.8.8.8
アップストリームをテスト
で接続テストを行ったら、設定を適用します。
下の方にあるDNSSECを有効にする
にチェックを入れると、DNS問い合わせ時にDNSSECの検証を行ってくれます。
暗号化設定
DoH及びDoTを有効化するために、証明書を設定します。
サーバー名(このドメインの証明書を使用します)を入力します。
暗号化を有効化する
・プレーンDNSを有効化する
にチェックを入れ、HTTPSに自動的にリダイレクト
のチェックボックスは外しておいてください。
下に進んで証明書を設定します。Let's Encryptとcertbotを使用して証明書を取得してパスを設定すれば、更新のたびにここをいじらなくてよくなります。
certbotで取得した場合証明書と秘密鍵は、/etc/letsencrypt/live/ドメイン名/
以下に転がってると思いますのでパスを設定してください。
このとき、証明書はcert.pem
ではなく中間証明書付きのfullchain.pem
にしてください。
正しく設定できていれば、証明書チェーンは有効です、となるのでそのまま構成を保存してください。
内部ネットワーク用DNS設定
内部ネットワーク用のDNS設定は、ナビゲーションのフィルタ
->DNS書き換え
からアクセスします。
リライトしたいドメイン名とIPアドレスを入力して保存するだけです。
広告ブロック設定
広告ブロック用のフィルタ設定をします。
デフォルトフィルタ
フィルタ
->DNSブロックリスト
を開き、AdGuard DNS filter
とAdAway Default Blocklist
を有効化します。
カスタムフィルタ
280blockerや、なんjフィルタなどを追加したい場合は、DNSブロックリスト
のブロックリストを追加する
->カスタムリストを追加する
から追加できます。
AdGuardのフィルタリストについては次のページを見るといいと思います。
なんJ AdGuard部
フィルタリスト
AdguardHome-sync構築
ここからは同期ツールの設定をします。
まずGithubから最新バージョンの同期ツールをダウンロードしてきます。
同期ツールは、どのホストで動かしても構いません。1台目で動かしても2台目で動かしてもOKです。
今回はバージョンadguardhome-sync_0.6.9_linux_amd64.tar.gz
をダウンロードしてきました。
(2024/04/23)
$ mkdir adguardhome-sync && cd adguardhome-sync
$ wget https://github.com/bakito/adguardhome-sync/releases/download/v0.6.9/adguardhome-sync_0.6.9_linux_amd64.tar.gz
$ tar zxvf adguardhome-sync_0.6.9_linux_amd64.tar.gz
環境変数を設定
今回は~/.bash_profileに追記します。
export LOG_LEVEL=info
export ORIGIN_URL=http://1台目のアドレス
export ORIGIN_USERNAME=1台目で設定したユーザー名
export ORIGIN_PASSWORD=1台目で設定したパスワード
export REPLICA1_URL=http://2台目のアドレス
export REPLICA1_USERNAME=2台目で設定したユーザー名
export REPLICA1_PASSWORD=2台目で設定したパスワード
追記が終わったら.bash_profileを再度読み込みます。
$ source .bash_profile
初回同期を実行
$ ./adguardhome-sync run
2024-04-23T22:20:30.794+0900 INFO sync sync/sync.go:38 AdGuardHome sync {"version": "0.6.9", "build": "2024-04-08T16:47:42Z", "os": "linux", "arch": "amd64"}
2024-04-23T22:20:30.795+0900 INFO sync sync/http.go:63 Starting API server {"port": 8080}
2024-04-23T22:20:30.796+0900 INFO sync sync/sync.go:75 Running sync on startup
2024-04-23T22:20:30.878+0900 INFO sync sync/sync.go:174 Connected to origin {"from": "1台目のアドレス", "version": "v0.107.48"}
2024-04-23T22:20:32.033+0900 INFO sync sync/sync.go:267 Start sync {"from": "1台目のアドレス", "to": "2台目のアドレス"}
2024-04-23T22:20:32.158+0900 INFO sync sync/sync.go:275 Connected to replica {"from": "1台目のアドレス", "to": "2台目のアドレス", "version": "v0.107.48"}
2024-04-23T22:20:33.259+0900 INFO client client/client.go:281 Toggle filtering {"host": "2台目のアドレス", "enabled": true, "interval": 24}
2024-04-23T22:20:33.606+0900 INFO client client/client.go:295 Set blocked services schedule {"host": "2台目のアドレス", "services": "[]"}
2024-04-23T22:20:34.194+0900 INFO client client/client.go:386 Set dns config list {"host": "2台目のアドレス"}
2024-04-23T22:20:34.564+0900 INFO sync sync/sync.go:303 Sync done {"from": "1台目のアドレス", "to": "2台目のアドレス"}
いろいろ流れますが、最後のSync done
が表示されれば初回同期は完了です。
この時点で2台目のサーバーを確認すると、フィルタやアップストリームDNSなどの設定が同期されているかと思います。
定期同期設定
cronを使って定期的に同期させます。
今回は24時間に1回同期させようと思います。
$ crontab -e
LOG_LEVEL=info
ORIGIN_URL=http://1台目のアドレス
ORIGIN_USERNAME=1台目で設定したユーザー名
ORIGIN_PASSWORD=1台目で設定したパスワード
REPLICA1_URL=http://2台目のアドレス
REPLICA1_USERNAME=2台目で設定したユーザー名
REPLICA1_PASSWORD=2台目で設定したパスワード
30 12 * * * /展開した実行ファイルまでのパス/adguardhome-sync run
これで毎日12:30に同期が実行されます。
おわり
これで冗長化設定および広告ブロック設定は終了です。
いろいろと自分でいじってみるといいと思います。
おまけ
フィルタによってはCDNもブロックしてしまうものがあると思います。
ほかにも、ブロックされたくないドメインは明示的に許可することができます。
明示的に許可したい場合は、クエリログ
を開いてブロックされたリクエストを見つけ、ブロック解除を選択するとカスタムルールが追加されてアクセスできるようになります。