それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

sslhでdohが捌けないのは dns-crypt 特定フラグのせいだった。nginx

SSLHで dohをさばけない

dig DoHでDNS問い合わせがうまく行かないと思って4時間格闘した結果、DoHはdns-cryptなので、純粋なSNI/ALPNではないとわかった。まじかよ。それTLS特定フラグで識別可能じゃん。暗号化解除しなくても止められちゃうじゃん。

色々調べると、DoHにはclient-magic of 0x42.が付与されるっぽい。

https://github.com/yrutschle/sslh/issues/164

<dnscrypt-query> ::= <client-magic> <client-pk> <client-nonce> <encrypted-query>

sslhの設定例

SSLHをnginxの代わりに使っているのだが、doh はSNIでは捌けてなかった。

以下のようにすると処理できた。

//DoHを別サーバで処理する例
  {
    name: "tls";
    regex_patterns: [ "^\x42"]
    host: "192.168.200.21";
    port: "443";
    log_level: 0;
    tfo_ok: true
  },

0x42 を書くことで、DoHのパケットを識別できた。

これって、さ、ルータでTLSの暗号文をみて、0x42をもつパケットを拒否すれば、DoHで抜けるの防止できるってことだよね。。。

nginxの場合

nginxの場合は、TLSを設定すれば通った。ALPNかなぁ。