Linux DNS Debug

Posted by Joe's Notes on Tuesday, October 29, 2019

TOC

我到底用了哪台DNS server?

在Linux上,不管是使用glibc dns resolver或是golang自己實做的dns resolver, 他們都會去查看系統下的 /etc/hosts/etc/resolv.conf 。/etc/hosts沒什麼好說的,下面舉個/etc/resolv.conf的例子

nameserver 127.0.0.53
nameserver 8.8.8.8

這邊的結果代表他會先去查詢 127.0.0.53 如果查不到再去查 8.8.8.8,如果也失敗了再重頭來直到嘗試三次都查不到才宣告放棄。想想,這時候如果是在第三輪才藉由8.8.8.8查到IP,那都浪費多少生命了。

AWS上的DNS 查詢

AWS DNS有哪些?

在AWS上,可以使用的DNS server有 169.254.169.254VPC IPv4 network range加2(假設你的IP range是 10.2.0.0/16 ,你就可以用10.2.0.2當DNS server).差別在前者在某些OS上是不能使用的(例如 Windows Server 2008) 但是在Linux上是沒有問題的。

AWS DNS限制

AWS DNS有每秒不能超過1024次query的限制,假設超過了就會把你throttle。建議的作法是安裝 dnsmasq 他會cache住查詢結果,這樣就不用一直去問啦~預設cache時間是DNS設置的ttl時間,要注意的是,自己延長TTL是有風險的。假設你使用了RDS的服務,他是透過DNS來切換Master/Slave的,當你延長了TTL也就代表當今天Master掛了,你需要花更久的時間才能連到新的Master。

DNS除錯方法

查詢域名是否可以解析

常見的方式是使用dig來看,例如

dig www.google.com

結果會類似

; <<>> DiG 9.11.3-1ubuntu1.9-Ubuntu <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43990
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         22      IN      A       216.58.200.228

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Tue Oct 29 12:18:14 CST 2019
;; MSG SIZE  rcvd: 59

當中的 216.58.200.228 就是解析出來的IP。如果想要指定某台DNS來解析呢?加個 @DNS-IP 例如

dig www.google.com @1.1.1.1

查詢本機域名查詢多頻繁?

上面提到的,AWS會針對DNS查詢限流。那我們要怎麼知道有沒有超過限制呢?可以使用這個command。使用時要替換 /

sudo tcpdump  -r /tmp/<file_name.pcap> -nn dst port 53 | awk -F " " '{ print $1 }' | cut -d"." -f1 | uniq -c

輸出的內容會是

2 06:40:34
2 06:40:42

第一個欄位是查詢次數,第二個欄位是查詢時間。這樣就可以知道查詢的多頻繁了。

另外,你也可以執行下面的command來看一下都在針對哪個域名查詢

sudo tcpdump -i any port 53  -W 123 -C 100 -n -K -Z root

DNS查詢好慢?問題出在那?

有時候我們用 httpstat來檢查整個API查詢是慢在那,結果發現居然是DNS lookup慢了!這時候我們可以用下面的查詢來試試看DNS 查詢到底有多慢。

dig @8.8.8.8  www.cmcm.com  +noall +answer +stats |   awk '$3 == "IN" && $4 == "A"{ip=$5}/Query time:/{t=$4 " " $5}END{print ip, t}'

結果出現

107.155.25.117 245 msec

奇怪到底慢在那呢?最方便的作法是直接用 ultratools 來看,以這個例子來說,我們可以知道整個解析是慢在..dnsv5.com 也就是dnspod的服務…

「您的支持是創作的原動力」

Joe's Notes

您的支持是創作的原動力

使用Wechat(微信))掃描QR Code贊助我吧!


comments powered by Disqus