一文入門DNS?從訪問GitHub開始

Kerwin發表於2020-07-23

前言

大家都是做開發的,都有GitHub的賬號,在日常使用中肯定會遇到這種情況,在不修改任何配置的情況下,有時可以正常訪問GitHub,有時又直接未響應,來一起捋捋到底是為啥。

GitHub訪問的千層套路

以我家裡的電腦為例,在不修改任何配置,不啟用什麼代理工具的情況下,訪問GitHub會得到以下結果:

???

雖然很戳心,但好歹能展示一部分。

從網上搜了一堆亂七八糟的攻略,知道了可以通過修改電腦的Hosts檔案達到正常訪問的能力,於是胡搜了一通,

步驟:百度經驗

效果如下:

訪問效果依然很感人,最近活動資料不顯示,整個介面載入都快接近2分鐘了,有什麼辦法沒有咧~

站長工具 PING PING PING

都是搞開發的,都會用F12看看網路或者資源請求的地址是什麼,以上面耗時最慢的地址為例,域名為:github.githubassets.com

開啟站長工具的PING功能,地址為:http://ping.chinaz.com/github.githubassets.com

結果如下:

我發現 185.199.108.154 這個IP地址速度快的一批,於是立馬更換 Hosts中該域名對應的IP地址

再次訪問,效果如下:

那句話怎麼說的來著?如什麼什麼般絲滑,我感覺這就非常絲滑~ ?

GitHub專案定時釋出最新Hosts

當然了,如果每次訪問都得折騰一次,那滋味,簡直不要太難受,所以網上已經有人開源了相關的專案,會定時釋出最新的 GitHub IP地址,連結:https://github.com/521xueweihan/GitHub520

本文撰寫時的Hosts

# github
185.199.108.154               github.githubassets.com
199.232.68.133                camo.githubusercontent.com
52.168.24.190                 github.map.fastly.net
199.232.69.194                github.global.ssl.fastly.net
140.82.112.4                  github.com
140.82.112.5                  api.github.com
199.232.68.133                raw.githubusercontent.com
199.232.68.133                user-images.githubusercontent.com
199.232.68.133                favicons.githubusercontent.com
199.232.68.133                avatars5.githubusercontent.com
199.232.68.133                avatars4.githubusercontent.com
199.232.68.133                avatars3.githubusercontent.com
199.232.68.133                avatars2.githubusercontent.com
199.232.68.133                avatars1.githubusercontent.com
199.232.68.133                avatars0.githubusercontent.com

該專案會自動釋出在指定的地址上,結合軟體使用,可以完全自動化,無需持續更新

當然也可以自行手動更改

為什麼改了Hosts就能訪問GitHub

平常都是百度 + 谷歌,今天非要探究一下原理!我們們一步一步來,首先大家都需要明確一點,在網路的世界中 域名 只是為了便於記憶和識別而存在的一個唯一地址,真正工作的仍然是 IP

Hosts檔案是幹嗎的

簡單來說,Hosts檔案是儲存本機網址域名與其對應的IP地址的一個檔案,在網路請求階段發揮作用

為什麼改了Hosts就能生效

這就涉及到了域名解析,因為Hosts檔案存放的就是 域名IP 的對應關係,因此它可以在域名解析階段發揮作用,為什麼呢?因為在域名解析的流程中 本機Hosts 解析處於順序二

即:瀏覽器解析 -》本機解析 -》XXXX(後面的稍後再提)

所以有時候我們白嫖軟體,都會改一下 Hosts,因為需要把它線上驗證的域名指向錯誤的地址去,另外可能存在一定的瀏覽器快取或者本機快取,可以通過重開瀏覽器或者 PING 域名來檢查更改是否生效。

DNS解析到底是什麼玩意?

上文中多次提到解析,其實說的就是 DNS解析

同時上文也提到過,在網路世界中真正發揮作用的是 IP,而一般情況下我們訪問的都是 域名,為什麼能實現這種效果,就是因為域名與IP地址的對應關係儲存在一個叫做 DNS(Domain Name System) 的系統裡。DNS是一個全球化的分散式資料庫,它所提供的服務就是將域名轉換為網際網路IP地址。

DNS解析的全部流程

