5
3

AdGuard Homeで広告ブロック&お手軽内部ネットワーク用DNSを作ろう(ついでに冗長化)

Last updated at Posted at 2024-04-23

はじめに

以前、こんな感じで内向き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にアクセスすると初期セットアップ画面が開くと思います。

ウェルカム画面

image.png

基本的にはウィザードに従って必要なところを入力していけばOKです。

インターフェース設定

image.png

Webインターフェース用のポートが埋まっている場合は好きなポート番号に変えても構いませんが、この後に同期用ツールでベーシック認証に使用するので覚えておいてください。

ユーザー設定

image.png

こちらのユーザー名とパスワードも後で使用します。

完了画面

image.png

これで初期セットアップは完了です。

ここまで設定が終わったら、2台目も初期セットアップをしてダッシュボードにログインできる状態までセットアップしてください。
2台目のサーバーは自動で設定が同期されるので、この下のDNS及び広告ブロック設定は必要ありません。

DNS及び広告ブロック設定

DNS設定

アップストリームDNSサーバー設定

AdGuard Homeが問い合わせ先として使用するDNSサーバーを設定します。
設定->DNS設定アップストリームDNSサーバーを追加します。
今回はQuad91.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

image.png
リクエストモードは並列リクエストに設定します。

アップストリームをテストで接続テストを行ったら、設定を適用します。

下の方にあるDNSSECを有効にするにチェックを入れると、DNS問い合わせ時にDNSSECの検証を行ってくれます。

暗号化設定

DoH及びDoTを有効化するために、証明書を設定します。

image.png

サーバー名(このドメインの証明書を使用します)を入力します。
暗号化を有効化するプレーンDNSを有効化するにチェックを入れ、HTTPSに自動的にリダイレクトのチェックボックスは外しておいてください。

下に進んで証明書を設定します。Let's Encryptとcertbotを使用して証明書を取得してパスを設定すれば、更新のたびにここをいじらなくてよくなります。
image.png

certbotで取得した場合証明書と秘密鍵は、/etc/letsencrypt/live/ドメイン名/以下に転がってると思いますのでパスを設定してください。
このとき、証明書はcert.pemではなく中間証明書付きのfullchain.pemにしてください。

正しく設定できていれば、証明書チェーンは有効です、となるのでそのまま構成を保存してください。
image.png

内部ネットワーク用DNS設定

内部ネットワーク用のDNS設定は、ナビゲーションのフィルタ->DNS書き換えからアクセスします。

image.png
リライトしたいドメイン名とIPアドレスを入力して保存するだけです。

広告ブロック設定

広告ブロック用のフィルタ設定をします。

デフォルトフィルタ

image.png
フィルタ->DNSブロックリストを開き、AdGuard DNS filterAdAway Default Blocklistを有効化します。

カスタムフィルタ

280blockerや、なんjフィルタなどを追加したい場合は、DNSブロックリストブロックリストを追加する->カスタムリストを追加するから追加できます。

image.png

image.png

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に追記します。

~/.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もブロックしてしまうものがあると思います。
ほかにも、ブロックされたくないドメインは明示的に許可することができます。

明示的に許可したい場合は、クエリログを開いてブロックされたリクエストを見つけ、ブロック解除を選択するとカスタムルールが追加されてアクセスできるようになります。
image.png
image.png

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3