NextDNSで広告とばいばいする
はじめに
私の家では、広告を排除することはまったく意識していないのですが、bindを用いた独自のDNSキャッシュサーバーを使っていると、なぜか特定のドメインからの応答が遮断される環境を構築しています。
現代において、GAFAMやMagnificent7といった巨大企業に、わたしたちの情報がある程度提供されてしまうのは、もはや避けられない現実なのかもしれませんし、その事実自体を今さら争うつもりはありません。
しかし、それでもなお、「どの主体に、どの程度の情報を、どのような形で提供するのか」という選択の余地は、利用者側に残されているべきだと考えます。
そして願わくば、どのような情報を受け入れ、あるいは拒否するのか、その選択肢もまた、わたしたちの手元にあるべきではないでしょうか。
昨今、特に懸念を覚えるのは、わたしたちが日常的に利用するPCやスマートフォン、あるいはIoTデバイスが、利用者の認識しないところで、様々な外部ドメインと通信を行っているという事実です。
所謂トラッカーやテレメトリと呼ばれるものがそれに該当します。
情報を何らかの形で提供すること自体は、現代のサービスを利用する上で避けられない側面もあるかもしれません。しかし、その情報の出入りが不透明であるという状況は、決して好ましいものではないとわたしは感じています。
先日、ありがたいことに友人のまくらくらからNextDNSを奢ってもらえることになり、試してみました。
近年巧妙化していると言われるCNAME Cloakingなどといった手法にも対応しているらしく、技術的な関心も惹かれました。
設定
今回のNextDNSの設定は、自宅ネットワークの基幹となっているIX3110に対して行いました。
Tailscaleの機能でDNS設定を上書きすることも可能ですが、PCやスマホだけでなく、ネットワークに接続されている全てのIoTデバイスを配下に置きたかったため、ルータ自体に設定を施すことにしました。
設定内容は、概ね以下の通りです。
- proxy-dns server設定を、これまで利用していた自前のbindサーバーのIPアドレスから、NextDNSから指定されたIPアドレスに変更。
- わたしの利用しているインターネット回線は動的IPアドレスであるため、現在のIPアドレスをNextDNS側に継続的に通知するためのDDNS設定を追加。
詳細なコマンドや手順については、NextDNSの公式サイトに用意されているセットアップガイドが非常に参考になりました。
以下は実際に投入しているconfigです。
hostname rt-001.ngs.nr1q.me
timezone +09 00
!
logging buffered 131072
logging subsystem all warn
logging timestamp datetime
!
no syslog ip enable
!
username mq1 password plain ************** administrator
!
access-list mflt-list permit src any dest any type ipv6
access-list mflt-list permit src any dest any type ip
!
!
ip ufs-cache max-entries 20000
ip ufs-cache enable
ip route default GigaEthernet0.1
ip dhcp enable
ip access-list web-http-acl permit ip src any dest 192.168.0.0/24
!
!
ipv6 ufs-cache max-entries 10000
ipv6 ufs-cache enable
ipv6 dhcp enable
ipv6 access-list block-list deny ip src any dest any
ipv6 access-list dhcpv6-list permit udp src any sport any dest any dport eq 546
ipv6 access-list dhcpv6-list permit udp src any sport any dest any dport eq 547
ipv6 access-list icmpv6-list permit icmp src any dest any
ipv6 access-list permit-list permit ip src any dest any
ipv6 access-list dynamic dflt-list access permit-list
!
!
!
!
bridge irb enable
!
!
!
dns host rt-001.ngs.nr1q.me ip 192.168.0.1
!
proxy-dns ip enable
proxy-dns ip request both
!
proxy-dns ip query-response 20
proxy-dns ip query-retries 3
proxy-dns ip query-interval 2
!
proxy-dns server 2a07:a8c0::bd:49d7 priority 90
proxy-dns server 2a07:a8c1::bd:49d7 priority 80
proxy-dns server 45.90.28.174 priority 60
proxy-dns server 45.90.30.174 priority 50
proxy-dns server 1.1.1.1 priority 20
proxy-dns interface GigaEthernet0.0 priority 11
proxy-dns interface GigaEthernet0.1 priority 10
!
!
ssh-server ip enable
!
http-server username mq1
http-server ip access-list web-http-acl
http-server ip enable
!
!
!
!
ddns enable
ddns profile nextdns-ddns
url https://link-ip.nextdns.io/bd49d7/***********
transport ip
source-interface GigaEthernet0.1
update-interval 1
!
!
!
!
ppp profile ppp-v4
authentication myname user@domain
authentication password user@domain password
!
ip dhcp profile dhcpv4
assignable-range 192.168.0.2 192.168.0.254
default-gateway 192.168.0.1
dns-server 192.168.0.1
domain-name ngs.nr1q.me
lease-time 7200
!
ipv6 dhcp client-profile dhcpv6-cl
information-request
option-request dns-servers
ia-pd subscriber GigaEthernet1.0
!
ipv6 dhcp server-profile dhcpv6-sv
dns-server dhcp
!
device GigaEthernet0
!
device GigaEthernet1
!
device GigaEthernet2
!
device GigaEthernet3
!
interface GigaEthernet0.0
filter mflt-list 1 in
no ip address
ipv6 enable
ipv6 address autoconfig receive-default
ipv6 dhcp client dhcpv6-cl
ipv6 tcp adjust-mss auto
ipv6 nd ra enable
ipv6 filter dhcpv6-list 1 in
ipv6 filter icmpv6-list 2 in
ipv6 filter block-list 100 in
ipv6 filter dhcpv6-list 1 out
ipv6 filter icmpv6-list 2 out
ipv6 filter dflt-list 100 out
bridge-group 1
no shutdown
!
interface GigaEthernet1.0
description LAN
filter mflt-list 1 in
ip address 192.168.0.1/24
ip dhcp binding dhcpv4
ipv6 enable
ipv6 dhcp server dhcpv6-sv
ipv6 nd ra enable
ipv6 nd ra other-config-flag
ipv6 nd proxy GigaEthernet1.0
no shutdown
!
interface GigaEthernet2.0
bridge-group 1
no shutdown
!
interface GigaEthernet3.0
bridge-group 1
no shutdown
!
interface GigaEthernet0.1
encapsulation pppoe
auto-connect
ppp binding ppp-v4
ip address ipcp
ip tcp adjust-mss auto
ip napt enable
no shutdown
!
!
一点、補足ですが、IXシリーズのルーターは、現時点ではDNS over TLS (DoT)に対応していません。
そのため、NextDNS側で提供されている、デバイスごとのクエリ分析といった詳細な機能は利用できないという制約があります。
最後に、NextDNSの管理画面上で、利用するブロックリストを選択して設定は完了です。
私は以下のような構成にしました。

