Firefox で DNS-over-HTTPS を試す

最近の Firefox はTrusted Recursive Resolver(TRR)を利用して DNS-over-HTTPS が利用できるようです.試してみました.

アドレスバーに about:config 入力して移動.

44211559615 6a29ddb6d5

network.trr.mode を設定.今回は`3`のTRRのみ利用を指定した.

44402653684 e26c646cb0
43309711340 4b5d902ae2

  • network.trr.mode

    • 0 : TRR無効(既定値).

    • 1 : 通常のDNSとTRRを並行実行して最初に帰ってきた結果を利用する.

    • 2 : TRRを優先利用.

    • 3 : TRRのみを利用.

    • 4 : 通常のDNSを利用する.TRRは情報収集のためだけに動く.

    • 5 : TRRを明示的に無効にする

次に network.trr.uri を指定.好みのDNS-over-HTTPS のリゾルバを指定.

43309712480 d417a108b5
44402653984 c8538ce5fe

about:networking#dns にアクセスしてTRRが true になっていれば TRR を利用しているはず.

44402654944 daac2b37e3

環境
$ dpkg-query -W firefox
firefox 62.0.3-1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

44402653394 9392330ef0

Linux で DNS-over-HTTPS を利用する

Android で DNS-over-HTTPS が簡単に出来るようになりました.

Linuxだどうなんだろうと以下の`dns-over-https` を試してみました.ここでは Debian sid amd64 で試していますが,公式の手順には Ubuntu 18.04 LTS, macOS の手順が載っています.

