はじめに
以前、こんな感じで内向き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
設定ファイルを作成
adguardhome-sync
内に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
初回同期を実行
$ ./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回同期させようと思います。
デーモンファイル作成
[Unit]
Description=AdGuard Home Sync
[Service]
ExecStart=/バイナリまでのパス/adguardhome-sync --config /コンフィグファイルまでのパス/config.yaml
Restart=on-failure
タイマーファイル作成
[Unit]
Description=Run AdGuard Home Sync every 4 hours
[Timer]
OnBootSec=5min
OnUnitActiveSec=4h
Unit=adguardhome-sync.service
[Install]
WantedBy=timers.target
これで四時間ごとに同期が実行されます。
おわり
これで冗長化設定および広告ブロック設定は終了です。
いろいろと自分でいじってみるといいと思います。
おまけ
フィルタによってはCDNもブロックしてしまうものがあると思います。
ほかにも、ブロックされたくないドメインは明示的に許可することができます。
明示的に許可したい場合は、クエリログ
を開いてブロックされたリクエストを見つけ、ブロック解除を選択するとカスタムルールが追加されてアクセスできるようになります。