使得 DNS 難以理解的事情之一是它是 分布式的。有成千上萬(也許是幾十萬?我不知道!)的權威性域名服務器,以及至少 1000 萬個解析器。而且它們正在運行許多不同的軟件!不同服務器運行著不同的軟件意味著 DNS 的工作方式有很多不一致的地方,這可能導致各種令人沮喪的問題。
但是,與其談論這些問題,我更感興趣的是弄清楚 —— 為什么 DNS 是分布式的是一件好事?
為什么 DNS 是分布式的是件好事?
一個原因是 可擴展性 —— DNS 的分布式設計使其更容易擴展,對故障的恢復能力更強。我發現,盡管 DNS 已經有近 40 年的歷史,但它的擴展性仍然很好,這真是令人驚訝。這一點非常重要,但這并不是這篇文章的主題。
相反,我想說的是,它是分布式的意味著你可以 控制 你的 DNS 的工作方式。你可以向巨大而復雜的 DNS 服務器中添加更多的服務器!添加你控制的服務器!
昨天我 在 Twitter 上問 為什么你要運行自己的 DNS 服務器,我得到了很多很好的答案,我想在這里總結一下。
你可以運行 2 種類型的 DNS 服務器
你可以運行 2 種主要類型的 DNS 服務器:
- 如果你擁有一個域名,你可以為該域名運行一個 權威名稱服務器
- 如果你有一臺電腦(或一個有很多電腦的公司),你可以運行一個 解析器 來為這些電腦解析 DNS。
DNS 不是靜態數據庫
我經常看到 DNS 的 “電話簿” 比喻,域名就像人名,IP 地址就像電話號碼。
這是一個不錯的思維模型。但是,“電話簿” 思維模型可能會使你認為,如果你對 google.com
進行 DNS 查詢,你將永遠得到相同的結果。而這是不正確的。
你在 DNS 查詢中得到的記錄可能取決于:
- 你在世界的哪個地方(也許你會得到一個離你更近的服務器的 IP 地址)
- 你是否在企業網絡里(你可以在其中解析內部域名)
- 該域名是否被你的 DNS 解析器認為是 “壞” 的(它可能被封鎖!)
- 之前的 DNS 查詢(也許 DNS 解析器正在做基于 DNS 的負載平衡,每次給你一個不同的 IP 地址)
- 你是否在使用機場 Wi-Fi 專屬門戶(機場 Wi-Fi 會在你登錄前以不同的方式解析 DNS 記錄,它會給你發送一個特殊的 IP 來重定向你)
- 隨便什么
你可能想控制你自己的服務器的很多原因都與 DNS 不是一個靜態數據庫這一事實有關 —— 對于如何處理 DNS 查詢,你可能會有不同的選擇(無論是為你的域名還是為你的組織)。
運行權威性名稱服務器的理由
這些原因并沒有任何特定的順序。
對于其中一些原因,你不一定必須要運行你自己的權威名稱服務器,你只需選擇提供了該功能的權威名稱服務器服務就行了。
要明確的是:有很多理由 不 運行自己的權威名稱服務器 —— 我就沒有運行,我也不想說服你應該這樣做。它需要時間來維護,你的服務可能不那么可靠,等等。
原因:安全
這條推文說的很好:
[存在] 攻擊者通過你的 DNS 供應商的客戶支持人員獲得 DNS 變更權限的風險,客服本來只應該提供幫助。他們可以被你的 DNS 阻止(也許就是因為缺少這個)。內部可能更容易審計和驗證內容。
原因:你喜歡運行 bind/nsd
有幾個人提到的一個原因是:“我習慣于編寫區域文件和運行 bind
或 nsd
,對我來說這樣做更容易。”
如果你喜歡 bind/nsd 的方式,但又不想運維自己的服務器,有幾個人提到,你也可以通過運行一個 “隱藏的主服務器” 來獲得 bind 的優勢,該服務器存儲記錄,但從一個 “輔助” 服務器提供所有的實際 DNS 查詢。這里有一些我發現的關于配置輔助 DNS 的網頁,以 NS1、cloudflare 和 Dyn 作為示例。
我真的不知道什么是最佳的權威 DNS 服務器。我想我只在工作中使用過 nsd。
原因:你可以使用新的記錄類型
并非所有的 DNS 服務都支持某些較新的 DNS 記錄類型,但如果你運行你自己的 DNS,你就可以支持任何你想要的記錄類型。
原因:用戶界面
你可能不喜歡你正在使用的 DNS 服務的用戶界面(或 API,或干脆沒有 API)。這與 “你喜歡運行 BIND ”的原因差不多,也許你喜歡編寫區域文件的方式。
原因:你可以自己修復問題
當問題出現時,能夠自己解決,有一些明顯的優點和缺點(優點:你可以解決問題,缺點:你必須解決問題)。
原因:做一些奇怪的、自定義的事情
你可以寫一個 DNS 服務器,做任何你想做的事情,它不一定要只返回一組靜態記錄。
有幾個例子:
- Replit 有一篇博文介紹了 為什么他們編寫自己的權威性 DNS 服務器來處理路由
- nip.io 將 10.0.0.1.nip.io 映射為 10.0.0.1
- 我為 亂用 dns 而寫了一個自定義 DNS 服務器
原因:省錢
權威名稱服務器似乎一般按每百萬次 DNS 查詢收費。比如,似乎 Route 53 每百萬次查詢收費 0.5 美元,NS1 每百萬次查詢收費約 8 美元。
我對一個大型網站的權威 DNS 服務器實際需要解決多少次查詢沒有概念(哪些類型的網站會對其權威 DNS 服務器進行 10 億次 DNS 查詢?可能是很多,但我沒有這方面的經驗)。但是有幾個人在回復中提到成本是一個原因。
原因:你可以改變你的注冊商
如果你為你的域名使用一個單獨的權威名稱服務器,而不是你的注冊商的名稱服務器,那么當你轉移到一個不同的注冊商時,你所要做的就是把你的權威 DNS 服務器設置為正確的值,從而使你的 DNS 恢復正常。你不需要遷移你所有的 DNS 記錄,那非常痛苦。
但你不需要為此而運行你自己的名字服務器。
原因:地理 DNS
你可能想根據客戶的位置為你的域名返回不同的 IP 地址,給他們一個離他們很近的服務器。
這是很多權威的域名服務器服務所提供的服務,你不需要為此而專門運行名字服務器。
原因:避免針對他人的拒絕服務攻擊
許多權威 DNS 服務器是共享的。這意味著,如果有人攻擊 google.com
或其他的 DNS 服務器,而你恰好在使用同一個權威 DNS 服務器,你可能會受到影響,即使攻擊不是針對你。例如,2016 年的這次 對 Dyn 的 DDoS 攻擊。
原因:把所有的配置放在一個地方
有一個人提到,他們喜歡把所有的配置(DNS 記錄、let's encrypt、nginx 等)放在一臺服務器上的同一個地方。
另類原因:把 DNS 當作虛擬專用網絡使用
顯然,iodine 是一個可以讓你通過 DNS 隧道傳輸流量的權威 DNS 服務器,它可以讓你像虛擬專用網絡一樣與外界聯系,
運行解析器的原因
原因:隱私
如果有人能看到你所有的 DNS 查詢,他們就有你(或你組織中的每個人)正在訪問的所有域名的完整列表!你可能更愿意保持這種隱私。你可能更愿意保持這種隱私。
原因:阻止惡意網站
如果你運行你自己的解析器,你可以(通過不返回任何結果)拒絕解析你認為 “壞” 的域名的 DNS 查詢。
幾個你可以自己運行(或只是使用)的解析器的例子:
- Pi-Hole 阻止廣告商
- Quad9 阻止做惡意軟件/網絡釣魚/間諜軟件的域名。 Cloudflare 似乎有一個 類似的服務
- 我想也有一些企業安全軟件會阻止那些托管惡意軟件的域名的 DNS 查詢
- DNS 不是靜態數據庫。它是非常動態的,答案往往實時取決于查詢的 IP 地址、內容服務器的當前負載等。除非你將這些記錄的服務委托給做出這些決定的實體,否則很難實時實現。
- DNS 委派控制使訪問控制非常簡單。從區域中切下的部分都由控制委派服務器的人控制,所以對一個主機名的責任是隱含在 DNS 委派中的。
原因:在 nginx 中獲得動態代理
這里有一個很酷的故事,來自 這條推文:
我在一個應用程序中寫了一個 DNS 服務器,然后把它設置為 nginx 的解析器,這樣我就可以獲得動態的后端代理,而不需要 nginx 運行 lua。Nginx 向應用程序發送 DNS 查詢,應用程序查詢 Redis 并作出相應的反應。這對我正在做的事情來說,效果非常好。
原因:避免惡意解析器
一些 ISP 運行的 DNS 解析器會做一些不好的事情,比如把不存在的域名指向他們控制的 IP,向你顯示廣告或他們控制的奇怪的搜索頁面。
使用你控制的解析器或你信任的另一個解析器可以幫助你避免這種情況。
原因:解析內部域名
你可能有一個內部網絡,其域名(比如 blah.corp.yourcompany.com
)并不在公共互聯網上。為內部網絡中的機器運行你自己的解析器,就有可能訪問這些域名。
無論是訪問只在本地的服務,還是為公共互聯網上的服務獲得本地地址,你都可以在家庭網絡中做同樣的事情。
原因:避免你的 DNS 查詢被中間人劫持
有一個人 說:
我在我的局域網路由器上運行了一個解析器,它的上游使用了基于 HTTPS 的 DNS(DoH),所以物聯網和其他不支持 DoH 或 DoT 的設備不會在外面噴射明文 DNS 查詢。
就是這樣
對我來說,探索 DNS 的 “原因” 感覺很重要,因為它是一個如此復雜凌亂的系統,我認為大多數人如果不理解為什么這些復雜的東西是有用的,就很難有動力去學習這么復雜的主題。
原文鏈接:https://linux.cn/article-14165-1.html