以下省略!

タイダルウ(ry ほぼ毎日1記事執筆運動実施中。 ※記事に広告(アフィリエイト)リンクを掲載している場合があります。

NetworkManager+dnsmasq+Stubbyを使ったDNS over TLSで名前解決する環境を作ったメモ

f:id:abyssluke:20190118175106p:plain:w200:left以前紹介した、Stubbyを使ったDNS over TLS(DoT)での名前解決環境の作り方的なメモ。書いておいて公開していなかったので。
※参考URLは忘れた。
※もしかしたら誤りとかあるかも。

前提

  • systemd環境(Ubuntu 18.04)。
  • NetworkManagerで接続を管理している。
  • IPv4/v6デュアルスタック環境(v4のみであっても適用できるが)。
  • dnsmasqはすでにインストールされているようなのでインストール手順は省略。

Stubbyのインストール

$ sudo apt install stubby

Stubbyの設定

Stubbyの設定ファイルを編集し、ポート53000でリッスン、問い合わせ先サーバーとしてCloudflare DNSを使うように設定する。また原則最上位のサーバーのみ使うように設定(エラー時は次のサーバーに切り替わる)。念の為Cloudflare DNS以外のサーバー(GoogleやQuad9など)も設定しておいたほうがいいかもしれない(ここでは省略する)。

$ sudo vi /etc/stubby/stubby.yml
$ echo /etc/stubby/stubby.yml
〜
listen_addresses:
  - 127.0.0.1@53000
  -  0::1@53000
〜
round_robin_upstreams: 0
〜
tls_connection_retries: 5
〜
tls_backoff_time: 300
〜
upstream_recursive_servers:
  - address_data: 1.1.1.1
    tls_auth_name: "cloudflare-dns.com"
  - address_data: 1.0.0.1
    tls_auth_name: "cloudflare-dns.com"
  - address_data: 2606:4700:4700::1111
    tls_auth_name: "cloudflare-dns.com"
  - address_data: 2606:4700:4700::1001
    tls_auth_name: "cloudflare-dns.com"
〜
$ sudo systemctl restart stubby

NetworkManager/dnsmasqの設定

NetworkManagerの設定ファイルをいじり、dnsmasqをNetworkManager経由で起動させるようにする。
その後、dnsmasqの設定ファイルを作り、Stubbyから引くようにする。cache-sizeも忘れずに(デフォルトが0なため)。

$ sudo vi /etc/NetworkManager/NetworkManager.conf
$ cat /etc/NetworkManager/NetworkManager.conf 
[main]
plugins=ifupdown,keyfile
dns=dnsmasq
〜
$ sudo vi /etc/NetworkManager/dnsmasq.d/default.conf
$ cat /etc/NetworkManager/dnsmasq.d/default.conf
no-resolv
proxy-dnssec
server=127.0.0.1#53000
listen-address=127.0.0.1,::1
cache-size=2000

systemd-resolvedのDNSサーバーを止める

127.0.0.53で動作しているsystemd-resolvedのDNSサーバーを止める。
そしてsystemd-resolvedによって生成されたresolv.confのシンボリックリンクを削除する(NetworkManagerに生成させる)。

$ sudo vi /etc/systemd/resolved.conf
$ cat /etc/systemd/resolved.conf
〜
DNSStubListener=no
$ sudo systemctl restart systemd-resolved
$ sudo unlink /etc/resolv.conf

NetworkManagerにDNSを設定する

nmcliでローカルのDNSを使うように強制する。nmcli con*1で適用する接続のUUIDを確認し設定する。

$ sudo nmcli con
NAME        UUID                                  TYPE      DEVICE  
docker0     12345678-9abc-def0-1234-567890abcdef  bridge    docker0 
有線接続 1  09876543-21fe-dcba-0987-654321fedcba  ethernet  enp4s4 
$ sudo nmcli con mod 09876543-21fe-dcba-0987-654321fedcba ipv4.ignore-auto-dns yes
$ sudo nmcli con mod 09876543-21fe-dcba-0987-654321fedcba ipv4.dns 127.0.0.1
$ sudo nmcli con mod 09876543-21fe-dcba-0987-654321fedcba ipv6.ignore-auto-dns yes
$ sudo nmcli con mod 09876543-21fe-dcba-0987-654321fedcba ipv6.dns ::1
$ sudo nmcli con up 09876543-21fe-dcba-0987-654321fedcba
(もしかしたらNetworkManagerごと再起動するか(↓)、PC再起動したほうがいいかも)
$ sudo systemctl restart NetworkManager

確認

Wiresharkで"port 53 or port 853"のルール*2でパケットキャプチャを開始し、1.1.1.1:853*3への暗号化通信のみがあれば大丈夫。
またCloudflare DNSが使われているかどうかはhttps://1.1.1.1/helpを確認すればよい。

キャッシュの確認はdigコマンドを2回連続で実行してみる。

$ dig example.com

; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46218
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1452
; PAD: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ("....................................................................")
;; QUESTION SECTION:
;example.com.			IN	A

;; ANSWER SECTION:
example.com.		10457	IN	A	93.184.216.34

;; Query time: 145 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Fri Mar 29 17:36:21 JST 2019
;; MSG SIZE  rcvd: 139

$ dig example.com

; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 686
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.com.			IN	A

;; ANSWER SECTION:
example.com.		10455	IN	A	93.184.216.34

;; Query time: 0 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Fri Mar 29 17:36:23 JST 2019
;; MSG SIZE  rcvd: 56

dnsmasqの使用状況・キャッシュ状況(ヒット数など)の確認はdnsmasqに対してSIGUSR1を送り、syslog等を確認する。

$ sudo pkill -USR1 dnsmasq
$ tail /var/log/syslog
〜
Mar 29 17:34:39 hogehoge dnsmasq[1309]: time 1553848479
Mar 29 17:34:39 hogehoge dnsmasq[1309]: cache size 2000, 0/2505 cache insertions re-used unexpired cache entries.
Mar 29 17:34:39 hogehoge dnsmasq[1309]: queries forwarded 1027, queries answered locally 454
Mar 29 17:34:39 hogehoge dnsmasq[1309]: queries for authoritative zones 0
Mar 29 17:34:39 hogehoge dnsmasq[1309]: server 127.0.0.1#53000: queries sent 1027, retried or failed 0
〜

*1:connectionの略。cでも可

*2:すでにキャプチャを開始していた場合はフィルタで「tcp.port == 53 || tcp.port == 853」を適用すればよい

*3:サーバーの状況によってはIPアドレスが異なるかも