運維老鳥闡述:滬江從DNS到httpdns的演進


內容來源:2017年7月22日,滬江運維工程師周峯在「餓了麼技術沙龍【第九彈】上海研發中心·運維專場」進行《滬江DNS到httpdns的演變》演講分享。IT 大咖說(微信id:itdakashuo)做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。
java

閱讀字數:2354 | 5分鐘閱讀python

嘉賓演講視頻及PPT回顧: suo.im/1Sn8cr

摘要

HttpDNS服務是一款能夠有效解決域名劫持的方案,而且已在各家大廠普遍應用,現已成爲一款至關成熟的產品,本次分享主要圍繞滬江由DNS到HTTPDNS演進進行,但願可以給你們帶來一些啓發。緩存

DNS的簡介

DNS的全稱是Domain Name System,它的目的就是將一個域名解析到一個IP。基礎的DNS會用到TCP/UDP協議的53號端口,默認的是UDP協議,若是對服務質量要求比較高的話建議使用TCP。安全

Why We Need DNS?

在TCP的IP協議中約定,主機之間通訊必須經過IP。可是IP地址難以記憶,因此通常都是經過域名來訪問網站。且因爲程序在對域名進行調用的時候不能去寫死IP,因此要使用FQDN的方式。服務器

名詞解釋

以mail.cctv.com爲例,它的頂級域名是.com,二級域名是cctv,三級域名是mail同時也是cctv的子域。最後根域名就是「 . 」了,可是通常不會寫出來。微信

權威DNS也就是一般來講的「說了算」服務器,是用來告訴用戶域名具體解析到哪一個IP地址;緩存DNS主要是把用戶請求解析的域名結果緩存在本身這邊,以減輕權威DNS的工做負載;遞歸DNS-LocalDNS通常在運營商側使用的較多,用來接收用戶的遞歸查詢而後本身進行迭代查詢;轉發DNS相似於遞歸DNS,它會先查看本身DNS內有沒有權威記錄,若是查詢到的話直接返回給用戶,不然就遞歸出去拋給其餘DNS;公共DNS也是httpdns的一個基礎,一些常見的公共DNS:百度:180.76.76.76,阿里:223.5.5.5/233.6.6.6,騰訊:119.29.29.29。併發

遞歸查詢示意圖(給我答案):A->B,B->C,C->D,D->C->B->A;迭代查詢示意圖(給我答案,或者提示):A->B,A->C,A->D,D->A。框架

How DNS Works?

用戶在訪問http://mail.cctv.com/時,DNS的工做流程:運維

用戶發起域名解析請求,該請求會直接拋給遞歸DNS,接着遞歸DNS向根域NS發起迭代查詢,而後根域會返回com域的NS,遞歸DNS接收後又會向com域NS發起迭代查詢,com域NS查詢後返回了cctv.com的NS,最後遞歸DNS向cctv.com域NS發起迭代查詢得到最後的結果,也就是mail.cctv.com。分佈式

在用戶端有緩存DNS的狀況下,上面的過程會被省略直接返回結果。

Httpdns簡介

HTTPDNS是經過DNS之上創建的一個服務,一樣是將域名解析爲IP。不一樣的是HTTPDNS使用的是HTTP/HTTPS協議的80/443端口。

Why We Need HTTPDNS?

HTTPDNS能夠填補運營商LocalDNS的坑,好比域名劫持、訪問緩慢、解析轉發等。

How HTTPDNS Works?

減小公司運營的複雜度,提升資源利用率。Kubernetes在IT領域內最爲經常使用,人才儲備愈來愈多。社區響應用戶需求度快。

當HTTPDNS沒法使用的時候,會切換到備用線路,採用正常的LocalDNS去獲取。

HTTPDNS經過遞歸DNS獲取到的是用戶IP地址,而ISP運營商獲取到的是LocalDNS地址,定位易出現誤差。

How We Use HTTPDNS

對於HTTPDNS集羣接口服務有條件的話建議使用BGP Anycast,它能夠幫助用戶獲取到最近的HTTPDNS服務器。 也能夠自定義公共接口IP地址。

