JPNICロゴ

1.1.1.1 を DNS over HTTPS で試す

投稿者 tech_team on 2018年4月27日


2018年4月、APNICとCloudflare社が共同でパブリックDNSサービスを開始しました。

1.1.1.1 — the Internet's Fastest, Privacy-First DNS Resolver
(HTMLソースでもアピールしてますね)

使用するには、各種OSで問い合わせ先DNSサーバに 1.1.1.1 を使用するように設定すれば利用可能です。以下、Ubuntu Linux を用いて試してみましたのでご紹介します。

設定の前に、まずは名前解決できるかどうか確認します。

$ dig @1.1.1.1 www.apnic.net

;; QUESTION SECTION:
;www.apnic.net.			IN	A

;; ANSWER SECTION:
www.apnic.net.		194	IN	CNAME	www.apnic.net.cdn.cloudflare.net.
www.apnic.net.cdn.cloudflare.net. 194 IN A	104.20.22.173
www.apnic.net.cdn.cloudflare.net. 194 IN A	104.20.36.173

;; Query time: 7 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Wed Apr 25 16:25:26 JST 2018
;; MSG SIZE  rcvd: 117

特に問題なさそうです。脱線しますが www.apnic.net は cloudflare を利用しているようです。

次にリゾルバの設定をします。 /etc/resolv.conf に一行記述します。

nameserver 1.1.1.1

確認します。

$ dig www.nic.ad.jp

;; QUESTION SECTION:
;www.nic.ad.jp.			IN	A

;; ANSWER SECTION:
www.nic.ad.jp.		300	IN	A	192.41.192.145

;; Query time: 27 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Wed Apr 25 16:28:42 JST 2018
;; MSG SIZE  rcvd: 58

こちらも問題なく名前解決できました。

パブリックDNSとして 1.1.1.1 を利用するだけなら、これだけで終わりなのですが、利用可能なサービスとして DNS over HTTPS (DoH) もありますので試してみましょう。

1.1.1.1 のオフィシャル(?)クライアントとして 、 cloudflared というものが紹介されています。しかしこれは、 Cloudflare社 が提供している webサービス用のアプリケーションで、DoH専用というわけではないため今回は使用しません。代わりに dnscrypt-proxy というプログラムを使用します。

この dnscrypt-proxy は、元々 DNSCrypt という独自のDNS暗号化プロトコルを実装したものですが、最近のバージョンで DoH がサポートされました。

以下の場所からダウンロードし、展開します。

https://github.com/jedisct1/dnscrypt-proxy/releases/latest

$ wget -q https://github.com/jedisct1/dnscrypt-proxy/releases/download/2.0.10/dnscrypt-proxy-linux_x86_64-2.0.10.tar.gz
$ tar zxf dnscrypt-proxy-linux_x86_64-2.0.10.tar.gz

設定ファイルを変更します。

$ cd linux-x86_64
$ cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
$ vi dnscrypt-proxy.toml
ipv6_servers = true
dnscrypt_servers = false
doh_servers = true
server_names = ['cloudflare']

IPv6の問い合わせを有効にしてプロトコルを DoHのみにしています。また、参照先のキャッシュサーバとしてGoogle Public DNS も利用できますが、今回は cloudflare に限定します。

編集が終わったら起動します。

$ sudo ./dnscrypt-proxy

動作を確認してみます。

$ dig @127.0.0.1 www.nic.ad.jp

;; QUESTION SECTION:
;www.nic.ad.jp.			IN	A

;; ANSWER SECTION:
www.nic.ad.jp.		599	IN	A	192.41.192.145

;; Query time: 78 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Apr 25 16:44:46 JST 2018
;; MSG SIZE  rcvd: 71

無事引けました。port 53 ではなく port 443 が使われていることも確認します。tcpdump を起動し DNSを引いてみます。

$ sudo tcpdump -i wlp3s0 -n port 53 or port 443
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp3s0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:53:07.839399 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [S], seq 2130288138, win 29200, options [mss 1460,sackOK,TS val 1398542579 ecr 0,nop,wscale 7], length 0
16:53:07.859444 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [S.], seq 2047449329, ack 2130288139, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 10], length 0
16:53:07.859518 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [.], ack 1, win 229, length 0
16:53:07.859747 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [P.], seq 1:192, ack 1, win 229, length 191
16:53:07.870894 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [.], ack 192, win 30, length 0
16:53:07.876035 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [.], seq 1:1461, ack 192, win 30, length 1460
16:53:07.876063 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [.], ack 1461, win 251, length 0
16:53:07.876082 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [P.], seq 1461:2885, ack 192, win 30, length 1424
16:53:07.876095 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [.], ack 2885, win 274, length 0
16:53:07.905507 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [P.], seq 192:285, ack 2885, win 274, length 93
16:53:07.912123 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [P.], seq 2885:2936, ack 285, win 30, length 51
16:53:07.912168 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [P.], seq 2936:3005, ack 285, win 30, length 69
16:53:07.912198 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [.], ack 3005, win 274, length 0
16:53:07.912374 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [P.], seq 285:378, ack 3005, win 274, length 93
16:53:07.916913 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [P.], seq 378:687, ack 3005, win 274, length 309
16:53:07.921243 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [P.], seq 3005:3043, ack 378, win 30, length 38
16:53:07.925262 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [P.], seq 3043:3085, ack 687, win 31, length 42
16:53:07.925297 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [P.], seq 3085:3470, ack 687, win 31, length 385
16:53:07.925317 IP 1.0.0.1.443 > 192.168.0.78.58794: Flags [P.], seq 3470:3508, ack 687, win 31, length 38
16:53:07.925411 IP 192.168.0.78.58794 > 1.0.0.1.443: Flags [.], ack 3508, win 297, length 0

通信先が1.1.1.1ではなく冗長アドレスの 1.0.0.1 ではありますが port 443 宛と通信しており port 53 は使われていないことが分かります。(サービス用のIPアドレスは 1.1.1.1、1.0.0.1、2606:4700:4700::1111、2606:4700:4700::1001 です)

というわけで簡単ではありますが DNS over HTTPS を動かしてみたというご紹介でした。IETF の doh WGでは標準化に向け作業が進んでいます。ご紹介の通り、running codeとしてもいくつかの実装がすでに存在している状況です。昨今のプライバシーに関する話題も盛り上がっており、今後も注目すべき技術の一つだと思います。