本文希望通過一篇文章解決所有域名解析中相關的問題
Linux下域名解析流程
- DNS域名解析的時候先根據 /etc/nsswitch.conf 配置的順序進行dns解析(name service switch),一般是這樣配置:hosts: files dns 【files代表 /etc/hosts ; dns 代表 /etc/resolv.conf】(ping是這個流程,但是nslookup和dig不是)
- 如果本地有DNS Client Cache,先走Cache查詢,是以有時候看不到DNS網絡包。Linux下nscd可以做這個cache,Windows下有 ipconfig /displaydns ipconfig /flushdns
- 如果 /etc/resolv.conf 中配置了多個nameserver,預設使用第一個,隻有第一個失敗【如53端口不響應、查不到域名後再用後面的nameserver頂上】
Linux下域名解析流程需要注意的地方
- 如果 /etc/resolv.conf 中配置了rotate,那麼多個nameserver輪流使用. 但是因為底層庫的原因用了rotate 會觸發nameserver排序的時候第二個總是排在第一位
- 如果被解析的域名不是以 "." 結尾,那麼解釋失敗後還會嘗試resolv.conf中search追加到後面, resolv.conf最多支援6個search域
- ping調用的是glibc的 gethostbyname() 函數流程--背後是NameServiceSwitch,nslookup不是.是以你會經常看到其中一個可以另一個不可以,那麼就要按第一部分講解的流程來排查了。
Linux下域名解析診斷工具
- ping
- nslookup (nslookup domain @dns-server-ip)
- dig (dig +trace domain)
- tcpdump (tcpdump -i eth0 host server-ip and port 53 and udp)
- strace
微服務下的域名解析、負載均衡
微服務中多個服務之間一般都是通過一個vip或者域名之類的來做服務發現和負載均衡、彈性伸縮,是以這裡也需要域名解析(一個微服務申請一個域名)
域名解析通過jar、lib包
基本與上面的邏輯沒什麼關系,jar包會去通過特定的協定聯系server,解析出域名對應的多個ip、機房、權重等
域名解析通過dns server
跟前面介紹邏輯一緻,一般是/etc/resolv.conf中配置的第一個nameserver負責解析微服務的域名,解析不到的(如baidu.com)再轉發給上一級通用的dns server,解析到了說明是微服務自定義的域名,就可以傳回來了
如果這種情況下/etc/resolv.conf中配置的第一個nameserver是127.0.0.1,意味着本地跑了一個dns server, 這個服務使用dns協定監聽本地udp 53端口
驗證方式: nslookup 域名 @127.0.0.1 看看能否解析到你想要的位址
kubernetes 和 docker中的域名解析
一般是通過iptables配置轉發規則來實作,這種用iptables和tcpdump基本都可以看清楚。如果是叢集内部的話可以通過CoreDNS來實作,通過K8S動态向CoreDNS增删域名,增删ip,是以這種域名肯定隻能在k8s叢集内部使用