採用主/備/備調用方式,當一個HTTPDNS沒法使用了就調用下一個,當全部HTTPDNS都沒法使用後切換到正常的LocalDNS方式。另外還有一種IP列表方式,在程序的SDK內對多個HTTPDNS進行ping的請求,延遲最低的節點優先請求。

查詢方式有HTTP和HTTPS兩種,HTTPS能夠防止內容劫持。

使用IP地址對HTTPDNS發起請求的話,hostname是查詢不到的。這就須要在Requst Header中添加host,指定須要的hostname。

滬江的DNS演進

原始社會:HOSTS

最先是使用HOSTS方式進行域名解析,HOSTS文件在Windows上被存儲在C:\Windows\System32\dirvers\etc\hosts,而Linux上則是在/etc/hosts。HOSTS的優勢在於簡單、粗暴、隱蔽,缺點則更明顯,存在文件大、傳輸慢、耗貸款、一致性等問題。

奴隸社會:Microsoft DNS

Microsoft DNS的優勢是簡單易用,但也有着黑盒、擴展性、併發數、安全性、集中配管能力較差、主從同步不穩定等問題。

封建社會:BIND

在拋棄了Microsoft DNS後,咱們使用了BIND這款開源DNS軟件,它算是迄今爲止普及最廣的DNS實現。滬江使用BIND分爲兩個階段:階段一爲部署BIND服務,階段二爲BIND分佈式集羣優化改造。

在部署階段咱們有三條線路,用戶發起DNS請求時會對這三個DNS發起DNS輪詢的請求。這樣基本知足了用戶須要,可是也存在不少問題。首先就是權威DNS開啓了遞歸和轉發,這會使得DNS服務器的壓力增大。而後修改記錄全靠手工、沒有區域解析功能且權威DNS均是單點。最後內外網未分離,權威DNS充當緩存DNS。

在集羣式優化改造階段咱們在每一個機房配備了兩臺權威DNS作HA高可用,而後緩存DNS另外進行部署,各個內網的服務器對緩存DNS進行查詢,減輕權威DNS負載壓力,還進行了權威DNS的讀寫分離。

各個DNS節點的優點

權威DNS起到了開啓日誌輪轉、智能解析做用。

權威DNS master端優化點:權威DNS關閉了遞歸及轉發,使用key+nsupdate的方式作記錄的變動,動態更新解析記錄。

權威DNS slave端優化點:加入了interface-interval1,用於pacemaker集羣的vip漂移探測,主從同步不一致時,單獨修改各slave記錄。

緩存DNS分離:限定容許請求範圍--內網,開啓遞歸。後臺邏輯管理層

資本主義社會:HTTPDNS

滬江向HTTPDNS發展主要進行了兩項工做,第一項是對HTTPDNS接口服務的選型,在自制的HTTPDNS服務和第三方的服務之間進行選擇。在選擇了接口服務後就必須對移動端SDK進行改造,這就是第二項工做。

DNS的坑

DNS解析時間長

主要緣由在於DNS開啓了遞歸、轉發服務,未作分佈式以及讀寫分離,單ISP線路部署。

DNS安全問題

常見的DNS攻擊手段有DNS query flood、udp flood、折射攻擊、放大攻擊。

對此應對策略分別是針對大流量攻擊購買三方服務進行抵抗,增長DNS公網帶寬,權威DNS設置白名單策略,DNS限速策略,提升DNS併發性能。

DNS解析調整後,客戶端未生效

一些依賴於java/.net/python等框架的客戶端應用程序,如salt-minion,在DNS解析調整後,沒法當即刷新生效。

其緣由就在於程序未觸發客戶端DNS解析器glibc的res_init()模塊工做,其使用的python scoket.getaddrinfo只在程序第一次啓動時調用res_init(),讀取/etc/resolv.conf內容。

解決方法就是重啓客戶端程序,強制觸發客服端DNS解析器工做。或者客戶端程序直接使用底層的域名解析函數,而非第三方框架提供。

DNS區域解析不許確

這個多是因爲LocalDNS解析轉發或者權威DNS IP地址庫出現問題。

DNS註冊商處寫錯NS記錄

這時候就須要當即將域名註冊商處的glue records值改成正確的值,或者請求域名註冊商單獨刷新影響域名的glue records記錄。

DNS污染

這個問題無需多說,請使用HTTPDNS!

相關文章
相關標籤/搜索