導入例
$ sudo apt install git golang
$ git clone https://github.com/m13253/dns-over-https.git
$ cd dns-over-https
$ make
$ sudo checkinstall
規定値のサーバは Google Public DNS になっている.変更したい場合は設定ファイル( /etc/dns-over-https/doh-client.conf )を編集
$ sudo edit /etc/dns-over-https/doh-client.conf
CleanBrowsingのセキュリティフィルターを利用する場合の設定例
diff --git a/dns-over-https/doh-client.conf b/dns-over-https/doh-client.conf
index 3b5de14..1791397 100644
--- a/dns-over-https/doh-client.conf
+++ b/dns-over-https/doh-client.conf
@@ -11,7 +11,7 @@ listen = [
 upstream_google = [

     # Google's productive resolver, good ECS, bad DNSSEC
-    "https://dns.google.com/resolve",
+    #"https://dns.google.com/resolve",

     # CloudFlare's resolver, bad ECS, good DNSSEC
     #"https://cloudflare-dns.com/dns-query",
@@ -39,6 +39,9 @@ upstream_ietf = [
     # Blog: https://blog.cloudflare.com/welcome-hidden-resolver/
     #"https://dns4torpnlfs2ifuz2s2yf3fc7rdmsbhm6rw75euj35pac6ap25zgqad.onion/dns-query",

+    # CleanBrowsing https://cleanbrowsing.org/dnsoverhttps
+    "https://doh.cleanbrowsing.org/doh/security-filter/"
+
 ]

 # Bootstrap DNS server to resolve the address of the upstream resolver
起動
$ sudo systemctl restart doh-client
名前が引けるのを確認
$ dig @127.0.0.1 | grep SERVER
;; SERVER: 127.0.0.1#53(127.0.0.1)
trace
$ dig +trace matoken.org @127.0.0.1

; <<>> DiG 9.11.4-P2-3-Debian <<>> +trace matoken.org @127.0.0.1
;; global options: +cmd
.                       24820   IN      NS      m.root-servers.net.
.                       24820   IN      NS      b.root-servers.net.
.                       24820   IN      NS      c.root-servers.net.
.                       24820   IN      NS      d.root-servers.net.
.                       24820   IN      NS      e.root-servers.net.
.                       24820   IN      NS      f.root-servers.net.
.                       24820   IN      NS      g.root-servers.net.
.                       24820   IN      NS      h.root-servers.net.
.                       24820   IN      NS      i.root-servers.net.
.                       24820   IN      NS      j.root-servers.net.
.                       24820   IN      NS      a.root-servers.net.
.                       24820   IN      NS      k.root-servers.net.
.                       24820   IN      NS      l.root-servers.net.
;; Received 239 bytes from 127.0.0.1#53(127.0.0.1) in 1334 ms

org.                    172800  IN      NS      a0.org.afilias-nst.info.
org.                    172800  IN      NS      a2.org.afilias-nst.info.
org.                    172800  IN      NS      b0.org.afilias-nst.org.
org.                    172800  IN      NS      b2.org.afilias-nst.org.
org.                    172800  IN      NS      c0.org.afilias-nst.info.
org.                    172800  IN      NS      d0.org.afilias-nst.org.
org.                    86400   IN      DS      9795 7 1 364DFAB3DAF254CAB477B5675B10766DDAA24982
org.                    86400   IN      DS      9795 7 2 3922B31B6F3A4EA92B19EB7B52120F031FD8E05FF0B03BAFCF9F891B FE7FF8E5
org.                    86400   IN      RRSIG   DS 8 1 86400 20181018050000 20181005040000 2134 . bYogBWKVV1SnjoHjS5LnLBE1mWC6UwkYT6muOjcHnuMNzJM1DY3YhSCT d9QOYlvvprUyD37xYIQ10BUZQ8hcNpnQ2TPUTNzd621lsqth6QK8zDN6 eP5AvZXlPy+9wni71rJIHy1wzepn9yrh3jp70zZhnEVxxgItWaYzsayY Jf+UfFQPmOKX0gn0GqcQ09CSZHdZhwbUT2AT1Rs0atkj6VaOy2TT1aQ1 gAtGF+5uA4uqLJegiEe/zneTeyuNE5QDQWKUNaeWEDE9kxylhv6m/3vE tQ8EHFpzOL9x+ed25LNcnRXH8K/xCW43R1FyaVNaA6xcsvGHCysqLneI v/RYMQ==
;; Received 813 bytes from 193.0.14.129#53(k.root-servers.net) in 210 ms

matoken.org.            86400   IN      NS      ns-cloud-d2.googledomains.com.
matoken.org.            86400   IN      NS      ns-cloud-d4.googledomains.com.
matoken.org.            86400   IN      NS      ns-cloud-d1.googledomains.com.
matoken.org.            86400   IN      NS      ns-cloud-d3.googledomains.com.
h9p7u7tr2u91d0v0ljs9l1gidnp90u3h.org. 86400 IN NSEC3 1 1 1 D399EAAB H9PARR669T6U8O1GSG9E1LMITK4DEM0T NS SOA RRSIG DNSKEY NSEC3PARAM
h9p7u7tr2u91d0v0ljs9l1gidnp90u3h.org. 86400 IN RRSIG NSEC3 7 2 86400 20181026101800 20181005091800 1862 org. edCrqcIYiHlMMzuacuX0DlobcQkymqClpK5C4QLzsNWtvp942bFRjbb2 WDX/6TsHO0noBNoKH2i+TU70WqpW7sVsXbjV9nkeLMZjxz/VLyAJOXWk 2ITvZwhjbe96lCSAIafm824pBx94ruieKZ2Yj8pYTBIrhDBoffjPhuem 44k=
a85qqkk8n39d1c6m55g8ucjhm6u3jjcs.org. 86400 IN NSEC3 1 1 1 D399EAAB A86TS1MQ34BR2A3D3CT8D5SCHKAPPBPJ NS DS RRSIG
a85qqkk8n39d1c6m55g8ucjhm6u3jjcs.org. 86400 IN RRSIG NSEC3 7 2 86400 20181022152743 20181001142743 1862 org. G15dhaW+53QBX9nTtsIUCnSRrMO0FCkQJE3jydb6hmRQEA328trp9OqK 6fuvl+RZBhBFeMeJV1Tz0Uezp9YvymfRWwdHiiFFLy3KBt5cTZJUXxTZ jXnMT9PoHZcIVJzN65vqQHDI2MzWYoQYr1WoKmJxOC5FQzFctZElyzEq fNQ=
;; Received 654 bytes from 199.19.56.1#53(a0.org.afilias-nst.info) in 217 ms

matoken.org.            120     IN      A       153.121.44.87
;; Received 56 bytes from 216.239.38.109#53(ns-cloud-d4.googledomains.com) in 388 ms

パケットキャプチャしてみる

  • 通常のDNS

dig 2quepghecPeuj.matoken.org
$ sudo tcpdump -n -nn -t -l -A -s0 2>/dev/null | grep 2quepghecPeuj.matoken.org
IP 192.168.2.203.49026 > 192.168.2.211.53: 49901+ [1au] A? 2quepghecPeuj.matoken.org. (66)
E..^.,..@.0t...........5.J..... .........2quepghecPeuj.matoken.org.......).........
E...z.@.@.8f.........5...w............. .2quepghecPeuj.matoken.org..............x...y,W........2....ns-cloud-d2.googledomains.com.........2....ns-cloud-d4.S........2....ns-cloud-d1.S........2....ns-cloud-d3.S.........d.... m.G.......+...."m.........D....$m.r......#P....&m............ .H`H..2.......m.G......+W.. .H`H..4.......m............ .H`H..6.......m.r......Ov.. .H`H..8.......m..)........
^C
  • DNS over HTTPS

名前は見当たらない

dig 2quepghecPeuj.matoken.org @127.0.0.1
$ sudo tcpdump -n -nn -t -l -A -s0 2>/dev/null | grep 2quepghecPeuj.matoken.org
^C

loopback 部分はHTTPSになる前の部分は見える

dig 2quepghecPeuj.matoken.org @127.0.0.1
$ sudo tcpdump -i lo -n -nn -t -l -A -s0 2>/dev/null | grep 2quepghecPeuj.matoken.org
IP 127.0.0.1.52265 > 127.0.0.1.53: 25766+ [1au] A? 2quepghecPeuj.matoken.org. (66)
E..^C...@.8..........).5.J.]d.. .........2quepghecPeuj.matoken.org.......).........
E..bD(@.@..`.........5.).N.ad............2quepghecPeuj.matoken.org..............w...y,W..)........
^C
永続化
$ sudo systemctl enable doh-client

後は /etc/network/interfaces や NetworkManager で DNS server に 127.0.0.1 を指定する.

環境
$ dpkg-query -W git golang dnsutils
dnsutils        1:9.11.4.P2+dfsg-3
git     1:2.19.0-1
golang  2:1.10~5
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

Android 4.0 以降を DNS-over-HTTPS 対応にする Intra を少し試す

Alpabet の技術インキュベータのJigsawというところが作った Intra という Android アプリをリリースしました.

通常の DNS は暗号化されず改ざんが可能です.Intra は DNS を暗号化する DNS-over-HTTPS を Android 4.0 以降で利用できるようにするアプリです.

31226501238 7a637260f1
31226501848 d563502159
31226502538 db0efcae0a

VPN接続の確認がされる

31226505068 5cc4feeeb4

DNS保護状態

31226508208 857594ce32
31226510648 7047e8ef20

DNS-over-HTTPS サーバの既定値はGoogleで,Cloudflareも選択できる.その他のサーバも手動で指定できる

31226511688 8b413ac9b8

DNS は 8.8.8.8 の Google を見に行っているのがわかる

31226512688 975b1b6655

VPNが有効になっているが,IPはそのまま

45100103761 d9692f0075

ダッシュボード画面で最近のクエリの確認も出来る

30162180647 1f64018b79

試した環境は仮想環境のAndroid 8.1.0(x86_64), Intra 1.0.0

44189409735 9ecf88c2c2
44380132464 4d9cbeacae

自分は基本的に出先では VPN を利用しているので必要ないかなと思うのですが,お手軽に無料でかつ古いデバイスにも対応しているので良さそうですね.ちなみにこの機能は Android Pie には標準搭載されているそうです.

#Wi-FiなんかでDNS改ざんして認証画面に飛ばしたりするようなのはどういう動きになるんだろう?

DNSキャッシュサーバなアドブロッカーのPi-holeを試す

2018-08-18 の鹿児島Linux勉強会 2018.08 で発表したものに加筆修正したもの.

アドブロッカー?

  • 広告をブロック

  • ブラウザの拡張機能などで実現するのが一般的(重い&ブラウザ毎に設定が必要)

    • uBlock Origin

    • プライベートブラウジングモードでは(基本的に)利用できない

  • スマートフォンは?

    • rootなどが必要(ウェブブラウジングは拡張機能や広告ブロック機能のあるウェブブラウザなどで回避可能)

Pi-hole

29084865297 4f02afec31

  • DNSキャッシュサーバとして動作して広告をDNSベースでブロック

    • PC側では設定不要 or DNS設定のみ

    • 軽い

  • Webベースの管理画面が利用可能

  • DNS以外にDHCPサーバ機能も利用可能

動作要件

名前にPiとついているし事例が多いがRaspberry Pi以外でも動作する

Hardware
Pi-hole is very lightweight as it only handles DNS queries and returns a blank HTML file so it doesn’t need much processing power.

~52MB of free space
512 MB RAM
Software
Pi-hole will run on most Debian-based distro’s and is the preferred platform for it.

We officially support the following:

Raspbian: Jessie/Stretch
Ubuntu: 16.04 / 16.10
Debian: 8 / 9
Fedora 26
CentOS: 7 (not ARM)

導入例

お手軽なインストールscriptが用意されている
公式ページでは,

curl -sSL https://install.pi-hole.net | bash

とはいえ怖いので,こんな感じで入れた

$ wget -O basic-install.sh https://install.pi-hole.net
$ lv basic-install.sh
$ sudo porg -lp pi-hole bash ./basic-install.sh
  • インストーラはTUIでいくつかの選択肢が表示される

  • 設定はこのあたりに/etc/pihole/setupVars.conf

  • アンストーラーもついているが,パッケージ周りとか面倒(導入済みだったかどうか関係なく関連パッケージを1つづつ確認しないといけない)なのでchroot環境などで試したほうが良い

44003211731 7da5e55b53

DNSの選択

  • Public DNS各種もしくはCustomから任意のDNSが指定可能

  • 今回は自分の家のUnboundを指定

  • 必要なパッケージは自動で導入される

43284561304 664a4c6675
44003212211 af3c239901

ad listの選択

43284561514 57f8f88c59

Protocolの選択

44003212531 6105935e3a

Web管理画面有効無効

43284561704 abff464168
44003212851 7e3c626b79

ログ

43284561874 54e4f14dbd

インストール完了

この画面はメモしておきましょう

44003213001 bbcd67ffcd

もしパスワードを忘れたら

$ pihole -a -p
Enter New Password (Blank for no password):
Confirm Password:
  [✓] New password set

端末のDNSをPi-holeに向けて試す(adhoc)

ネットワークのDNSをPi-holeのipにします

nm-applet

42224130270 b14c28b364

/etc/resolv.conf
nameserver 192.168.2.211

ネットワーク全体に反映

  • DHCPサーバからリリースされるDNS情報をPi-holeのものに差し替える

or

  • DHCPサーバをPi-holeに切り替える

    • Pi-holeのDHCPDは管理画面のSettings → DHCPから有効にできる

から有効にできる

VPN の nameserver に指定

自分は外では VPN を使うが,そのときこの nameserver を指定すると携帯回線でもパケットの消費が抑えられる効果もある

DNSが切り替わったか確認

確認例
$ dig example.com|grep -i server
;; SERVER: 192.168.2.211#53(192.168.2.211)

管理画面

ダッシュボード

43115604235 f07c9c9060

log

43973290462 5af9c902d5

システム情報

29084598777 90979e5772

広告ブロックリスト管理

43303343644 0e3b2de779

DNS設定

30153543558 3e368f177f

DHCP設定

30153549218 78f1098ff5

API/Web管理画面設定

42212991130 cc6ea1e357

プライバシー設定

43973382062 ca95d2fd21

テレポーター(設定のインポートエクスポート)

43973387132 fed8d96213

ログからホワイトリストブラックリストに

ログからドメインをホワイトリスト,ブラックリストに移動できる

43301172114 e220a2a2bc
43113907005 3561309f64

WebIFはoption

pihole commandが存在する

help
$ pihole --help
Usage: pihole [options]
Example: 'pihole -w -h'
Add '-h' after specific commands for more information on usage

Whitelist/Blacklist Options:
  -w, whitelist       Whitelist domain(s)
  -b, blacklist       Blacklist domain(s)
  --wild, wildcard     Wildcard blacklist domain(s)
  --regex, regex       Regex blacklist domains(s)
                        Add '-h' for more info on whitelist/blacklist usage

Debugging Options:
  -d, debug           Start a debugging session
                        Add '-a' to enable automated debugging
  -f, flush           Flush the Pi-hole log
  -r, reconfigure     Reconfigure or Repair Pi-hole subsystems
  -t, tail            View the live output of the Pi-hole log

Options:
  -a, admin           Web interface options
                        Add '-h' for more info on Web Interface usage
  -c, chronometer     Calculates stats and displays to an LCD
                        Add '-h' for more info on chronometer usage
  -g, updateGravity   Update the list of ad-serving domains
  -h, --help, help    Show this help dialog
  -l, logging         Specify whether the Pi-hole log should be used
                        Add '-h' for more info on logging usage
  -q, query           Query the adlists for a specified domain
                        Add '-h' for more info on query usage
  -up, updatePihole   Update Pi-hole subsystems
                        Add '--check-only' to exit script before update is performed.
  -v, version         Show installed versions of Pi-hole, Web Interface & FTL
                        Add '-h' for more info on version usage
  uninstall           Uninstall Pi-hole from your system
  status              Display the running status of Pi-hole subsystems
  enable              Enable Pi-hole subsystems
  disable             Disable Pi-hole subsystems
                        Add '-h' for more info on disable usage
  restartdns          Restart Pi-hole subsystems
  checkout            Switch Pi-hole subsystems to a different Github branch
                        Add '-h' for more info on checkout usage

Pi-hole アップデートの確認とアップデート

Pi-holeのアップデート確認
$ pihole -up --check-only
[i] Checking for updates...
[i] Pi-hole Core: up to date
[i] Web Interface: up to date
[i] FTL: up to date
[] Everything is up to date!
Pi-holeのアップデート
$ pihole -up
広告ドメインリストの更新
$ pihole updateGravity
  [i] Neutrino emissions detected...
  [✓] Pulling blocklist source list into range

  [i] Target: raw.githubusercontent.com (hosts)
  [✓] Status: Retrieval successful

  [i] Target: mirror1.malwaredomains.com (justdomains)
  [✓] Status: No changes detected

  [i] Target: sysctl.org (hosts)
  [✓] Status: No changes detected

  [i] Target: zeustracker.abuse.ch (blocklist.php?download=domainblocklist)
  [✓] Status: No changes detected

  [i] Target: s3.amazonaws.com (simple_tracking.txt)
  [✓] Status: No changes detected

  [i] Target: s3.amazonaws.com (simple_ad.txt)
  [✓] Status: No changes detected

  [i] Target: hosts-file.net (ad_servers.txt)
  [✓] Status: No changes detected

  [✓] Consolidating blocklists
  [✓] Extracting domains from blocklists
  [i] Number of domains being pulled in by gravity: 157918
  [✓] Removing duplicate domains
  [i] Number of unique domains trapped in the Event Horizon: 134681
  [i] Number of whitelisted domains: 0
  [i] Number of blacklisted domains: 0
  [i] Number of regex filters: 0
  [✓] Parsing domains into hosts format
  [✓] Cleaning up stray matter

  [✓] Force-reloading DNS service
  [✓] DNS service is running
  [✓] Pi-hole blocking is Enabled
crontabに登録
# Pi-hole広告ドメインリスト更新
7 3 * * * pihole updateGravity | tee >$(telegram-msg-cron)
# Pi-hole アップデートチェック
11 3 * * *      if [ $(pihole -up --check-only|tail -1|grep -c 'Everything is up to date!') ]; then echo ''; else echo "${HOSTNAME} : please Pi-hole update!" | tee >$(telegram-msg-cron) ; fi

日本向け広告リストを追加してみる

$ echo 'https://280blocker.net/files/280blocker_host.txt' | sudo tee -a /etc/pihole/adlists.list
https://280blocker.net/files/280blocker_host.txt
$ pihole -g

検索すると様々なドメインリストが存在する.用途に合わせて登録すると良さそう.

Pi-hole メリット,デメリット

  • メリット

    • 軽量で動作要件も低い

    • DNSベースなのでスマートフォンなどでもOK!(アプリ内の広告ブロックも)

    • ウェブブラウザの場合でも端末やブラウザ毎に個別に設定する必要がない

    • 設定も簡単で動作も管理画面で確認しやすい

    • 転送量も減る

  • デメリット

    • uBlock Originに比べると広告のブロック率が低い?(見ているsiteにも依るかも)

      • 拡張性があるので好みのリストを追加すれば良さそう

    • 今見えている広告をブロックしたいといったときにはブラウザの拡張機能のほうが便利

    • 広告の動きを確認するにはDNSを切り替える必要があり面倒

      • nm-appletだとPi-holeと通常DNSの設定をそれぞれ作っておくとワンタッチで切り替えられて便利
        43127431915 f050327120

        • PC → Pi-hole → Unbound → ISP

        • PC → Unbound → ISP

      • Wi-Fi AP を Pi-hole 利用とそうでないものの2つ用意する

家庭や小規模ネットワーク向け?

別解

Pi-holeのad listをそのままor整形して/etc/hostsに突っ込めばとりあえずblockできる
(UnboundやDnsmasqとかに入れても)

ad list
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://mirror1.malwaredomains.com/files/justdomains
http://sysctl.org/cameleon/hosts
https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
https://hosts-file.net/ad_servers.txt
listの内容
$ wget -q -O - https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | lv
  :
0.0.0.0 1493361689.rsc.cdn77.org
0.0.0.0 30-day-change.com
0.0.0.0 2468.go2cloud.org
0.0.0.0 adservice.google.nl
0.0.0.0 adsmws.cloudapp.net
  :
$ wget -q -O - https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts|lv
amazon.co.uk.security-check.ga
autosegurancabrasil.com
dadossolicitado-antendimento.sad879.mobi
hitnrun.com.my
maruthorvattomsrianjaneyatemple.org
  :

別解?

ウェブブラウジング時に広告だけでなくトラッキングなども考慮
このあたりはこまめに設定が必要なので一括管理は難しそう

Pi-hole

  • 導入が簡単

  • リソース少なめ

  • 管理画面がわかりやすい

  • 家庭や小規模ネットワーク向け?

QA

*BSDとかでは動かせない?

パッケージの確認と導入周りとネットワーク設定あたりを合わせればいけるのでは?
でもhostsやUnboundなどで設定したほうがきっと楽

広告がdomainではなくipで配信されるようになったら?

ipアドレスを Pi-hole の Block list に登録してみたら登録できた.しかしブロックはできなかった.iptablesなどでブロックする感じ?