果報

二度寝して待つ

自宅サーバにAdGuard HomeとTailsclaeを導入してあらゆる環境で広告ブロックする

はじめに

広告ブロック用DNSサーバのAdGuard Homeを自宅サーバに導入して、Tailscaleを有効にした全ての端末で広告を表示しないようにします。

github.com

ネットワーク構成としては以下になります。

類似のPi-holeと迷いましたが、デフォルトで日本語化されているのと、普段からAdGuardのChrome拡張機能を使ってるという理由でAdGuardを選びました。

また、前提として以下の環境で作業します。

  • 自宅サーバ: Ubuntu 22.04

AdGuard Homeのインストール

更新の手軽さを考えてsnapでインストールます。

$ sudo snap install adguard-home

自宅サーバ上のブラウザを起動して「http://localhost:3000」にアクセスします。

始めましょう。

管理用ウェブインターフェイスのポート(80)が既存サービスと競合していたので、「3000」に変更します。

DNSサーバのポート(53)はそのままにしましたが、「bind: address already in use」というDNSポート競合のエラーメッセージが表示されたため、リンク先の手順に従って以下のコマンドを実行します。ちなみに、今回はsystemd-resolvedとの競合でした。

$ sudo mkdir -p /etc/systemd/resolved.conf.d
$ sudo nano /etc/systemd/resolved.conf.d/adguardhome.conf
$ sudo mv /etc/resolv.conf /etc/resolv.conf.backup
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
$ sudo systemctl reload-or-restart systemd-resolved

adguardhome.confの設定内容は以下のとおりです。

[Resolve]
DNS=127.0.0.1
DNSStubListener=no

これでエラーが解消されるはずなので、次に進みます。

任意のユーザ名とパスワードを入力して次へ。

機器やOS別のDNS設定手順が記載されているので、好みの設定を行います。Tailscaleを導入した端末のみ広告ブロックしたい場合は、いったんスルーして問題ありません。

今回は、自宅のWi-Fiに接続した端末もデフォルトで広告をブロックしたいので、Wi-Fiルータの設定画面から、プライマリDNSサーバに自宅サーバのIPアドレスを設定しました。

また、自宅サーバ自体のDNSも、GUIのネットワーク設定から127.0.0.1に設定します。

以上でAdGuard Homeのインストールは終了です。

Tailscaleのインストール

自宅サーバにTailscaleをインストールします。予めTailscaleのアカウントを作成しておく必要がありますが、ここでは手順を省略します。

インストールは基本的に以下の記事に従って進めます。Pi-holeとRaspberry Pi向けの内容ですが、AdGuard HomeとUbuntuでも同様です。

tailscale.com

以下のコマンドを実行してインストールします。

$ curl -fsSL https://tailscale.com/install.sh | sh

実行後、ブラウザで指定のURLを開くように指示されるので、案内に従って認証します。

認証が完了したら、以下のコマンドで自宅サーバにおけるTailscaleのDNS機能を無効化します。

$ sudo tailscale up --accept-dns=false

ウェブブラウザからTailscaleの管理画面にログイン後、DNS設定ページに移動します。

Nameservers>Global nameserversの項目にあるAdd Nameserver>Custom...をクリックし、自宅サーバのTailscaleのIPアドレス(100.~から始まるやつ)を設定します。

また、設定後「Override local DNS」をオンにしてください。

最後に、自宅サーバのTailscaleのIPアドレスを永続的に固定化します(デフォルトでは再認証時に変更されます)。マシン一覧ページから自宅サーバの「…」をクリックし、「Disable key expiry」を選択します。

動作確認

Tailscaleがインストールされた任意の端末でウェブブラウザ等を起動し、広告が表示されないことを確認します。

今回はスマホ(Android)のChromeで、ヤフーニュースを開いて確認してみます。

Tailscale起動前(左)と起動後(右)

Tailscale起動後は画面中央と下部の広告が表示されなくなりました。問題なく動作してそうですね。

AdGuard Homeの追加設定

AdGuard Homeはデフォルトのままでも運用できますが、設定を変更することで広告ブロックの精度を高められます。

自分の場合、DNSブロックリストに以下を追加しています。昔からこの界隈で有名な豆腐フィルタというやつです。

https://raw.githubusercontent.com/tofukko/filter/master/Adblock_Plus_list.txt

github.com

また、DNS設定のアップストリームDNSサーバーには以下のアドレスを指定しています。ただ、海外サイトに書いてあった参考例をそのまま流用しているだけなので、後日見直すかもしれません。

tls://dns.google
tls://1.1.1.1
https://dns10.quad9.net/dns-query
https://doh.opendns.com/dns-query

運用してみて

AdGuard Homeのダッシュボードでブロックされたクエリ数などの情報を確認できます。

上図の例だと総クエリのうち3割以上がブロックされてるようで、思いのほか多い印象です。また、実際にブラウザでサイトを閲覧すると広告がかなり減少してるのを実感できます。

余談

以下はただの個人的な余談です。

自宅のネットワーク構成は、auひかりのホームルータにWi-Fiルータを繋いでいますが、Wi-Fiルータをルータモードにすると接続が不安定になることがあったので、長年ブリッジ接続モード(要は中継するだけ)で運用していました。

ただ、ブリッジ接続だとDNSサーバの設定ができず、かといってホームルータはauひかりの用意したDNSサーバが固定化されていて変更できず、せっかくDNSサーバ構築したのに設定できないなあと思ってネットで調べること数分、「もしかしてルータモードが不安定だったのは、ホームルータ側のDHCPが有効だからでは?」と思い当たりました。

で、ホームルータのDHCPを無効化した後、改めてWi-Fiルータをルータモードに変更したら、何も問題なく接続でき、無事に今回構築したDNSサーバも設定できました。めでたし。

追記(2024/2/4)

後日談という名のブックマークコメントへのレスポンス記事を書きました。

text.yusukesakai.com