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