帶你熟悉雲網路的「電話簿」:DNS

摘要:無論你域名怎麼解析,最終我還是要用IP和別人通訊的。域名只是你的皮囊,IP才是你的靈魂。

本文分享自華為雲社區《《跟唐老師學習雲網路》 – DNS電話簿》,作者: tsjsdbd 。

由於TCP/IP網路協議在通訊的時候,雙方都是用IP地址的。所以整個報文來回過程中,並沒有DNS什麼事情的。只要雙方IP都知道,那麼系統中有沒有DNS都無所謂的。

DNS的最大作用就是把:「名字」==》翻譯為==》「IP地址」。

手機地址簿

DNS等於是一個大號版的「地址簿」。跟你手機打電話一樣,你最終撥打出去的肯定是手機號。

而你查找聯繫人,只是為了獲得對方手機號碼而已。假如你腦袋裡已經默記了號碼,那是可以直接撥號通話的,並不需要先打開「聯繫人or地址簿」的。

DNS域名解析,是我們在網路中很容易接觸到的通訊過程。有時候網路不通,並不是你和對方無法連通,只是你無法根據名字「翻譯」為對方的實際IP地址,千萬不要被主次問題給困惑了。很多時候,如果可以查詢到實際IP,實際網路則是通的。(當然,知道了IP,網路還是不通的話,可以複習下唐老師之前的網路課程)。

域名的來源

兩台電腦在通訊的時候,是使用之前介紹過的網路協議棧(即TCP/IP)的。

但是,有時候,IP地址屬實不好記憶。別說是IPV4了,後面IPV6地址,根本就不是給人記的。就跟電話號碼一樣,多了就是不好記,必須得把號碼關聯到一個「人名」上,用來助記。

於是,這個世界上就有了「域名」一詞,用來助記IP地址。 你想: 總比 20.205.243.166 好記吧?所以大家都愛記名字,然後在通訊之前,不閑麻煩的先翻譯一次。

怎麼把名字變成IP,就是DNS解析過程了。這個時候就得有個「專門記錄名字=>IP」的伺服器。

DNS伺服器

搞協議的那幫人,為了解決名字==》IP的問題。引入了一個叫做域名伺服器的東西。

這個DNS伺服器,就是一個 key-value 的大號map表。大概就是 :

Key[名字] –> Value(IP地址)

所以DNS伺服器,都挺小巧的。它的複雜是在於DNS伺服器之間可以級聯, 這個後面再細說。總之它就是一台很小的 key-value的Server。

本地快速解析

有時候,區域網裡面,還得自己搭建一台DNS伺服器,也挺麻煩。 那有沒有簡單點的 ,直接把key-value先寫死頂著用一下先的辦法?

答案是有的,就是咱們的 /etc/hosts 文件啦。(windows則是C:\Windows\System32\drivers\etc\hosts文件)

它的內容是長這樣的:

# value(IP)  key(域名)
192.168.1.11  www.google.com

你可以試著增加一行,然後看看在瀏覽器裡面,訪問這個網站是不是變了。

我這裡直接ping這個網址

# ping google.com
PING google.com (192.168.1.11) 56(84) bytes of data.

你看,地址就變成文件中指定的IP了。

查詢DNS的命令行

一般我就用2個, nslookup 和 dig

apt-get install dnsutils

安裝之後,這2個命令行,就都有了。

nslookup命令

這個是用的最多的,格式是:

nslookup 目標域名

比如:

上面的Server地址,是指問了「哪個DNS伺服器」。而下面標紅線的IP,則是它給你的答覆:「的IP是 93.46.8.90」

域名找不到IP,則是這樣:

dig命令行

這個dig比nslookup好的地方在於,它可以指定DNS伺服器,來幫你解析域名。

格式:

dig  目標域名
dig  @特定DNS伺服器 目標域名

中間的 @參數,是可選的。

能不能解析,看紅圈那個 ANSWER,如果是0,那說明解析不了這個域名。

最後試下指定 DNS伺服器來解析域名。

上圖裡指定,用10.129.54.132 這台DNS伺服器來幫我們解析域名。

DNS協議

這個DNS協議非常的簡單,就是一問一答的格式,沒什麼握手過程。

客戶端問:「請問zz的ip是多少

服務端答:「哦,是xx.xx.xx.xx」。 或者「我不知道」。

協議默認埠是53. 所以在定位問題的時候,可以試著抓埠53的報文,看看你和DNS伺服器之間是否還和諧。

絕大多數時候使用的是UDP協議,但也可以用TCP(很少)。

指定DNS伺服器

系統默認的DNS伺服器,(即默認應該去哪個DNS伺服器查詢IP),一般都是管理員幫我們配置好的。

但是我們也可以自己修改,在 /etc/resolv.conf 文件中。

cat /etc/resolv.conf
nameserver 10.129.2.34

nameserver這一行,可以copy多行,當第一個DNS伺服器不可用時,會自動去問第2個DNS伺服器。

如:

cat /etc/resolv.conf
nameserver 10.129.2.34
nameserver 100.79.1.250
nameserver 100.79.1.46

這樣有配置3台DNS伺服器

高級配置參數

這個 /etc/resolv.conf文件中,還可以配置一些高級參數。

  • search:查詢DNS域名時,會往你查詢的域名尾部,額外補全的內容。
  • ndots:控制補全的最大長度。

這個會在Kubernetes的Service特性裡面用到,等需要的時候,可以自己去深入研究下。

平時用不到這些高級參數。

DNS級聯

DNS有個級聯機制,即:當我(DNS伺服器)這裡的key找不到value時,我可以問我的上級。上級不懂再問上級,全球有幾台頂級的根域名伺服器。

所以你想要擁有全球知名的網址(域名),都都是被收割的對象,因為取名權,被他們壟斷了。想取一個「大家都認得」的名字,得老貴了。除非咱們自己不聯網,區域網內自己玩,那麼愛取什麼名字就用什麼名。

回到你本地機器,查詢DNS域名的時候,整個過程大致如下:

如果問了一圈還找不到,就會告訴你,這個域名確實解析不了(要麼就是根本不存在這個域名,要麼就是你的DNS伺服器里沒這條記錄,並且也得不到上級的答案)。

ps,無論你域名怎麼解析,最終我還是要用IP和別人通訊的。域名只是你的皮囊,IP才是你的靈魂。

 

點擊關注,第一時間了解華為雲新鮮技術~