Cover Image for AdGuard Home DNSで広告ブロック + 宅内DNS

AdGuard Home DNSで広告ブロック + 宅内DNS

はじめに

Unboundで内部ネットワーク用DNSを構築し、PrometheusとGrafanaでDNSクエリをモニタリングしよう - Qiita
追記 AdGuardHomeのほうが簡単そうなので、こちらの記事をおすすめします。 はじめに 自宅内ネットワークでいろいろする際、インターネットに公開しているドメインを使ってアクセスしたい時があると思います。 しかし大半の家庭用ルーターはヘアピンNAT機能を搭載し...
Unboundで内部ネットワーク用DNSを構築し、PrometheusとGrafanaでDNSクエリをモニタリングしよう - Qiita favicon https://qiita.com/m4549071758/items/cfaa9743eb417e985240
Unboundで内部ネットワーク用DNSを構築し、PrometheusとGrafanaでDNSクエリをモニタリングしよう - Qiita

以前、こんな感じで内向き DNS を作りました。
しかし、サーバー 1 台のみで動作しているのでこの DNS を動かしているサーバーが落ちてしまうと家の中のネットワーク接続が全て死んでしまいます。
そこでAdGuard Homeで広告をブロックしつつ、AdGuardHome-Syncを使用して冗長化したいと思います。

OS による設定手順の違いについて

今回はAlmaLinux 9で設定を進めていきます。Ubuntu などの Debian 系ディストロは、systemd-resolveが 53 番ポートをリッスンしているらしいので止めておいてください。

AdGuard Home 構築

AdGuard Home のインストール

まずは AdGuard 本体をインストールしていきます。
公式でワンラインインストールコマンドがあるのでそちらを利用します。

GitHub - AdguardTeam/AdGuardHome: Network-wide ads & trackers blocking DNS server
Network-wide ads & trackers blocking DNS server. Contribute to AdguardTeam/AdGuardHome development by creating an account on GitHub.
GitHub - AdguardTeam/AdGuardHome: Network-wide ads & trackers blocking DNS server favicon https://github.com/AdguardTeam/AdGuardHome#automated-install-linux-and-mac
GitHub - AdguardTeam/AdGuardHome: Network-wide ads & trackers blocking DNS server
# 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サーバーを追加します。
今回は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

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 filterとAdAway Default Blocklistを有効化します。

カスタムフィルタ

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

image.png

image.png

AdGuard のフィルタリストについては次のページを見るといいと思います。

なん J AdGuard 部

なんJ AdGuard部 Wiki*
AdGuard for Androidをはじめとする広告ブロックアプリについての情報を共有するWikiです。
なんJ AdGuard部 Wiki* favicon https://wikiwiki.jp/nanj-adguard/
なんJ AdGuard部 Wiki*

フィルタリスト

フィルターリスト - なんJ AdGuard部 Wiki*
AdGuard for Androidをはじめとする広告ブロックアプリについての情報を共有するWikiです。
フィルターリスト - なんJ AdGuard部 Wiki* favicon https://wikiwiki.jp/nanj-adguard/フィルターリスト
フィルターリスト - なんJ AdGuard部 Wiki*

AdguardHome-sync 構築

ここからは同期ツールの設定をします。

まず Github から最新バージョンの同期ツールをダウンロードしてきます。

Releases · bakito/adguardhome-sync
🛡️ Synchronize AdGuard Home config to replicas. Contribute to bakito/adguardhome-sync development by creating an account on GitHub.
Releases · bakito/adguardhome-sync favicon https://github.com/bakito/adguardhome-sync/releases/
Releases · bakito/adguardhome-sync

同期ツールは、どのホストで動かしても構いません。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

設定ファイルを作成

adguardhome-sync内にconfig.yamlを作成します。

config.yaml
# cron expression to run in daemon mode. (default; "" = runs only once)
cron: ""

# runs the synchronisation on startup
runOnStart: true

# If enabled, the synchronisation task will not fail on single errors, but will log the errors and continue
continueOnError: false

origin:
  # url of the origin instance
  url: http://1台目のIPアドレス
  # apiPath: define an api path if other than "/control"
  # insecureSkipVerify: true # disable tls check
  username: 1台目のユーザー名
  password: 1台目のパスワード
  # cookie: Origin-Cookie-Name=CCCOOOKKKIIIEEE

# replicas instances
replicas:
  # url of the replica instance
  - url: http://2台目のIPアドレス
    username: 2台目のユーザー名
    password: 2台目のパスワード
  # この下に3台目、4台目と増やせます。
# Configure the sync API server, disabled if api port is 0
api:
  # Port, default 8080
  port: 8080
  # if username and password are defined, basic auth is applied to the sync API
  username: 1台目のユーザー名
  password: 1台目のパスワード
  # enable api dark mode
  darkMode: true

  # enable metrics on path '/metrics' (api port must be != 0)
  # metrics:
  #   enabled: true
  #   scrapeInterval: 30s 
  #   queryLogLimit: 10000

  # enable tls for the api server
  # tls:
  #   # the directory of the provided tls certs
  #   certDir: /path/to/certs
  #   # the name of the cert file (default: tls.crt)
  #   certName: foo.crt
  #   # the name of the key file (default: tls.key)
  #   keyName: bar.key

# Configure sync features; by default all features are enabled.
features:
  generalSettings: true
  queryLogConfig: true
  statsConfig: true
  clientSettings: true
  services: true
  filters: true
  dhcp:
    serverConfig: true
    staticLeases: true
  dns:
    serverConfig: true
    accessLists: true
    rewrites: true

初回同期を実行

console
$ ./adguardhome-sync run --config ./config.yaml
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などの設定が同期されているかと思います。

定期同期設定

systemd-timerを使って定期的に同期させます。
今回は4時間に1回同期させようと思います。

デーモンファイル作成

/etc/systemd/system/adguardhome-sync.service
[Unit]
Description=AdGuard Home Sync

[Service]
ExecStart=/バイナリまでのパス/adguardhome-sync --config /コンフィグファイルまでのパス/config.yaml
Restart=on-failure

タイマーファイル作成

/etc/systemd/system/adguardhome-sync.timer
[Unit]
Description=Run AdGuard Home Sync every 4 hours

[Timer]
OnBootSec=5min
OnUnitActiveSec=4h
Unit=adguardhome-sync.service

[Install]
WantedBy=timers.target

これで四時間ごとに同期が実行されます。

おわり

これで冗長化設定および広告ブロック設定は終了です。
いろいろと自分でいじってみるといいと思います。

おまけ

フィルタによっては CDN もブロックしてしまうものがあると思います。
ほかにも、ブロックされたくないドメインは明示的に許可することができます。

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