CoreDNS篇10-分流與重定向
時間:2023-02-09 09:06:01 | 來源:建站知識
時間:2023-02-09 09:06:01 來源:建站知識
本文主要介紹了目前CoreDNS服務在外部域名遞歸結果過程中出現的一些問題以及使用dnsredir插件進行分流和alternate插件進行重試優(yōu)化的操作。
1、自建DNS服務現狀
一般來說,無論是bind9、coredns、dnsmasq、pdns哪類dns服務器,我們自建的監(jiān)聽在
UDP53端口上的DNS服務在
DNS解析功能方面承擔著兩個角色:分別為權威域名服務器和遞歸域名服務器。
- 權威域名服務器主要為我們內部使用的域名提供服務,為了避免和提供給外部用戶訪問的域名沖突,這類內網域名一般會使用如local域、internal域,或者是和自身業(yè)務無關的org域、io域等后綴;
- 遞歸域名服務器主要是正常的外部域名解析服務,如
163.com
、baidu.com
、google.com
這一類常用的外網域名等;
2、DNS解析邏輯
針對我們自建的權威域名服務器,解析的結果非常的確定,當服務器中存在這條記錄就能正常解析,否則就是異常。但是對于遞歸域名服務器的工作流程來說,有些特殊的域名解析就會出現問題。
我們以下圖為例介紹在遞歸解析過程中可能會出現的問題:
- 因為主要是分析到DNS服務器的解析流程,因此這里的第一二步直接跳過;
- 圖中的本地DNS服務器可以視為我們的CoreDNS服務器;
- 正常情況下,我們的CoreDNS服務器和根域名服務器之間的連接是正常的,也就是說④⑤這兩步正常情況下是能順利返回結果的;
那這里出現異常的情況主要就是請求了一些非法的不合規(guī)域名,比如請求tinychen.comillegal
這種奇怪的域名,它的頂級域名是.comillegal
,如果這個頂級域名是不存在的,那么DNS解析就會返回異常,無法解析; - 正常情況下,⑥⑦這兩步是由本地DNS服務器去訪問頂級域名服務器的IP來獲取對應域名的權威域名服務器,一般常用的頂級域名如
.com
、.cn
這類頂級域名的服務器IP肯定是能正常連上的,但是一些小眾的頂級域名就不一定能正常連接了,這類比較常見的是一些小國家的自有頂級域名,詳細列表可以參考維基百科; - 最后就是權威域名服務器,這里也是最容易出問題的地方;
正常情況下,本地DNS服務器從頂級域名服務器里面拿到權威域名服務器的IP之后就會去權威域名服務器這里獲取到最后的域名解析結果,但是這里容易出現兩個問題:
- 本地DNS服務器和權威域名服務器之間的連接容易出現問題,權威域名服務器一般是各個域名使用者自己維護或者是使用一些DNS服務商提供的服務器,這些服務器出現無法連接或者是崩潰的概率要遠大于前面的根域名服務器和頂級域名服務器
- 權威域名服務器返回的結果不一定能夠正確的傳送到本地DNS服務器中,大部分情況下DNS查詢并不是加密的,使用明文的UDP進行查詢,是比較容易被中間的運營商進行劫持,這里也是DNS污染常見的操作范圍;
還有一種常見的DNS污染手段就是市面上的免費公共DNS服務器提供者針對某個特殊域名的解析進行修改,使得用戶在使用這些免費的公共DNS解析時沒辦法解析到正常的IP從而導致該域名提供的服務異常
總結上面的流程分析,我們自建DNS服務在進行外部域名遞歸解析的時候就可能會遇到下面的幾類域名:
- 解析正常,一般是國內的主流域名;
- 因為頂級域名服務器或者權威域名服務器無法正常連接導致無法正常解析,一般為海外域名;
- 因為DNS污染導致雖然能進行解析,但是解析結果和實際情況大相徑庭,這類域名比較復雜,各種情況都有;
3、CoreDNS解析邏輯
得益于CoreDNS豐富多樣的插件,我們可以使用插件來對DNS的解析流程進行優(yōu)化,分流不同的域名到不同的服務器,同時還可以針對不同的返回碼進行重試。下面介紹一個對CoreDNS進行優(yōu)化,加入了DNS解析分流功能和DNS解析失敗重試功能來補充各種使用場景的架構。
3.1 插件分析
首先是使用
hosts插件,這個插件相當于在CoreDNS上面實現了我們修改服務器
/etc/hosts
文件的效果,可以用于對一些域名進行簡單的劫持,例如一些域名想要拉黑,可以在里面配置解析為127.0.0.1(家庭網絡屏蔽廣告域名的常用手段);又或者是有部分域名同時有內外網多個入口的,在機房內網DNS解析直接劫持為內網IP,節(jié)省外網流量等。需要注意的是hosts插件僅支持A記錄的修改,一些復雜的場景如CNAME記錄、MX記錄、TXT記錄等則無能為力了。
接下來就是重頭戲
dnsredir插件和
alternate插件了。其中dnsredir插件是github上面開源的一個第三方插件,alternate插件則是CoreDNS官網上的External Plugins,由CoreDNS維護;兩者可靠性相對較高,有需求的同學也可以對其二次開發(fā),關于CoreDNS編譯外部插件的教程可以查看之前的
文章。
官方對
alternate插件
的介紹是一個基于DNS查詢返回碼RCODE來把DNS查詢請求重定向的插件。舉個例子,當我們向CoreDNS查詢域名解析
tinychen.com
的時候,CoreDNS將查詢轉發(fā)給
114.114.114.114
,然后得到了
NXDOMAIN
的返回碼,這時候一般就說明
tinychen.com
這個域名在114DNS是沒有解析結果的,但是我們不死心,使用
alternate插件
把RCODE是
NXDOMAIN
的查詢再次轉發(fā)給
8.8.8.8
,這時候說不定就能得到域名的解析結果。
alternate - allow redirecting queries to an alternate set of upstreams based on RCODE
還是繼續(xù)上面的場景,假設我們已經知道
tinychen.com
這個域名在114DNS是沒辦法查詢到正常結果,而在
8.8.8.8
DNS能正常解析,我們能否直接去
8.8.8.8
查詢呢?
答案是肯定的。這時候就要用到我們的dnsredir插件了。它可以根據我們提供的域名列表,將不同的域名轉發(fā)到不同的DNS服務器進行查詢,從而達到DNS查詢解析優(yōu)化的效果,尤其是對應大部分海外域名解析,有條件的同學可以嘗試將其轉發(fā)到海外DNS節(jié)點解析,解析效果應該會有明顯的提升。
3.2 解析邏輯分析
alternate插件和dnsredir插件分別從響應碼RCODE和域名兩個維度對DNS解析進行分流/重定向,再結合CoreDNS本身配置的靈活性,可以有數種組合,這里只是提供一個示范案例作為參考。
注意上圖的插件每個的順序都是可以調整并且不斷遞歸查詢,因此理論上可以進行無限的橫向和縱向擴展用于滿足日后的增長需求。
- 首先還是針對遞歸查詢的外部DNS域名,這里以
.(root):53
表示監(jiān)聽在53端口的根域名查詢; - 進來的第一層匹配就是前面提及的最高優(yōu)先級全局劫持名單查詢,這一層主要是對惡意域名進行屏蔽過濾;
- 當需要查詢的域名不在全局劫持名單中的時候就會觸發(fā)
fallthrough
條件,進入到下一層的dnsredir
組件進行分流; dnsredir
組件的主要功能就是根據我們配置的域名列表來進行轉發(fā),這里我們把域名分為三大類,分別進行不同的邏輯處理;- 對于列表里面的海外域名,我們將其轉發(fā)到海外的DNS解析服務器進行解析,這里統(tǒng)稱為海外DNS服務器,例如部分有條件的同學可以在海外線路的機房又或者是公有云的海外節(jié)點自建DNS服務器;
- 當然在自建的海外線路節(jié)點DNS服務器也是會有可能碰到無法正常解析的,這時候就需要依賴
alternate
組件將請求二次轉發(fā)到海外公共DNS服務器,比如一些海外的公共DNS服務器如8.8.8.8和1.1.1.1等; - 對于一些需要自己定義的域名,則再維護另外一份自定義域名列表和RFC1035格式的域名解析結果文件;
- 這時候相當于再單獨自建一個
.(root)
根域名給自定義域名使用,dnsredir
組件將這些自定義的域名轉發(fā)到這個自建的根域進行解析,正常情況下就會直接解析出自己定義的域名結果; - 如果自定義的域名列表和解析結果出現了偏差,導致部分域名在分流列表中缺不在解析結果中,會使得查詢失敗返回
NXDOMAIN
,這時候就需要依賴alternate
組件將請求二次轉發(fā)到正常的DNS解析流程 - 最后就是正常的域名解析,優(yōu)先使用本機的自建遞歸緩存服務器進行查詢,當查詢失敗的時候可以轉去國內的一些公共遞歸DNS如114或者是自建的海外DNS等進行補充查詢
得益于CoreDNS自身的靈活性,上述的全部插件邏輯可以隨意進行組合分配遞歸調整用于適配不同的業(yè)務邏輯。
3.3 Q&A
- 用于給
dnsredir
組件分流的域名列表格式?
dnsredir
組件使用的分流域名格式列表和dnsmasq的格式一致,格式參考如下:
server=/http://a1.mzstatic.com/114.114.114.114
server=/http://a2.mzstatic.com/114.114.114.114
server=/http://a3.mzstatic.com/114.114.114.114
server=/http://a4.mzstatic.com/114.114.114.114
server=/http://a5.mzstatic.com/114.114.114.114
server=/http://adcdownload.apple.com.akadns.net/114.114.114.114
server=/http://adcdownload.apple.com/114.114.114.114
server=/http://appldnld.apple.com/114.114.114.114
server=/http://appldnld.g.aaplimg.com/114.114.114.114
server=/http://appleid.cdn-apple.com/114.114.114.114
server=/http://apps.apple.com/114.114.114.114
server=/http://apps.mzstatic.com/114.114.114.114
server=/http://cdn-cn1.apple-mapkit.com/114.114.114.114
server=/http://cdn-cn2.apple-mapkit.com/114.114.114.114
server=/http://cdn-cn3.apple-mapkit.com/114.114.114.114
server=/http://cdn-cn4.apple-mapkit.com/114.114.114.114
需要注意的是dnsredir
組件只會讀取上述配置中的域名,而不會讀取后面的DNS服務器IP,實際轉發(fā)的DNS服務器IP在CoreDNS中的配置文件定義; - 為什么使用RFC1035格式的文本文件作為自定義域名的配置文件?
CoreDNS本身支持多種外部后端存儲方式(mysql、redis、etcd、pdsql等),使用RFC1035格式的文本文件主要是基于性能、穩(wěn)定性和可維護性考量。
- CoreDNS會把文本文件的內容全部load到內存中,每次查詢都是在內存中查詢操作,性能最優(yōu),無需額外的網絡IO消耗;
- 無需單獨維護額外的數據庫和中間件;
- 排除故障的時候可以直接查看文本文件定位問題;
- 因為文本文件在每臺機器上面都有一份,因此單個CoreDNS實例出現故障不會影響其余的CoreDNS節(jié)點;
- RFC1035格式的文本文件的一個簡單示例如下,更具體的操作可以查看bind9的官方文檔