[Mac/Linux] 使用 host 指令發出 DNS query ANY 封包,同時查詢 IPv4/IPv6 位址
今天在看一個奇怪的問題,
就是我們的程式去 DNS server 問某個網站的 IP,
但有時取回來的是 IPv6 位址、有時是 IPv4+IPv6 位址…
研究了一下,我們使用的程式看來會發出 DNS query type ANY 的封包,
所以 DNS server 理論上會同時回傳 IPv4/IPv6 位址,
只是我們使用的 DNS server 看來有點問題,
有時只回傳了 IPv6,而有時是兩者皆回。
要怎麼模擬發出 DNS query type ANY 的封包呢?
可以用 host -a 這個指令,
例如我想要問 DNS server 8.8.4.4 說 www.google.com 的 IP 是多少?
testuser@localhost ~ $ host -a www.google.com 8.8.4.4 Trying "www.google.com" Using domain server: Name: 8.8.4.4 Address: 8.8.4.4#53 Aliases: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26531 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.google.com. IN ANY ;; ANSWER SECTION: www.google.com. 299 IN A 172.217.160.68 www.google.com. 299 IN AAAA 2404:6800:4012::2004 Received 76 bytes from 8.8.4.4#53 in 14 ms
可以看到發出了 DNS type ANY,且同時取得了 IPv4/IPv6 的位址。
用 Wireshark 抓封包,結果亦是相同:
另外想起來,最近看到了 CloudFlare: RFC8482 – Saying goodbye to ANY 這篇文章,
說 CloudFlare 不再支援 DNS query ANY 這種請求,
因為發出的 DNS query 封包不大,
但回應封包卻因為包含許多資訊,造成了攻擊放大效果。
為了避免這種問題,所以將 DNS query ANY 擋掉了~
手動來試一下,改用 CloudFlare 的 DNS server 1.1.1.1,
同樣使用 host -a 去問 www.google.com 的 IP,
這次就因為 CloudFlare 不支援 DNS query ANY,
因此得到了 NOTIMP (not implemented 未實作) 的結果:
testuser@localhost ~ $ host -a www.google.com 1.1.1.1 Trying "www.google.com" Using domain server: Name: 1.1.1.1 Address: 1.1.1.1#53 Aliases: Host www.google.com not found: 4(NOTIMP) Received 32 bytes from 1.1.1.1#53 in 159 ms
當然,如果單問 IPv4 位址 (DNS query type A) 的話,是有結果的:
testuser@localhost ~ $ host -v -t A www.google.com 1.1.1.1 Trying "www.google.com" Using domain server: Name: 1.1.1.1 Address: 1.1.1.1#53 Aliases: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8888 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 54 IN A 172.217.160.100 Received 48 bytes from 1.1.1.1#53 in 5 ms
單問 IPv6 位址 (DNS query type AAAA) 也沒有問題的囉:
testuser@localhost ~ $ host -v -t AAAA www.google.com 1.1.1.1 Trying "www.google.com" Using domain server: Name: 1.1.1.1 Address: 1.1.1.1#53 Aliases: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9060 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.google.com. IN AAAA ;; ANSWER SECTION: www.google.com. 117 IN AAAA 2404:6800:4012::2004 Received 60 bytes from 1.1.1.1#53 in 8 ms
參考資料:鳥哥的 Linux 私房菜 — DNS Server