DoH

DNS over HTTPS のデモです。

デモ


Intra の設定例

適当な DoH クライアントでエンドポイントに https://dns.maya.st/resolve を指定してください。右は Jigsaw Intra の設定例。

最近の firefox なら、about:config から network.trr.uri にエンドポイントを指定、さらに network.trr.mode に 2 ( = DoH を優先して利用)を設定してください。ちなみに 0 は通常の DNS のみ、1 は通常の DNS を優先、3 は DoH のみ利用。trr とは trusted recursive resolver のことらしい。

あるいは、以下のフォームで JSON 形式の応答が得られます。

name:
type:
flag: DO CD

DoH クライアントも作りました。の実行には Knot Resolver および lua-http がインストールされている必要があります(動いている必要はありません)。実行例:

% ./hdig +dnssec chigumaya.jp https://dns.maya.st/resolve
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 0
;; Flags: rd qr ad ra; QUERY: 1; ANSWER: 2; AUTHORITY: 0; ADDITIONAL: 1

;; OPT PSEUDOSECTION:
false;; QUESTION
;; chigumaya.jp.        A       IN

;; ANSWER
chigumaya.jp.           86400   A       160.16.73.77
chigumaya.jp.           86400   RRSIG   A 8 2 86400 20181101005133 20181017232133 22455 chigumaya.jp. E6N+K+VYnBd48DkpPxfhjrvPLu5zrAEdflVx5ADDnU9FKMLgoOWtjKNXRrbt6ymSTgMgFssH8+VYgBJRofMkZ1BATy3MUj2h4HndcKaDN2lzIV80WAucyf2lhVFfcB6aFMnIo63f40IQ/3ZfoSLCt9kyPMolju1A5s6RXzzhhxY=

;; ADDITIONAL

以下解説。

構成

Knot Resolver (kresd) で動いてます。

一般的に DoH サーバを実装するなら以下のような構成になると思いますが、

+------------+                +------------+             +------------+
| doh client | ----(https)----| Web server |----(dns)----| DNS server |
+------------+                +------------+             +------------+

このデモでは以下のような構成になってます。

+------------+                +------------+
| doh client | ----(https)----| DNS server |
+------------+                +------------+

DNS サーバ自身が HTTPS リクエストを直接受けて解釈してます。このデモではサーバ側の都合で前段に apache の reverse proxy が入ってますが、なくても動きます。Knot Resolver は DNS サーバなのに HTTP/2 を喋れるのですが、apache が HTTP/1.1 しか喋らないので(mod_http2 を入れればいいんだけどめんどくさいので)、このデモは HTTP/1.1 限定です。

仕様

以下をサポート。

どちらの形式を使う場合もエンドポイントは同一です。

ソース

% git clone https://dns.maya.st/doh.git

あるいは、以下のファイルを持ってってください。

無保証。

使い方

kresd の config ファイルの中で以下のように記述してください。

modules.load('http')
doh = require 'doh'
http.config {
   host = '127.0.0.1', port = 443,
}
http.add_interface {
   host = '192.0.2.1', port = 443,
   endpoints = {
      ['/dns-resolve'] = { 'application/json', doh.serve_doh }
   },
}

/stats など内部情報が見える URI が外からアクセスされないよう、かならず外部公開用の別アドレスを用意して、http.add_interface() で設定してください。

詳細はkresd のドキュメントを参照してください。

まともな DoH モジュールは cloudflare の中の人が作ったものが kresd に寄贈してもらえることになってるので、こんなものは使わずそっちを待ちましょう。


やまぐちたかのり <y@maya.st>