AdBlockとは
インターネット広告は邪魔に感じることが多いものです。Webサイトを維持するにはコストがかかり、それを無料にするには広告収入が必要であることは理解した上で、(特に子供に対して)悪質な広告をブロックしたいと思うのは自然なことだと思います。そこで広告ブロック(AdBlock)を導入することを考えました。
AdBlockを実現する方法
AdBlockを実現するには様々な方法があり、有料なものから無料なものまで揃っていますが、万能な方法はありません。代表的な方法と特徴を説明します。
- ブラウザ拡張型
- ブラウザのアドオン(拡張機能、プラグイン)としてインストールして使うものです
- メリット
- 手軽に導入できる
- Webサイトの見た目が崩れない
- デメリット
- ブラウザでWebサイトを見る限りにおいて有効であり、アプリには効果がない
- 例: uBlock Origin
- スマホアプリ型(VPN型)
- スマホアプリとしてインストールして使うものです。(必ずしもVPN型とは限らず、様々な手法を組み合わせて実現している場合があります)
- メリット
- 手軽に導入できる
- Webサイトだけでなく、アプリ広告を含めてブロックできる
- デメリット
- バッテリーの消費量が増える
- 当然ながらVPNとの相性がよくない
- 例: AdGuard
- DNS型
- DNSサーバ相当の機能を導入することで広告ドメインを無効にするものです
- メリット
- DNSの所掌範囲にあるすべてのデバイスに対して効果がある
- Webサイトだけでなく、アプリ広告を含めてブロックできる
- デメリット
- 導入に手間がかかる
- Webサイトの見た目が崩れる(広告エリアが空白になる)
- 例: AdGuard Home
BINDによるAdBlock
個人が持つデバイスは多岐にわたるため、個別にインストールせずに済むDNS型を導入したいと考えました。はじめはAdGuard Homeを検討したのですが、仕組みを調べるとBINDで実現できそうに思いました。そこで家庭にあるBINDで実現する方法を調査しました。
RPZ(Response Policy Zones)とは
RPZ1はDNS応答をポリシーに応じて書き換えるものです。DNSにはRPZという仕組みがあり、BINDでは9.8.0から利用可能になっています。(UnboundやPowerDNSでも利用できます)
BINDにブロックするドメイン一覧を設定することで、広告ドメインへの問い合わせに対してNXDOMAINを返します。
RPZの設定
PRZの有効化
BINDのnamed.confに設定を追加してRPZを有効にします。以下の例ではホワイトリストと2つのブロックリスト(280blocker、HaGeZi)を導入しています。
# vi /etc/named.conf
:
view "internal"
{
:
response-policy { ←RPZを使用する
zone "rpz.whitelist"; ←適用順に記載する
zone "rpz.280blocker"; ←〃
zone "rpz.hagezi"; ←〃
};
include "/etc/named/rpz.zones";
};
ゾーンの設定
ゾーンの設定とゾーンファイルの指定を行います。
# vi /etc/named/rpz.zones
zone "rpz.whitelist" { ←ホワイトリストの定義
type master;
file "rpz.whitelist";
};
zone "rpz.280blocker" { ←280blockerの定義
type master;
file "rpz.280blocker";
};
zone "rpz.hagezi" { ←HaGeZiの定義
type master;
file "rpz.hagezi";
};
ゾーンファイルの設定
公開されているブロックリストをゾーンファイルとして配置します。様々なブロックリストが公開されていて2とても把握しきれないところですが、有名どころを上げておきます。
- ホワイトリスト
- 誤検知があった場合に除外したいドメインを追加するもの
- 最初は空(最低限のSOAとNSのみ)でよい
-
280blocker
- iPhone用AdBlockアプリの日本向けブロックリスト
- アプリで使用しているブロックリストを公開している3
-
HaGeZi
- 世界向けブロックリスト。ゾーンファイル形式なのでそのまま使える
- 個人(hagezi)がユーザーの報告を取り込みながらブロックリストをメンテナンスしている4
280blockerのブロックリストについて
280blockerのブロックリストは独自フォーマットであるため、ゾーンファイルに変換する必要があります。参考までに変換スクリプトを記載します。
# vi make_rpz_280blocker.sh
#!/bin/bash
YYYYMM=$(date +%Y%m)
URL="https://280blocker.net/files/280blocker_domain_${YYYYMM}.txt"
TMP="/tmp/280blocker_domain.txt"
RPZ="/var/named/rpz.280blocker"
SERIAL=$(date +%Y%m%d%H)
curl -fsSL "$URL" -o "$TMP" || exit 1
{
cat <<EOF
\$TTL 2h
@ IN SOA localhost. root.localhost. (
$SERIAL
1h
15m
30d
2h )
IN NS localhost.
EOF
sed '1s/^\xEF\xBB\xBF//' "$TMP" | awk '!/^#/ && NF { print $1 " CNAME ." }' ←BOMを削除する
} > "$RPZ"
確認
設定が完了したらBINDを再起動して動作を確認します。
$ dig ads.google.com @<BINDのIPアドレス>
; <<>> DiG 9.18.33 <<>> ads.google.com @<BINDのIPアドレス>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 50977 ←NXDOMAINになる
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 2
NXDOMAINが返れば成功です!
OSやブラウザの罠
最後に残念なお知らせです。
近年、DoT(DNS over TLS)やDoH(DNS over HTTPS)によって、内部DNSが無視される傾向が強まっています。これらはOSやブラウザによって有効化されていて、内部DNSを無視して直接パブリックなDNS(Google Public DNSなど)へ問い合わせに行きます。こうなるとBINDによるAdBlockは無力です。OSやブラウザに内部DNSをバイパスさせない方法を共有します。(2026年4月現在、Windows、Mac、iOS、日本のFirefoxのデフォルト設定は大丈夫なようです)
-
Androidの場合
- 「設定」-「ネットワークとインターネット」
- プライベートDNS: オフ (DNS over TLSを無効にする)
- 「設定」-「ネットワークとインターネット」
-
Chromeの場合
- 「設定」-「プライバシーとセキュリティ」-「セキュリティ」
- セキュア DNS を使用する: オフ (DNS over HTTPSを無効にする)
- 「設定」-「プライバシーとセキュリティ」-「セキュリティ」