測驗時間,在以下 Corefile 中
. {
proxy . 8.8.8.8:53
file db.example.com
}
對 www.google.com
的查詢將由 *proxy* 或 *file* 外掛程式處理?答案如下。
這個 Corefile 實際上說了什麼?它指定了根 (.
) 和其下 *所有* 內容(即所有網域名稱)的查詢,我們應該進入這個段落。
接下來,*所有* 查詢都應該轉發到 8.8.8.8:53。
然後,因為 *file* 外掛程式沒有指定應從 db.example.com
檔案中回答哪些區域,所以適用頂層的區域,即根 (.
)。
因此,我們處於這樣一種情況:兩個外掛程式都會被呼叫處理相同的名稱(對於呼叫其他鏈接外掛程式的外掛程式來說,這完全有效)。
但是,在查詢得到回答且外掛程式執行完成後,*proxy* 不會呼叫 *file*,反之亦然。
為了了解這裡發生了什麼,我們必須查看外掛程式的順序
...
dnssec:dnssec
file:file
etcd:etcd
proxy:proxy
...
我們看到 *file* 排在第一位,而 *proxy* 則稍後出現。這表示在上面的範例中,*所有* 查詢都會路由到 *file* 外掛程式。它會很樂意使用 SERVFAIL 回答這些查詢,因為它可能無法在主要包含 *.example.com
名稱的檔案中找到 www.google.com
。
為了修正這個問題,我們應該將段落分開,或為 *file* 外掛程式指定 origin。
. {
proxy . 8.8.8.8:53
file db.example.com example.com
}
為了預先回應功能請求:是的,如果 CoreDNS 可以偵測並警告這個問題,那就太好了(它現在沒有這樣做)。