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かなぁ。