インターネット上の有益なサイトの多くで、その運営費が広告で賄われていることは重々承知だが、2ch まとめサイト等で散見される下品な広告や、昨今の不正広告問題等のセキュリティの上の懸念があり、思い切って広告をブロックすることにした。
広告ブロックは、自宅サーバ内に Unbound で DNS リゾルバを立てて、適当なブロッキングリストを流し込むことで実現することとする。
環境
- Ubuntu 16.04 Server
- Unbound 1.5.X
Unbound の用意
まず Ubuntu に Unbound をインストールする。
$ sudo apt update
$ sudo apt install -y unbound
LAN 内から名前解決要求を受け付けるように設定する (IP アドレスの部分は適宜変更)。
/etc/unbound/unbound.conf.d/unbound.conf
:
server:
interface: 0.0.0.0
access-control: 192.168.0.0/24 allow
Unbound を再起動する。
$ sudo systemctl restart unbound
Unbound と同じネットワークにいる適当な端末から、名前解決ができるか試してみる。
$ dig @UnboundのIP yahoo.co.jp. soa +short
yahoo.co.jp. postmaster.yahoo.co.jp. 2018083122 1800 900 86400 900
ブロッキングリストの用意
今回は 280blocker さんのリストを使用させていただくことにする。個人用途なら自由に利用して良いとのこと。
上記サイトで配布されている「host ファイル」をダウンロードして、Unbound で NXDOMAIN
を返すようにリストを加工するスクリプトを作る。
update_list.sh
:
#!/usr/bin/env bash
set -e
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
cd $(dirname $0)
touch blacklist.txt whitelist.txt
curl -OL https://280blocker.net/files/280blocker_host.txt
cat 280blocker_host.txt blacklist.txt \
| grep -v -f whitelist.txt \
| sed -e "s/\r//" \
| grep -E '^[a-z0-9]' \
| awk '{print "local-zone: \""$1".\" static"}' \
| sort | uniq \
> /etc/unbound/unbound.conf.d/blocking.conf
unbound-checkconf
systemctl reload unbound.service
実行権限を付けて、root 権限で実行する。
$ sudo chmod +x update_list.sh
$ sudo ./update_list.sh
出来上がったリストを確認してみる。
$ head -5 /etc/unbound/unbound.conf.d/blocking.conf
local-zone: "100651.advision-adnw.jp." static
local-zone: "2.chmato.me." static
local-zone: "2mdn.info." static
local-zone: "4clvr.jp." static
local-zone: "a-c-engine.com." static
名前解決できないようになっているか、Unbound と同じネットワークにいる適当な端末で確認する。
$ dig @8.8.8.8 2.chmato.me. a +short
107.182.224.68
$ dig @UnboundのIP 2.chmato.me. a +short
いい感じだ。あとは update_list.sh
を1週間に1回くらい自動実行するように、cron でも仕込んでおく。
DHCP サーバの設定変更
LAN 内の DHCP サーバで、Unbound の IP をリゾルバとして通知するように、設定変更する。
筆者の場合、OpenWrt を使っているので、dnsmasq の設定を変更した。
/etc/config/dhcp
:
config dnsmasq
(中略)
list 'dhcp_option' '6,UnboundのIP'
以上で広告ブロックが実現できた。