DNS over HTTPSで名前解決を保護する。

角川の金盾の件も頭の片隅には置きつつ、それ以前に、名前解決が平文で行われるのはセキュアではないよね、と思ったので、最近話題のDNS over HTTPSを使って名前解決が出来るようにしてみる。
環境はUbuntu 18.04 LTS。
まずはdnscrpyt-proxyをインストールする。

sudo add-apt-repository ppa:shevchuk/dnscrypt-proxy
sudo apt install dnscrypt-proxy

で、設定ファイルを変更。
/etc/dnscrypt-proxy/dnscrypt-proxy.toml

--- dnscrypt-proxy.toml.orig	2018-10-16 21:15:17.821726742 +0900
+++ dnscrypt-proxy.toml	2018-10-16 21:23:20.394256628 +0900
@@ -27,13 +27,13 @@
 ## The proxy will automatically pick the fastest, working servers from the list.
 ## Remove the leading # first to enable this; lines starting with # are ignored.
 
-# server_names = ['scaleway-fr', 'google', 'yandex', 'cloudflare']
+server_names = ['google', 'cloudflare']
 
 
 ## List of local addresses and ports to listen to. Can be IPv4 and/or IPv6.
 ## Note: When using systemd socket activation, choose an empty set (i.e. [] ).
 
-listen_addresses = []
+listen_addresses = ['127.0.0.1:53']

server_namesはお好みで。GoogleのとCloudflareのがあればいいだろうって判断したけど、検閲絡みのハナシを考えるとscaleway-fr(フランス?)とかyandex(ロシア)のも入れておいたほうがいいのかな。とはいえ起動時のRTT判定で十中八九Cloudflareが選択されるので変化はないかも。
このままでは起動しなかったので、systemdのUnitファイルにちょっと書き足す。
/lib/systemd/system/dnscrypt-proxy.service

--- dnscrypt-proxy.service.orig	2018-10-16 21:16:23.818348613 +0900
+++ dnscrypt-proxy.service	2018-10-16 23:09:48.422039898 +0900
@@ -20,6 +20,7 @@
 CacheDirectory=dnscrypt-proxy
 LogsDirectory=dnscrypt-proxy
 RuntimeDirectory=dnscrypt-proxy
+AmbientCapabilities=CAP_NET_BIND_SERVICE
 
 [Install]
 Also=dnscrypt-proxy.socket

この変更入れないと、DynamicUser=yesだから一般ユーザとして起動するのに、53番をlistenしようとしてコケるんだよね。
で、systemd-resolvedを殺す。

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

最後に、名前解決をlocalhostでやるようにする。

$ cat /etc/resolv.conf
nameserver 127.0.0.1:53

再起動して完了。システムごとでもいいし、サービス再起動でも動くはず。

sudo systemctl restart dnscrypt-proxy
sudo systemctl restart NetworkManager