Knot-ResolverでAndroid向けの広告をブロック

概要

Knot-Resolverを使い、Androidの「プライベートDNS設定」で利用できるDoTサーバーを構築します
また、RPZゾーンの機能を利用し広告ブロックも行います

DoTを利用するには何でもいいのでドメインが必要になります。
ドメインを持っていない人はMyDNSなど、無料の物を利用してもかまいません。


目次


環境

1
2
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 9.3 (Plow)

EPELを有効にする

今回はRHELを使用しているので、Subscription ManagerからEPELを有効にしていきます

1
2
$ sudo subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

knot-resolverをインストールする

knot-resolverはdnfからすんなりインストールできます

1
$ sudo dnf install knot-resolver

RPZゾーンファイルを用意する

dns-blというRPZを自動生成するスクリプトを利用します。
かなり古いですが、正常動作を確認しています。

dns-blのインストール

1
2
$ cd /opt/
$ sudo https://github.com/p7cq/dns-bl.git

configファイルの編集

1
$ sudo vim /opt/dns-bl/conf/dns-bl.ini 

複数の広告除去用hostsファイルやマルウェア配布URLリストを指定したコンフィグを例示します。
コピペで上書きしてください

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[global]
rpz_file = /etc/knot-resolver/rpz.zone
redirect = IN CNAME .
# whitelisted domains
whitelist_file_prefix = whitelist_

[source/1]
url = https://urlhaus.abuse.ch/downloads/hostfile/
file_type = text
categories = malware
enabled = yes

[source/2]
url = https://raw.githubusercontent.com/blocklistproject/Lists/master/alt-version/ads-nl.txt
file_type = text
categories = ads
enabled = yes

[source/3]
url = https://logroid.github.io/adaway-hosts/hosts.txt
file_type = text
categories = ads
enabled = yes

[source/4]
url = https://adaway.org/hosts.txt
file_type = text
categories = ads
enabled = yes

[source/5]
url = https://warui.intaa.net/adhosts/hosts_lb.txt
file_type = text
categories = ads
enabled = yes

[source/6]
url = https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
file_type = text
categories = ads
enabled = yes

[source/7]
url = https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext
file_type = text
categories = ads
enabled = yes

自動更新スクリプトの作成

dns-blを定期的に実行してrpzファイルを更新するスクリプトを作成します。
本記事ではこのスクリプトを/root/scripts/rpz_update.shという名前で保存しています。

1
2
$ sudo su
# vim /root/scripts/rpz_update.sh

以下のシェルスクリプトをコピペで上書きしてください。

1
2
3
4
5
#!/bin/bash
/opt/dns-bl/bin/run.sh
chown knot-resolver:knot-resolver /etc/knot-resolver/rpz.zone
restorecon -FR /etc/knot-resolver/
systemctl restart kresd@*

その後、実行権限を付与してください

1
# chmod +x /root/scripts/rpz_update.sh

Cron設定

cronに上記スクリプトを登録します

1
# sudo crontab -e

テキストエディタが開いたら以下のように入力してください(毎日00:00に更新)

1
0 0 * * * /bin/bash /root/scripts/rpz_update.sh

ZeroSSLで証明書を取得する

ZeroSSLからTLSサーバ証明書を取得します。
※LetsEncryptを使用するとAndroidの一部のバージョンでは正常に利用できません

以下の記事を参考に証明書ファイルをダウンロードしてください。
ブラウザから無料で簡単に証明書を発行できる ZeroSSL | DevelopersIO

その後、取得した証明書はサーバの/etc/knot-resolver/に保存します。

この記事では秘密鍵をprivkey.pem証明書をfullchain.pemという名前で保存しています。
別の名前で保存した場合は設定ファイルの1行目を書き換えてください。

knot-resolverの設定

Configを編集します

1
$ sudo vim /etc/knot-resolver/kresd.conf

以下のconfigをコピペで上書きしてください

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
net.tls("/etc/knot-resolver/fullchain.pem","/etc/knot-resolver/privkey.pem")
net.listen('0.0.0.0', 53, { kind = 'dns' })
net.listen('0.0.0.0', 853, { kind = 'tls' })
modules = {
'hints > iterate',
'stats',
'predict',
'view',
}
view:addr('192.168.0.0/16',policy.all(policy.PASS))
view:addr('172.16.0.0/12',policy.all(policy.PASS))
view:addr('10.0.0.0/8',policy.all(policy.PASS))
view:addr('0.0.0.0/0',policy.all(policy.TC))
policy.add(policy.rpz(policy.DENY, '/etc/knot-resolver/rpz.zone'))
log_level('warning')

kresdを起動

はじめに自動更新スクリプトを手動で実行し、RPZファイルを事前生成しておきます
実行に成功すると生成されたゾーンファイルの行数か何かが出力されます。

1
2
3
$ sudo su
# /root/scripts/rpz_update.sh
346934

kresdを起動します

1
2
$ sudo systemctl enable kresd@1
$ sudo systemctl start kresd@1

動作確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\Users\admin>nslookup google.com <サーバIP>
サーバー: UnKnown
Address: <サーバIP>

権限のない回答:
名前: google.com
Addresses: 2404:6800:4004:823::200e
142.250.199.110


C:\Users\admin>nslookup ads.google.com <サーバIP>
サーバー: UnKnown
Address: <サーバIP>

*** UnKnown が ads.google.com を見つけられません: Non-existent domain

参考資料

How to install EPEL on RHEL and CentOS Stream | Enable Sysadmin
ブラウザから無料で簡単に証明書を発行できる ZeroSSL | DevelopersIO
Configuration Overview — Knot Resolver 5.7.1 documentation

Author

fuchse-ohren

Posted on

2024-03-10

Updated on

2026-03-11

Licensed under

コメント