我正在编写一个脚本,需要使用用户指定的 DNS 服务器查询 DNS 记录。DNS 服务器可以采用任何协议,包括 UDP、TCP、DNS over HTTPS (DoH) 和 DNS over TLS (DoT)。
我知道dig
能够处理 UDP 和 TCP 的 DNS(带+tcp
标志)。我可以使用其他方法dig
或其他工具来查询 DoH 和 DoT 服务器吗?
我更喜欢已经存在的流行工具,这样curl
我的脚本就更具可移植性,但也欢迎其他建议。
答案1
我没有找到一个可以同时满足这两个目的的工具,但我确实找到了使用它们的方法。
查询 DoH 有两种方式:
# json
curl -H 'accept: application/dns-json' 'https://cloudflare-dns.com/dns-query?name=example.com&type=A' | jq .
# dns wireformat
curl -H 'accept: application/dns-message' 'https://dns.google/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB' | hexdump -c
对于 DoT,您可以使用kdig
提供的工具knot
。命令行类似于dig
:
apt-get install knot-dnsutils
# For macOS:
# brew install knot
kdig -d @8.8.8.8 +tls-ca +tls-host=dns.google.com example.com
其中8.8.8.8
是 tls 主机的预解析地址 ( dns.google.com
)。
更新:这是一个工具(https://github.com/ameshkov/dnslookup) 它本身支持所有主要的 DNS 协议,并且能够生成机器可读的输出。
答案2
卷曲有官方卫生部自 7.62.0 版本开始支持(问题是您的目标端点中有多少个已将 curl 更新至此版本。)
利用--doh-url
选项使用它。例如:
curl --doh-url https://cloudflare-dns.com/dns-query https://www.google.com
看: https://github.com/curl/curl/wiki/DOH-implementation https://daniel.haxx.se/blog/2018/09/06/doh-in-curl/
答案3
答案4
除了 DoT(正如其他用户在这里提到的),的最新版本dig
还支持使用+https
标志进行 DoH 查询。
+https[=value], +nohttps
This option indicates whether to use DNS over HTTPS (DoH) when querying name
servers. When this option is in use, the port number defaults to 443. The
HTTP POST request mode is used when sending the query.
If value is specified, it will be used as the HTTP endpoint in the query URI;
the default is /dns-query. So, for example, dig @example.com +https will use
the URI https://example.com/dns-query.
例子,
dig @cloudflare-dns.com +https foobar.com
通过声明+https
,dig
将通过端口 443 上的 HTTPS 查询提供的 DNS 服务器域(cloudflare-dns.com
)到默认端点/dns-query
。
实际上,上述命令将发送一个 DoH(POST)请求foobar.com
到:
有选项可以切换到 GET 请求,声明不同的端点等。阅读手册页与 DoH 相关的查询选项如下:
+https
+https-get
+https-post
+http-plain
+http-plain-get
+http-plain-post