網上的關於流程的圖很多,我從中借鑑了一副,如下所示:

  1. 瀏覽器快取:一次請求會首先通過瀏覽器快取資訊尋找域名對映的IP地址,這也是為什麼有時候我們改了本機hosts,需要關閉再開啟瀏覽器才能正常使用,如果找到則返回,沒找到則繼續到下一級

  2. 本機系統快取:即上文中提到的,通過 hosts 檔案來對映域名和IP,在上古時期有很多垃圾軟體會悄咪咪的修改系統的 hosts檔案,達到 DNS劫持 的目的,即把淘寶域名指向另一個 IP,然後部署一個高仿的淘寶商城,靜靜等你輸入賬號,密碼,然後涼涼...

  3. 本地域名解析服務系統:本地域名系統LDNS一般都是本地區的域名伺服器。離你的位置都比較近,Windows系統使用命令ipconfig 就可以檢視,在Linux和Mac系統下,直接使用命令 cat /etc/resolv.conf 來檢視LDNS服務地址。
    LDNS一般都快取了大部分的域名解析的結果,大部分的解析工作到這裡就差不多已經結束了

    以下即是所謂的 遞迴解析


  4. 根域名解析:本地域名解析服務系統無法解析時,會向 13根 發起域名解析請求

    說明: 所謂的 13根,指的是根域名伺服器,是架構因特網所必須的基礎設施。根伺服器主要用來管理網際網路的主目錄,由於DNS解析中採用的是UDP協議,僅能傳遞512位元組的有效報文,因此只能構建出A-M 13個根伺服器,而真正工作執行肯定不止13臺伺服器,而是包含很多伺服器映象的

  5. 根域名解析伺服器返回 gTLD (Generic top-level domain) 給本地解析伺服器,即該域名所屬的頂級域及其所在的伺服器,頂級域名即如:.com .cn等等

  6. 本地解析伺服器已知頂級域名伺服器地址後,發起解析請求

  7. 頂級域名解析伺服器返回 許可權域名伺服器 資訊給本地解析伺服器,許可權域名伺服器 即如:taobao.com

  8. 本地解析伺服器已知許可權域名伺服器地址後,發起解析請求

  9. 許可權域名伺服器返回域名對應的IP地址給本地解析伺服器

  10. 本地解析伺服器快取相關資訊,並返回給使用者

是不是有點繞?我們們來整個圖吧,遞迴解析 如下所示:

再問一遍為什麼改Hosts就可以訪問GitHub

瞭解了上文之後,對於這個問題就更好回答了,因為GitHub畢竟為外國的網站,我們們訪問時有一層 DNS汙染,即把對應的域名指向了不可達的IP上,或者禁止訪問的IP上,因此很多時候無法使用

修改Hosts檔案後即避免了DNS汙染,直達目標IP,即可正常訪問了,當然了,這種方法是全部通用嗎?

答案:肯定不是,因為剛才也提到了,閘道器層是可以控制某些IP禁止訪問的

整一個工具來驗證一下猜想,順便看看我們的整個請求流程:

軟體名:BestTrace

我請求的域名是 github.githubassets.com,最終請求接收方IP和我Hosts配置的IP一致,那我換一個 facebook.com

可以看到,當請求到達 221.183.46.249 這個IP時,整個請求就被攔截下來了,因此這並不是萬能的辦法

除了訪問GitHub,還有什麼時候可能用到呢?

比如下載 IDEA外掛時,如果發現老是重新整理不出來外掛庫,或者下載失敗,就可以通過PING工具去配置最佳IP,方便下載~

DNS除了解析還能做什麼

智慧DNS

網路請求交由域名解析伺服器來處理,分配到最佳的伺服器IP上

例如:請求的源頭是電信還是聯通等,如果是電信則將解析的IP分流到電信對應的IP上,或者返回距離最近的伺服器IP地址

反向代理水平擴充套件

典型的網際網路架構中,可以通過增加web-server來擴充web層的效能,但反向代理nginx仍是整個系統的唯一入口

如果系統吞吐超過nginx的效能極限,那麼將難以擴容,此時就需要dns-server來配合水平擴充套件。

即DNS解析伺服器有序的把域名解析到不同的閘道器層,每次DNS解析請求,輪詢返回不同的ip,這樣就能實現nginx的水平擴充套件,這個方法叫 “DNS輪詢

最後

參考資料:

部落格園 DNS解析全過程分析

除了解析域名,DNS還能幹嗎

如果覺得對你有用的話,不要忘記點個贊啊~ 也可以掃描二維碼關注我,一起朝著技術人的頂峰前進!

相關文章