設定完了後、動作確認のためにuserlocation.googleapis.com
へdigを実行しました。

結果は、意図した通り、NextDNSによってブロックされていることが確認できます。
わたしの設定ではブロック時に特定のページへ誘導するオプションを有効にしているため、103.170.232.254
が応答として返されましたが、通常は0.0.0.0
が返されるようです。
(103.170.232.254
がNextDNSの保有するIPであることはwhoisで確認済みです。)
実際につかってみて
運用を開始してから約1週間半が経過した時点で、NextDNSのダッシュボードで統計情報を確認してみました。

その結果、総DNSクエリ数が1,091,869件であったのに対し、ブロックされたクエリ数は209,022件にのぼっていました。
これは、全クエリのおよそ19%に相当します。
この数字は、わたしが日常的にインターネットを利用する中で、意識しないうちに発生していた通信の約2割が、広告配信やトラッキングといった目的のものであった可能性を示唆しています。
私は、固定回線を利用しているため、通信量自体が問題になるわけではありませんが、これまで不可視であった不要なあるいは望まない通信がこれほどの割合を占めていたという事実が可視化されたことで、インターネットという空間における情報の流れについて、改めて考えさせられることになりました。
思った以上にいい感じだったのですが、誤爆ブロックもかなりあったで、ログを見て自力で調整できる方にとってはかなりいいのではないかと思います。
私はたぶん使い続けるでしょう。
追記
はてブやipinfo、ニコニコがそのままでは見られなかったので以下のFQDNを明示的に許可しました。
*.b.hatena.ne.jp
*.ipinfo.io
*.nicovideo.jp