1. 程式人生 > >ISC BIND9 - 最詳細、最認真的從零開始的BIND 9 服務講解

ISC BIND9 - 最詳細、最認真的從零開始的BIND 9 服務講解

# DNS and BIND 服務的搭建說明 --- [TOC] --- ## 1. 背景 ### 1.1 DNS **DNS( Domain Name Service)** 作為一個非常讓人耳熟能詳的概念,這種技術可以把複雜難記的IP地址轉化成為一個域名供人們去呼叫,這樣人們只需要記住每一個網站的域名而不需要記住非常複雜的IP地址。 這種技術這裡不做深入探討,只需要對DNS的過程有一個大概的瞭解即可,未來會有一篇專門探討 DNS 協議及其安全問題的安全部落格,在這篇安全部落格將會詳細描述安全實驗的步驟。
**DNS ZONE**: DNS Zone,DNS域,被用來劃分DNS主域。傳統的DNS域類似一個樹狀的結構,被分成不同的區域,這些區域可區分一個DNS伺服器中名稱空間中不同的區域。 **DNS區域**是構成DNS名稱空間的一部分,由特定組織或管理員加以管理,其可以對權威性域名伺服器等DNS元件更加精細的控制。 域名空間是一個分層數,其中DNS的根域位於頂部,DNS區域始於該樹中的一個域,並且可以擴充套件到下邊的子域。
**常見的資源記錄型別**: A :Address地址, IPv4 AAAA:Address地址 IPv6 NS :Name Server域名伺服器 SOA:Start of Authority 起始授權機構 MX:Mail Exchanger 郵件交換 CNAME:Canonical Name規範名 PTR:Pointer指標 TXT:Text SRV:Service **CNAME** CNAME-records ( Canonical name for an alias )是域名的別名。一個伺服器地址 nyc3.example.com 這個主機域名可能會提供不同的服務,比如說一個域名即要去提供 web服務,也要提供 ftp 服務,那麼這個時候就需要一個別名域名來指向原來的域名,這個時候就可以使用一個 A 記錄來管理多個域名,為DNS後期修改配置提供方便。舉個例子: 我想要搭建一個部落格網站後臺為部落格網頁提供web服務,我想要節省我伺服器搭建的成本開銷,只想租用一個伺服器並配置相關域名解析,我的部落格網站現在提供的服務有評論,分享,登陸授權,註冊,這個時候我需要同時在這個伺服器上開通這些服務,一開始你的部落格網站默默無聞,訪問量以及下載量並不是那麼大,這個時候你的伺服器負載並不是那麼嚴重;當你的訪問量暴增的時候,這個時候就需要考慮到你的伺服器的流量轉發問題了~原始伺服器的流量暴增已經讓你的伺服器效能急劇下降,你需要將原來的提供服務的伺服器的相關模組提供一個內容分發模組 (CDN),這個CDN提供商要求你的域名做一個Pointer來指向他們為你提供的 DNS地址,這個時候你的 CName 就可以指向他們提供的域名,做到對DNS流量的分發,從而實現網站的流量負載均衡作用。 **NS (Name Server)** 域名伺服器,NS,用於確定哪些伺服器(注意不是單個伺服器)為一個區域網傳遞DNS資訊以及確定域名由哪個伺服器進行解析。 一般NS配置在 BIND9 中的 db 檔案中進行配置,在 SOA 配置之後。NS記錄 和 SOA記錄是任何一個DNS區域都不能或缺的兩條記錄。 **SOA( Start of Authority)** SOA 又被稱作 起始授權機構記錄, 被標記成在眾多NS記錄中哪一臺是主伺服器。 SOA 記錄表示此域名的權威解析伺服器地址,當要查詢的域名在所有遞迴解析伺服器沒有域名的解析快取時,會回源到請求此域名的SOA 記錄,也叫做權威解析記錄。 SOA 作為所有區域檔案的強制性記錄,他必須是 ZONE 檔案中的第一個記錄。 **SRV (Service)** SRV 記錄是從 RFC2052 中對 SRV資源進行了定義。SRV 被用來記錄伺服器提供什麼樣的服務。 ### 1.2 FQDN **FQDN(Fully Qualified Domain Name)** 完全合格域名/全程域名,即域名可以通過DNS進行解析,其公式 FQDN = HostName + Domain。 這門技術解決了一個多個主機的問題,一個網站或者伺服器叢集一般都是有多個主機一起協作的,比如說包括正向代理伺服器、反向代理伺服器、Web伺服器、Email伺服器、OA伺服器、FTP伺服器等等,這個時候就涉及是不是需不需要為每一個主機申請一個域名。 有了這個技術之後每一個主機都可以自己申請一個 `Hostname` 來區別於其他的主機,這個時候就只需要一個域名就可以做到管理所有的主機。 比如我申請了一個域名: ` doheras.com` 現在我有兩個伺服器需要用到這個域名,一個 FTP伺服器,一個Web伺服器,這兩個伺服器都需要用到 `doheras.com`這個域名,根據公式,我們知道可以採用 `hostname` 的方式來訪問不同的主機: Web 伺服器: `web.doheras.com` FTP 伺服器: `ftp.doheras.com` 因此, FQDN 服務可以簡化在服務和應用中的配置流程,提高配置檔案的可維護性。 在配置DNS的過程中,因為服務端的工作在UDP協議埠53上,DNS需要FQDN提供正向解析 (FQDN --> IP)以及反向解析 (IP --> FQDN) 的服務。 ### 1.3 BIND **BIND**(Berkeley Internet Name Domain)作為一款目前市面是最主流的開源DNS軟體,佔據了市面上DNS伺服器軟體的九成,目前由 網際網路系統協會 (Internet Systems Consortium) 負責開發和維護。目前,最新的穩定版BIND已經更新到了 BIND 9 版本。 BIND可以執行的系統和平臺非常得全面,從官網上來看,目前支援的主流的Linux作業系統及其伺服器種類有: Ubuntu、Debian、Fedora/CentOS。其中對於Fedora的版本支援已經涵蓋了最新版本:Fedora 33。在Linux平臺上可以做到對 BIND 原始碼的編譯和特殊功能定製的操作,對於該軟體在實際執行過程中的安全性的探討研究。其基本功能支援在伺服器或者是本機上搭建定製的DNS服務並做到域名解析功能。對於將該軟體部署到Linux平臺最具有優勢的方面是定製化的DNS服務,因為原始碼對於每一個開發人員和網路管理人員都是透明的,因此可以做到對該軟體的隨意定製。 其次,對於使用較為廣泛的Windows作業系統,BIND也給出了可以執行的解決方案,但是其定製化的功能因為平臺的原因收到了限制和Windows 10 作業系統的相關問題,因此我認為不推薦 BIND 在 Windows上的實驗,但是本文也給出了在 Windows 10 作業系統下的安裝辦法,對於 Windows Server 作業系統要求的管理經驗以及熟練度太高,因此本文沒有給出相關配置步驟。 ### 1.4 本文中搭建模擬DNS服務網路虛擬裝置架構示意圖 - Debian 9 本文中提及到相關實驗和操作步驟的操作環境具體配置要求,都已經根據每個不同章節的內容給出了說明,請在不同章節前自行查詢相關的配置資訊作為參考。 下邊給出的圖片列舉了Big Sur下搭建模擬DNS虛擬機器網路的拓撲圖,使用的: ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301214745107-526521936.jpg) + `172.16.2.11` 作為主要的 (Master) DNS解析伺服器,主要為客戶端提供域名解析服務,所有客戶端的首要訪問的DNS解析伺服器是`NS1`; + `172.16.2.12` 作為一個災備的伺服器`NS2`,被當作一個災備DNS伺服器使用,在主機無法提供域名解析服務的時候被啟用,其配置流程與NS2基本上一樣,唯一的區別是配置需要分清與NS1的主次關係; + `172.16.2.5` / `172.16.2.6` / `172.16.2.7` 做為模擬請求客戶端的虛擬機器,其用來模擬和重現配置DNS解析客戶端的配置流程; + `172.16.2.0` 作為虛擬機器連線本機的 NAT 網路的閘道器地址,用於與 Mac 主機進行通訊; **Caution** + 以上所有網路裝置對應的裝置都是基於 Mac Big Sur 下 VMware Fusion 的虛擬機器; + 自行搭建復現過程IP地址不需要與上圖保持一致,請自行規定虛擬裝置的IP; ### 1.5 作業系統的選擇 在 ISC 官網上的 BIND 9 支援的 Linux 版本包括: Debian 、 CentOS 、 Fedora 、 Ubuntu。從網上的資料來說,大多數的選擇都是 Debian 作為伺服器端的選擇。對於非Linux作業系統,Windows / Windows Server 也支援搭建 BIND 9 DNS 服務。 從網際網路上的大多數英文論壇網友的評論來說,本著穩定、安全、實用並容易管理的原則,對上述的主流作業系統進行分析: 對於 Debian 系列的作業系統對於開源社群的更新和支援力度比較大,版本更新較快,新發行的版本可能會存在不穩定的問題和補丁容易帶來系統的安全性、完整性的問題,但其優點是ISC提供預編譯的 BIND 9 包在 Debian 作業系統上可以輕鬆做到執行,Debian Server 版本更新補丁的速度都比較快; CentOS 作為一款專業的伺服器端,擁有穩定、安全的特性,其發行版本一般較為穩定並經過許多專業人員在伺服器端的大量測試,ISC 也為其編譯了BIND 9 的安裝包,但其缺點在不容易上手和難以操作,對於 CentOS 7 和 CentOS 8 的社群支援和版本更新會在 2021年和2029年終止,並且以後 CentOS Stream 不再作為 RHEL的“免費”的商業版本而成為介於 Fedora 和 RHEL 之間,其定位與 Fedora 較為相近;在嘗試配置 CentOS 8 的過程中出現很多不應該出現的問題,比如說從 yum 安裝BIND9時對應目錄下的檔案無法找到,sudo 的使用者新增過於複雜的問題讓人非常惱火。 Ubuntu 作為經典的桌面版Linux的作業系統,非常穩定和容易上手,但是選擇其作為伺服器端的人數較少,有可能帶來的問題難以被估計。 綜上,我選擇 Debian9 作為 測試版 DNS Server 的承載作業系統,選擇的依據依賴於其穩定的更新頻率和良好的開源社群,備用的選擇為 RHEL 和 Fedora。 在接下來的內容,我將選擇 Windows 預先編譯好的服務檔案作為測試搭建DNS服務並詳細描述在 Debian 的搭建 BIND 9 服務的步驟和配置流程。 ### 1.5 BIND9 與 F5-GTM 寫這篇部落格的目的是做一個替代F5核心GTM的BIND伺服器,構建這個伺服器目標是為了在區域網核心心F5的GTM裝置出現故障時候,配置好的 BIND伺服器 可以立刻取代F5 GTM裝置充當整個區域網的域名解析伺服器為訪問終端或伺服器提供域名解析服務。 在這裡我必須指出在構建這個BIND域名解析伺服器時,遇到的一個非常大的困惑。 > 從上面的模擬DNS虛擬機器網路的拓撲圖中,NameServer(NS)是與主機在同一個網段下的,但實際上,在生產鏈路中的F5 GTM裝置並不是和其他的伺服器連線在同一個網段下的,這就會帶來一個問題,就是當終端想要訪問外網段的DNS解析伺服器時,NameServer 會不會不能為其提供服務? 問題的重現從這篇詳細闡述F5-GTM運作原理的官方文件開始:https://techdocs.f5.com/kb/en-us/products/big-ip_gtm/manuals/product/gtm-concepts-11-5-0/4.html 這裡邊詳細介紹了F5 GTM的運作原理,以及出現了下邊的圖片,這個部分引起了我的擔憂,當鏈路的GTM失效之後,因為GTM與LTM連線的子伺服器以及子終端因為不在同一個網段中而無法進行工作: ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301214817344-2053579633.png) 舉個例子,GTM作為整個鏈路的核心裝置,用於為LTM裝置提供域名解析服務,在實際的生產網路中中GTM在網路中拓撲並不是與LTM存在於同一個網段的,畫一個圖來表述這個問題: ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301214825026-576283756.png) 上圖中,作為一個簡單的網路拓撲的再現,四個網路中LTM都與中間的GTM不在同一個網段中,因為我在之前畫的模擬拓撲所有的裝置不管是DNS伺服器還是host終端都在同一個網段,因此裝置與裝置之間的訪問以及裝置與DNS伺服器之間的服務建立並不需要跨越網段,因此訪問以及提供服務是沒有任何問題的。 但是如果不在同一個網段呢? 當然這個部分省略了很多關鍵的網路裝置,這裡不一一闡述。 其實這個問題我是想的有一點偏的,或者來說比較多餘,因為: + 其實作為谷歌還是阿里提供的免費的權威域名伺服器都是在不同的網段下進行運作的,那麼不同網段不應該成為DNS伺服器無法提供服務的一個阻礙條件; + 其次,我的困惑是在整個體系中 GTM 與 LTM 是搭配進行使用的,所以我**錯誤地**認為 GTM是為LTM服務的,我需要解決的事是GTM與LTM之間的配置問題,為LTM提供服務,這個想法是完全錯誤的;在整個網路體系中,GTM 為所有的訪問域名客戶端的客戶端提供解析服務,並不影響 LTM的工作,兩者的工作狀態是獨立的; + 最後,如果說F5裝置的特色是負載均衡,那麼這個負載均衡體現在GTM裝置之間的負載均衡或者來說是“雙活”,而不是與LTM的負載問題。 如果想要了解 GTM 與 BIND 之間的關係,請詳細瞭解 BIG-IP-GTM 中內嵌的模組 - **ZONERUNNER**。 ## 2.BIND 9 配置檔案講解 這裡以 Debian9 作為配置講解的環境。 BIND9 的配置檔案在安裝之後配置檔名字: `named.config`, 在 Linux下被易名為 `named.conf` 檔案儲存的位置為:`/etc/bind`,其中檔案`named.conf`引用了三個檔案: `named.conf.options`、`named.conf.local`、`named.conf.default-zone`。 在 Debian9 中查詢和重啟當前 BIND9 服務的命令是: `sudo systemctl status bind9` 和 `sudo systemctl restart bind9`。 ### 2.1 CONF 檔案 在完成 BIND9 的變異和安裝之後,BIND9 已經建立了一個預設的配置檔案 `named.conf.local` 和 檔案 `named.conf.options` 用於配置 BIND9 的基礎服務,這兩個檔案作為配置DNS的核心檔案,修改這兩個檔案需要管理員許可權,預設的許可權為: root:named,不要隨便更改這兩個檔案的執行許可權,DNS 服務會出現問題。 配置檔案的註釋符號為 `//` #### acl 一般來說,ACL模組用來承擔控制主機可以訪問域名解析伺服器的角色,其設定不會讓控制檔案的配置非常冗餘和龐大。採用這個配置可以有效防範DOS以及Spoofing攻擊。一般來說定義這部分的內容來規定IP是否能夠被接入以及Blocklist來阻止某些特定的IP地址介入到域名解析伺服器中。 ACL匹配客戶端是否能夠接入到域名伺服器基於三個基本的特徵: + 客戶端的IPv4或者IPv6地址 + 用於簽署請求的 TSIG 和 SIG(0) 金鑰 + 在DNS客戶端子網選項中編碼的字首地址 匹配 `acl` 定義以及使用規則如下: `string` 是用來命名IP地址集的一個變數名,可以隨意地被命名; `acl { ; ... };` 舉一個在 `named.conf.options` 檔案中被定義的例子: ```sh acl bogusnets { 0.0.0.0/8; 192.0.2.0/24; 224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; }; // 這個部分 // Set up an ACL called our-nets. Replace this with the // real IP numbers. acl our-nets { 172.16.2.11/24; 172.16.2.12/24; }; //子網的名稱 ```
#### logging `logging` 部分的配置為DNS解析伺服器提供了日誌記錄的功能,DNS伺服器上的所有日誌記錄被儲存到了指定的檔案中。其通用的配置檔案為: ```yaml logging { category { ; ... }; channel { buffered ; file [ versions ( unlimited | ) ] [ size ] [ suffix ( increment | timestamp ) ]; null; print-category ; print-severity ; print-time ( iso8601 | iso8601-utc | local | ); severity ; stderr; syslog [ ]; }; }; ``` 從上邊的通用配置格式可以看出來,`logging` 模組分為兩個部分,`category` 和 `channel`,channel的作用是指定輸出的方式、日誌格式的選項和事件的嚴重性,每一個channel 可以指定一個 category 來指定記錄的事件型別。其中 category 用來區分不同的事件產生的類別或者場景,比如:客戶端請求-`client request`、配置檔案解析處理-`Configuration file parsing and processing`。 如果在 `named.conf.options` 檔案中沒有指定 `logging` 模組系統會給出一個預設的配置 ```shell logging { category default { default_syslog; default_debug; }; category unmatched { null; }; }; ``` `channel` 的配置規則: + 所有的日誌輸出都需要 channel 來指定輸出格式,BIND9 對於建立 channel 的數量沒有限制。 + 每一個 channel 都需要為該通道的日誌資訊指定一個 `destination clause` - 目的控制代碼,目的控制代碼在 channel 階段被配置,這個目的控制代碼用來區分: 1)輸出到具體的檔案的名字 - `file`;2)輸出到具體的系統日誌工具中(syslog/syslogd)- `syslog`;3)輸出到終端顯示- 標準錯誤流(standard error stream);4)或者該錯誤訊息直接被丟棄 - `null`。 其次,channel 的配置可以規定每一個錯誤日誌訊息的響應級別,預設的響應級別是`info` ,channel 可以規定接受錯誤訊息的級別;此外,channel 還可以控制輸出錯誤日誌訊息的格式,可以包含:響應時間戳、category名字、嚴重等級等。 `channel` 的配置引數: + `buffered`: 用來規定是否重新整理錯誤日誌的檔案,其引數值為``,在 BIND9 中 `` 值的引數值為 `yes` / `no`,如果設定成為 `yes` 那麼日誌訊息流(一般每一個錯誤日誌訊息都是一個 Log Entry)就不會重新整理,而是被儲存在緩衝區中了,不會重新整理到檔案中。 + `file`: 類似於Linux的通道概念,file 將日誌輸出流通過通道直接輸出給檔案,從上邊的通用配置可以看出來可以為 file 指定文字檔案的大小 - `size` ;指定 log 檔案的版本號 - `version`;指定用於命名備份版本的格式 - `suffix` `size` 用來限制log檔案的大小,如果log檔案的大小設定超過了設定的閾值,那麼系統會自動停止輸出內容到檔案中; `versions`: 用於指定新建立的 log檔案數儲存到本地的上限值,預設的引數值為`unlimited`,當指定的檔案的大小超過設定的`size`值得時候,如果沒有指定 `versions`,那麼系統就不會繼續寫進log;如果制定了`versions`,那麼就會繼續寫入; `suffix` :設定用來命名`log`檔案的方式;好像沒啥用,我新增這個引數沒有什麼反應...; + `syslog`:將通道定向到系統的日誌檔案流中; 常用的支援日誌檔案服務為:`dameon`、`syslog`、`local6`、`local7`; + `severity`:用來承擔定義日誌嚴重級別的定義角色,相當於 `syslog` - `priorities`。比如說定義了日誌的嚴重級別為 `Debug`,那麼會輸出日誌事件 `Debug` 以上的錯誤到檔案中。一般常用的嚴重等級: `debug[level]`、`notice`、`warning`、`dynamic` - 與當前伺服器的日誌保持一致;一般的 DNS伺服器的日誌等級調成 `info`即可; + `stderr`:將通道指向伺服器的標準錯誤流。這是為了在伺服器作為前臺程序執行時使用; + `print-time`: `yes` / `no` / `local` / `iso8601` / `iso8061-utc` 可以設定不同的輸出到日誌檔案的時間格式; + `print-category`:列印日誌訊息配置`category` 的資訊; + `print-severity`: 列印日誌的嚴重等級
`category`片語配置規則:`category { ; ... };` + `client`: 客戶端請求; + `cname`:由於是CNAME而不是a /AAAA記錄 的域名伺服器; + `config`: 配置檔案解析和處理過程; + `database`:與名稱伺服器內部用於儲存區域和快取資料的資料庫相關的訊息; + `general`: 沒有被歸類的 `category` 類別的其他種類的日誌檔案資訊; + `lame-servers`: 遠端伺服器中的錯誤配置,BIND 9在解析期間試圖查詢這些伺服器時發現; + `network`: 網路操作; + `notify`: 通知協議; + `queries`:記錄所有查詢 DNS伺服器的 query; + `query-errors`: 關於導致某些失敗的查詢的資訊; + `xfer-in`:區域傳輸伺服器正在接收; + `xfer-out`:區域傳輸伺服器正在傳送的資訊; + `zoneload`:載入區域和建立自動空區域; **怎麼去配置這個服務?** 配置的 `logging` 服務會建立指定的日誌檔案,該日誌檔案從服務掛起的時候被建立,用於記錄DNS服務中的相關的配置資訊以及交換資訊。在 Debian9 的預設儲存目錄為 `/var/cache/bind/*`。你也可以為其指定儲存的位置。 如果你想要配置成一個自己的目錄,首先你需要建立一個自定義的目錄,比如說我指定了我想要存放日誌的檔案的目錄: `/var/log/bind`,如果不為這個檔案使用`chown`命令指定許可權的話會出現 `isc_stdio_open '/var/log/example.log' failed` 的報錯。解決方法是: `sudo chown bind:root /var/log/bind` 現在我們已經基本上了解了 logging 的工作原理,其工作機制簡單地來說就是,首先你需要建立一個 channel 來規定輸出日誌流的格式還以及日誌檔名、檔案版本,每一個 channel 可以被多個 category 呼叫使用,每一個 category 相當於一個 BIND9 內嵌的服務模組,服務模組去呼叫日誌配置模最後輸出格式化日誌。 #### options `options` 的引數設定會影響整個 BIND9 DNS環境的配置,具體各部分常用到的配置引數如下: + `listen-on`: 用於配置監聽的埠以及IPv4地址,預設的監聽埠為:53; + `listen-on-v6`:用於監聽 IPv6 地址以及埠; + `directory`: 用於指定讀取DNS資料檔案的資料夾,預設的資料夾的路徑為:`/var/cache/bind`; + `dump-file`:選項用來設定域名快取資料庫檔案的位置,可以自己定義。預設的儲存檔案為:`named_dump.db`; + `statistics-file`:選項用來設定狀態統計檔案的位置,可以自己定義。; + `memstatistics-file` :選項用來設定伺服器輸出的記憶體使用統計資訊。預設儲存在 `/var/named/data` 目錄下,檔名為 `named.memstats`; + `allow-query`:選項用來設定允許DNS查詢的客戶端地址,預設值為`localhost`, 可以設定為某個網段、任意地址、具體的某臺主機三種情況。例如,要修改為任意地址,就在括號內的加入 `any`,也可以引用之前建立的 `acl` 內的所有地址; + `recursion`:用於設定遞迴查詢,一般客戶機和伺服器之間屬於遞迴查詢,即當客戶機向DNS伺服器發出查詢請求後,若DNS伺服器本身不能解析,則會向另外的DNS伺服器發出查詢請求,得到結果後轉交給客戶機。此選項有`yes`和`no`兩個值。這個選項用於設定 Failover 非常有用; + `dnssec-enable`: 選項用來設定是否啟用`DNSSEC`支援,`DNSSEC`可以用來驗證`DNS資料`的有效性,該選項有`yes`和`no`兩個值,預設值為`yes`。 + `dnssec-validation`:選項用來設定是否啟用DNSSEC確認,預設值為`yes`,可以選擇 `auto`。 + `bindkeys-file` : 用來設定內建信任的金鑰檔案,其預設值為 `/etc/named/iscdlv.key`; + `managed-keys-directory`: 選項用於指定目錄中的檔案儲存位置,跟蹤管理 `DNSSEC` 金鑰, 這部分的內容在後邊會有介紹; + `forwarders`:DNS轉發器。用於設定該DNS解析伺服器無法進行當前域名解析的情況下,進行轉發解析的DNS地址,其中 `8.8.8.8` 和 `8.8.4.4` 是谷歌的免費DNS伺服器的網路地址;`233.5.5.5` 和 `233.6.6.6` 是阿里雲的免費DNS地址。當設定了 `forwarder` 的轉發器之後,所有的非本域的和在快取中無法查詢到的域名查詢都轉發都設定的DNS轉發器,由DNS轉發器 完成轉發操作。因此這臺轉發器的快取中就記錄了豐富的域名資訊。因此如果遇到非本域的查詢,轉發器的快取就可以做到查詢,從而減少了向外部的查詢流量。 + `forward`: 選擇預設的IP地址即可; #### controls controls語句聲明瞭系統管理員用於管理名稱伺服器遠端操作的控制通道。`rndc`使用這些控制通道向名稱伺服器傳送命令,並從名稱伺服器檢索非dns結果。 ### 2.2 Zone 檔案 - named.conf.local 該檔案定義了 BIND9 中的 ZONE(區域)檔案在`named.conf`檔案中的定義,用於定義解析的域名的資料庫檔案,即域名與IP地址的對映關係以及DNS傳送的解析域名資料包的相關引數設定,其定義的格式如下: ```shell zone "" { } ``` 當然你也可以定義你的反向解析域名通過以下的格式進行定義: ```shell zone "-addr.arpa" { } ``` 常用的引數配置如下: + `file` - 和 `options `的引數的含義是一樣的,用於指出域名與IP地址解析的資料庫配置檔案; + `allow-transfer`: 這個地方的配置是用來給出 Failover 或者是 遞迴查詢DNS伺服器的IP地址,如果之前在 `options` 裡配置的`allow-transfer` 如果設定成了引數 `yes`, 那麼需要在這裡指出遞迴查詢伺服器的IP地址; + `type`: 用於指定當前DNS解析伺服器的位置,是主伺服器 - master 還是從伺服器 - slaver? ## 3. Windows下的安裝測試 ### 3.1 BIND 9 Executable Windows Edition 下載及其安裝 #### Windows 桌面及其Server執行版本要求 BIND 9 部署到 Windows 環境需要滿足以下的環境條件: ```markdown Windows 64 bit for win64 built using Microsoft Visual Studio 2012 (.x64.zip) ``` ISC 要求需要滿足執行環境下 `Microsoft Visual Studio 2012` 及其依賴的安裝, 不能執行在 `Microsoft Windows XP` 和 `Microsoft Windows Server 2003` 下。 #### BIND 9 Windows版本 Windows版本下載的網址請單擊: https://www.isc.org/download/ 目前 ISC 給出了三種可以下載的版本,第一種是測試版本 `9.17.9` , 第二種是穩定版本 `9.16.11`,我使用的是該版本作為 Windows下的測試版本,第三種版本是 `9.11.27` 作為一種穩定的老舊版本,已經停止了更新維護。 ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301215014909-611826219.png) #### 安裝步驟 1.下載完成之後,需要安裝的檔案是一個壓縮檔案 ( BIND9.16.11.x64.zip ),在 Windows下解壓之後即可正常執行。下圖為解壓之後的檔案目錄。 ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301215031648-1418751761.png) 2.**使用管理員許可權**開啟 `BINDInstall.exe` 檔案,進入到介面的安裝步驟中。未使用管理員許可權開啟該檔案可能會帶來安裝過程中的錯誤。 3.在下邊的圖片請選擇: + `Keep Config Files After Uninstall` 、 `Start BIND Service After Install` 以及 `Automatic Startup` 選項,確保能夠在裝置重啟之後DNS服務可以正確被執行。 + 保留 `Service Account Name` 為預設值不要更改,更改成其他的字串會發生錯誤。 + 輸入一個預設密碼進行安裝 ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301215041072-1452517143.png) 4.正確配置之後會提示你安裝 `Microsoft Visual C++ 2017`, 如果已經安裝請單擊 **修復** 保證安裝的環境是正確的,如果系統環境中沒有該執行的環境請按照提示進行安裝。 ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301215048741-250241283.png) 5.安裝成功之後會提示: ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301215055980-827860077.png) 6.將所有的工具加入到Windows環境變數中。 右鍵單擊 “此電腦”,單擊 “屬性”,單擊“高階”,單擊“環境變數”。 找到 `Path` 的環境變數,雙擊並加入新的路徑: `C:\Program Files\ISC BIND 9\bin` 驗證: + 在命令列介面輸入: `dig` ```shell C:\Users\DoHeras>dig ; <<>> DiG 9.16.11 <<>> ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34160 ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 4502 IN NS a.root-servers.net. . 4502 IN NS g.root-servers.net. . 4502 IN NS l.root-servers.net. . 4502 IN NS c.root-servers.net. . 4502 IN NS d.root-servers.net. . 4502 IN NS b.root-servers.net. . 4502 IN NS k.root-servers.net. . 4502 IN NS h.root-servers.net. . 4502 IN NS i.root-servers.net. . 4502 IN NS j.root-servers.net. . 4502 IN NS e.root-servers.net. . 4502 IN NS m.root-servers.net. . 4502 IN NS f.root-servers.net. ;; Query time: 31 msec ;; SERVER: 172.16.2.1#53(172.16.2.1) ;; WHEN: Thu Jan 28 18:34:42 中國標準時間 2021 ;; MSG SIZE rcvd: 239 ``` ### 3.2 BIND 9 在 Windows環境的配置 區別於舊版的 ISC BIND 服務,舊版的軟體安裝在 `C:\Windows\System32\dns`中,新版軟體安裝的目錄則在 `C:\Program Files\ISC BIND 9`,因此新版軟體的環境配置相比舊版的直接在系統目錄下安裝更加複雜。 #### 步驟 1.安裝結束之後,進入到安裝目錄 `C:\Program Files\ISC BIND 9\bin` 下執行 `rndc-config.exe` 來生成一個 `rndc.key`。這個 key 是 BIND 9.x版本的新功能,是有關DNS更新以及更新時加密處理的,跟我們個人使用者無太大關係,不過基於相容性,還是照做。 這個 key 生成的路徑為: `C:\Program Files\ISC BIND 9\etc` , 同時這個資料夾也是用來存放 BIND 服務的配置檔案的。 生成後的 key 顯示如下: ![06](../DNS 解析/DNS:BIND/06.png) 2.配置一個 `named.conf` 檔案, 同時這個檔案也是 BIND 的配置檔案,目前配置檔案的內容先簡單如下: ``` options { // zone檔案的位置 directory "C:\Program Files\ISC BIND 9\etc"; // 無法解析的域名就去查詢ISP提供的DNS // 在下面的IP地址位置上填寫ISP的DNS地址 forwarders { //這裡是你本機IP或者127.0.0.1 127.0.0.1; }; // 僅允許本機與192.168.0.0網段內的機器查詢 allow-query { 127.0.0.1; 192.168.0.0/16; 10.231.0.0/16; 10.232.0.0/16; }; }; // 根DNS zone "." { type hint; file "root.zone"; }; // localhost zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; // localhost的反向解析 zone "0.0.127.in-addr.arpa" { type master; file "localhost.rev"; }; // 123.com是我們為自己的域的正向解析配置 zone "123.com" IN { type master; file "123.com.zone"; }; // whalecloudvcenter.com是我們為自己的域的正向解析配置 zone "whalecloudvcenter.com" IN { type master; file "whalecloudvcenter.com.zone"; }; // whalecloudvcenter.com的反向解析 zone "100.168.192.in-addr.arpa" { type master; file "whalecloudvcenter.com.rev"; }; ``` 3.從ISC網站上下載相關的`named`檔案到本地上,網址為: `https://www.internic.net/domain/named.root` 去下載 `name.root` 檔案。 在`https://www.internic.net/domain/root.zone` 網址中下載`root.zone` 檔案。並將這兩個檔案拷貝到`C:\Program Files\ISC BIND 9\etc` 目錄。 4.建立一個新的 `localhost.zone` 到 `C:\Program Files\ISC BIND 9\etc` 中來配置 `localhost`的正向解析。 ``` $TTL 1D @ IN SOA localhost. root.localhost. ( 2007091701 ; Serial 30800 ; Refresh 7200 ; Retry 604800 ; Expire 300 ) ; Minimum IN NS localhost. localhost. IN A 127.0.0.1 ``` 5.建立一個新的 `localhost.rev` 檔案到 `C:\Program Files\ISC BIND 9\etc` 中來配置 `localhost` 的反向解析。 ``` $TTL 1D @ IN SOA localhost. root.localhost. ( 2007091701 ; Serial 30800 ; Refresh 7200 ; Retry 604800 ; Expire 300 ) ; Minimum IN NS localhost. 1 IN PTR localhost. ``` 6.建立一個新的 `123.com.zone` 檔案到 `C:\Program Files\ISC BIND 9\etc` 中來為自己的域名來配置正向解析。 ``` 123.com. IN SOA ns1.123.com. root.123.com. ( 2007091701 ; Serial 30800 ; Refresh 7200 ; Retry 604800 ; Expire 300 ) ; Minimum IN NS ns1.123.com. * IN A 127.0.0.1 ``` 7.建立一個新的`whalecloudvcenter.com.zone` 到 `C:\Program Files\ISC BIND 9\etc` 中配置自己的伺服器域名的正向解析服務。 ``` whalecloudvcenter.com. IN SOA ns1.whalecloudvcenter.com. root.whalecloudvcenter.com. ( 2007091701 ; Serial 30800 ; Refresh 7200 ; Retry 604800 ; Expire 300 ) ; Minimum IN NS ns1.whalecloudvcenter.com. * IN A 192.168.100.1 ``` 8.建立一個新的 `whalecloudvcenter.com.rev` 到 `C:\Program Files\ISC BIND 9\etc` 中配置自己伺服器域名的反向解析服務。 ``` $TTL 1D @ IN SOA whalecloudvcenter.com. root.whalecloudvcenter.com. ( 2007091701 ; Serial 30800 ; Refresh 7200 ; Retry 604800 ; Expire 300 ) ; Minimum IN NS whalecloudvcenter.com. 1 IN PTR whalecloudvcenter.com. ``` 目前我們在 `C:\Program Files\ISC BIND 9\etc` 目錄下的檔案有: ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301215244211-366929551.png) 9.在剛才安裝的過程中,系統已經預設建立了一個新的使用者 `named`, 這個使用者用來構建 DNS 服務,下一步需要做到的是為當前的資料夾配置許可權,在目錄 `C"\Program Files\ISC BIND 9` 配置所有的許可權為: 全部允許。 這步的操作需要對所有在 “組或使用者名稱” 下的所有使用者和組新增許可權,因為不知道新建立的使用者處於哪一個分組下,因此需要全部進行建立。 ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301215252595-244527997.png) 10.在“系統服務”中配置 `ISC BIND 9` Service 的相關配置。先開啟管理命令列,並輸入 `services.msc`,回車。 ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301215259545-183688270.png) 進入到 “管理服務” 頁面之後,找到 `ISC BIND` 服務之後雙擊改變屬性。在下圖中,請確認使用賬戶 `./named` 使用者進行登入,密碼在預設的時候已經被配置了,不需要進行更改。 ![](https://img2020.cnblogs.com/blog/2242595/202103/2242595-20210301215306658-1573410366.png) 11.最後,完成所有檔案的建立和配置更新之後,可以執行本機的DNS解析服務了,有兩種啟動方式: + 第一種:在“管理服務”右鍵單擊 `ISC BIND` 服務進行啟動 + 第二種:使用命令列(管理員模式)啟動當前服務 這裡主要介紹第二種啟動方式: 啟動當前服務: ```shell C:\Program Files\ISC BIND 9\bin>
net start named ISC BIND 服務正在啟動 . ISC BIND 服務已經啟動成功。 ``` 結束當前服務: ```shell C:\Program Files\ISC BIND 9\bin>net stop named ISC BIND 服務正在停止. ISC BIND 服務已成功停止。 ``` #### TroubleShooting **遇到如果現出“ Window 無法啟動 ISC BIND 服務 錯誤1067** 解決辦法: + 檢查所有的檔案是否全部匯入到 `C:\Program Files\ISC BIND 9\etc`中,需要包含的檔案包括: + localhost.rev + localhost.zone + named.conf + named.root + rndc.key + root.zone + 檢查目錄 `C:\Program Files\ISC BIND 9` 目錄的許可權是否改為全部授權的許可權 + 程式意外結束導致named.pid檔案沒有正確刪除 + 檢查目錄 `C:\Program Files\ISC BIND 9\etc` 並刪除 named.pid檔案 + 再次啟動ISC BIND服務
--- ## 4. Debian Server 下的安裝配置 ### 4.1 Debian 9.11.0 下載 新版的 Debian 的 Release 版本的連結: https://www.debian.org/releases/ 歷史的 Debian 版本下載: http://cdimage.debian.org/cdimage/archive/ 其中,目前Virtual Private Server 常用的版本為: Debian 7:Debian 7.8 Debian 8:Debian 8.0/8.2/8.5 Debian 9:Debian 9.1/9.9/9.11 最終考慮其適配的裝置的範圍以及穩定性,犧牲最新的 Debian特性以及架構,選擇較為穩定的版本 Debian 9.11 進行下載,其磁力連結的下載地址為: http://bttracker.debian.org:6969/stat 下載的檔案為: [Debian_9.11][magnet:?xt=urn:btih:5c9634e7805c8a5049afa92f99946edaa574d449&dn=debian-9.11.0-amd64-DVD-1.iso&tr=udp://bttracker.debian.org:6969&tr=http://bttracker.debian.org:6969/announce] 版本資訊: ```shell NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" VERSION_CODENAME=stretch``` ``` ### 4.2 安裝Debian 安裝的步驟省略...或者留到以後進行更補... 配置安裝實體機與虛擬機器的安裝選項配置保持一致即可。 ### 4.3 安裝 BIND 9 服務到 Debian Server 在 Debian9 中查詢和重啟當前 BIND9 服務的命令是: `sudo systemctl status bind9` 和 `sudo systemctl restart bind9`。 #### 4.3.1 NS1 初始配置流程 1.Debian 的預設是沒有安裝`sudo` 工具的,這非常不方便,我們先安裝`sudo` 工具,安裝之前因為 Debian 9 的特性,需要修改`apt` 預設的源,其原始檔為:`/etc/apt/resources.list` ```shell doheras@debian:~$ su - Password root@debian:~# vi /etc/apt/resources.list # 163 deb http://mirrors.163.com/debian/ stretch main deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib deb http://httpredir.debian.org/debian stretch-backports main contrib non-free # VirtualBox deb http://download.virtualbox.org/virtualbox/debian stretch contrib root@debian:~# apt-get update root@debian:~# adduser doheras sudo ``` 2.現在安裝 `sudo` 工具 ```shell root@debian:~# apt-get install sudo -y ``` 3.使用 `sudo` 工具 安裝 BIND 9 並啟動 BIND 9 服務 ```shell doheras@debian:~$ sudo apt install bind9 bind9utils bind9-doc ... ... Wait for Installation Complete ... doheras@debian:~$ service /etc/bind/named start ``` 4.將 BIND 9 設定成為 IPv4 模式,將下列的 `OPTIONS = "-u bind"` 設定成 `OPTIONS = -u bind -4s`, 並重啟`BIND`服務。 ```shell doheras@debian:~$ sudo nano /etc/default/bind9 # startup options for the server OPTIONS="-u bind -4" doheras@debian:~$ sudo systemctl restart BIND9 ``` 5.請參照之前配置 Windows BIND 服務的流程,我們需要先配置 Debian 下的 BIND 服務 `namemd.conf.options`。配置這個檔案需要用到管理員許可權,完成之後這些配置指定只有您自己的伺服器(受信任的伺服器)才能查詢您的DNS伺服器的外部域 (Domain)。 ```shell doheras@debian:~$ sudo nano /etc/bind/named.conf.options acl "trusted" { 172.16.2.11; 172.16.2.12; 172.16.2.4; 172.16.2.5; 172.16.2.6; }; options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. // forwarders { // 0.0.0.0; // }; //=====================================================================$ // If BIND logs error messages about the root key being expired, // you will need to update your keys. See https://www.isc.org/bind-keys //=====================================================================$ dnssec-validation auto; recursion yes; allow-recursion {trusted;}; listen-on {172.16.2.11;}; allow-transfer {none;}; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; forwarders { 8.8.8.8; 8.8.4.4; 0.0.0.0; }; }; ``` 6.更改完 `named.conf.options` 檔案之後,需要更改 `named.conf.local` 檔案來配置正向和反向代理,一般來說這個檔案用來配置 DNS Zone。因為我們設定的主域是`nyc3.example.com`,所以我們需要設定一個正向區域,用來轉發和對映域名 `nyc3.example.com`到子網 `10.120.0.0/18`。 ```shell zone "nyc3.example.com" { type master; file "/etc/bind/zones/db.nyc3.example.com"; # zone file path allow-transfer { 172.16.2.12; }; # ns2 private IP address - secon$ }; ``` 7.步驟6設定了DNS Zone 的正向區域,現在設定反向區域。如果您的伺服器跨越多個專用子網,但位於同一資料中心,請確保為每個不同的子網指定其他區域和區域檔案。 完成所有所需區域的新增後,儲存並退出`named.conf.local`檔案。現在,我們的區域已在BIND中指定,我們需要建立相應的正向和反向區域檔案。 ```shell zone "16.172.in-addr.arpa" { type master; file "/etc/bind/zones/db.16.172"; # 10.128.0.0/16 subnet allow-transfer { 172.16.2.12; }; # ns2 private IP address - secondary }; ``` 8.建立一個正向轉發區域文件,轉發區域檔案是 BIND 用來轉發DNS和查詢DNS的檔案,也就是說當DNS Server收到了一個DNS請求的時候,用來查詢 Domain Name和對應IP之間的關係。 在前邊的 步驟6 建立的正向區域檔案的對應路徑是 `/etc/bind/zones`,我們建立一個這樣的資料夾。 ```shell doheras@debian:~$ sudo mkdir /etc/bind/zones ``` 建立完成之後,需要新建一個`zone file`,在剛剛新建的資料夾中。 ```shell doheras@debian:~$ sudo cp /etc/bind/db.local /etc/bind/zones/db.nyc3.example.com ``` 9.進入到修改`/etc/bind/zones/db.nyc3.example.com` 區域檔案中修改成下邊給出的檔案內容: ```shell ; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. ( 3 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; ; name servers - NS records IN NS ns1.nyc3.example.com. IN NS ns2.nyc3.example.com. ; name servers - A records ns1.nyc3.example.com. IN A 172.16.2.11 ns2.nyc3.example.com. IN A 172.16.2.12 ; 172.16.0.0/18 - A records host1.nyc3.example.com. IN A 172.16.2.4 host2.nyc3.example.com. IN A 172.16.2.5 host3.nyc3.example.com. IN A 172.16.2.6 ``` 10.現在建立反向區域的文件 ,反向區域檔案是我們為反向DNS查詢定義DNS PTR記錄的地方。我們需要建立的檔案為: `/etc/bind/zones/db.10.128` ,複製的原始檔為: `/etc/bind/db.127`, 複製的命令為: ```shell doheras@debian:~$ sudo cp /etc/bind/db.127 /etc/bind/zones/db.10.128 doheras@debian:~$ sudo nano /etc/bind/zones/db.10.128 ``` 建立完成之後的內容如下: 其中 PTR 的順序為子網IP地址的倒序: `172.16.2.11` -> `11.2.16.172` ```shell ; BIND reverse data file for local loopback interface ; ; $TTL 604800 @ IN SOA nyc3.example.com. admin.nyc3.example.com. ( 3 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; name servers IN NS ns1.nyc3.example.com. IN NS ns2.nyc3.example.com. ; PTR Records 11.2 IN PTR ns1.nyc3.example.com. ; 172.16.2.11 12.2 IN PTR ns2.nyc3.example.com. ; 172.16.2.12 4.2 IN PTR host1.nyc3.example.com. ; 172.16.2.4 5.2 IN PTR host2.nyc3.example.com. ; 172.16.2.5 6.2 IN PTR host3.nyc3.example.com. ; 172.16.2.6 ``` 11.現在我們已經完成了所有檔案的建立,現在需要檢查建立的規則是否滿足要求: 檢查檔案 `named.conf.options`的命令 ```shell doheras@debian:~$ sudo named-checkconf ``` 檢查 正向區域 (Forward Zone) 是否滿足配置的要求 ```shell doheras@debian:~$ sudo named-checkzone nyc3.example.com /etc/bind/zones/db.nyc3.example.com ``` 檢查 反向區域 (Reverse Zone) 是否滿足配置的要求 ```shell doheras@debian:~$ sudo named-checkzone 16.172.in-addr.arpa /etc/bind/zones/db.16.172 ``` 12.重啟 BIND 服務 和 配置 UFW 服務在Debian 9伺服器上以及允許BIND服務 + 重啟 bind9 服務來使之前的配置生效 ```shell doheras@debian:~$ sudo systemctl restart bind9 ``` + 安裝和配置 UFW 服務在Debian 9 伺服器上 ```shell #第一步 #安裝UFW服務 doheras@debian:~$ sudo apt install ufw #第二步 #需要配置一下IPv6的網路地址 如果您的Debian伺服器已啟用IPv6,請確保UFW配置為支援IPv6,以便它將管理IPv4之外的IPv6防火牆規則。請確保IPv6=yes doheras@debian:~$ sudo nano /etc/default/ufw ... # Set to yes to apply rules to support IPv6 (no means only IPv6 on loopback # accepted). You will need to 'disable' and then 'enable' the firewall for # the changes to take affect. IPV6=yes ... #第三步 #配置Policy 預設的配置是 所有連線進來的不能被允許 所有出去的都被允許 doheras@debian:~$ sudo ufw default deny incoming doheras@debian:~$ sudo ufw default allow outgoing #第四步 #允許SSH Connection doheras@debian:~$ sudo ufw allow ssh #第五步 doheras@debian:~$ sudo ufw enable ``` + 允許 BIND Service 從防火牆上通過(我也搞不清楚到底是哪一個...感覺服務名是不是不需要區分大小寫) ```shell doheras@debian:~$ sudo ufw allow bind9 doheras@debian:~$ sudo ufw allow Bind9 ``` #### 4.3.2 NS2 初始配置流程 1.配置的流程與 NS1 配置流程基本上相同,因為 NS2 作為 NS1 的備用DNS伺服器,配置需要保持一樣,這裡附上詳細的每個檔案的配置內容。 `named.conf.options` ```shell doheras@debian:~$ sudo nano /etc/bind/named.conf.options acl "trusted" { 172.16.2.11; 172.16.2.12; 172.16.2.4; 172.16.2.5; 172.16.2.6; }; options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. // forwarders { // 0.0.0.0; // }; //=====================================================================$ // If BIND logs error messages about the root key being expired, // you will need to update your keys. See https://www.isc.org/bind-keys //=====================================================================$ dnssec-validation auto; recursion yes; allow-recursion {trusted;}; listen-on {172.16.2.12;}; # 這個地方要換成ns2的網路地址 allow-transfer {none;}; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; forwarders { 8.8.8.8; 8.8.4.4; 0.0.0.0; }; }; ``` `named.conf.local` 在主DNS伺服器上定義與主域對應的從域。注意,型別是slave,檔案不包含路徑,並且有一個主指令,應該設定為主DNS伺服器的私有IP地址。如果在主DNS伺服器中定義了多個反向區域,請確保將它們全部新增到此處 ```shell // // Do any local configuration here // // Consider adding the 1918 zones here, if they are not used in your // organization //include "/etc/bind/zones.rfc1918"; zone "nyc3.example.com" { type slave; file "db.nyc3.example.com"; # zone file path masters { 172.16.2.11; }; # ns1 private IP address - secon$ }; zone "16.172.in-addr.arpa" { type slave; file "db.16.172"; # 172.16.2.0/24 masters { 172.16.2.11; }; # ns1 private IP address - secondary }; ``` 2.根據 NS1 配置流程安裝和配置 UFW 服務,並開啟 UFW 服務。 ```shell $ sudo ufw allow Bind9 ``` ### 4.4 配置 Client 說明: Client_n 為以上配置的 Host_n,其IPv4地址需要與上邊的保持一致。 #### 4.4.1 Ubuntu 20.04 客戶端 1.首先,使用`ip address`命令查詢私網子網,找到與私閘道器聯的裝置。 ```shell $ ip address show to 172.16.2.0/24 ``` 會有一個輸出: ```shell 2: ens33: mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 172.16.2.4/24 brd 172.16.2.255 scope global dynamic noprefixroute ens33 valid_lft 85520sec preferred_lft 85520sec ``` 2.在 Ubuntu 的路徑 `/etc/netplan` 路徑下找到 `*-private-nameservers.yaml` 檔案,其檔名可能會根據不同的裝置而不同,請仔細檢查該路徑下的檔案進行更改,比如說在我的虛機裡我的檔案就是 `01-private-nameservers.yaml`。 ```shell $ sudo nano /etc/netplan/00-private-nameservers.yaml ``` 內容為: ```yaml network: version: 2 ethernets: ens33: # Private network interface nameservers: addresses: - 172.16.2.11 # Private IP for ns1 - 172.16.2.12 # Private IP for ns2 search: [ nyc3.example.com ] # DNS zone ``` 3.完成配置之後,使用下邊的命令讓 NetPlan 採用新的配置,如果存在網路問題那麼新的配置就會中斷。如果你想要接收當前配置,那麼就輸入 `Enter`。 ```shell $ sudo netplan try ``` ```shell Do you want to keep these settings? Press ENTER before the timeout to accept the new configuration Changes will revert in 117 seconds ``` 4.現在,檢查系統的DNS解析器以確定您的DNS配置是否已應用 ```shell $ sudo systemd-resolve --status ``` 正確的內容會顯示你剛剛配置的 DNS Server 和 DNS Domain 現在可以正確的使用DNS Server作為域名解析了~ #### 4.4.2 CentOS 8 客戶端 1.編輯`/etc/sysconfig/network-scripts/ifcfg-ens33`檔案。您可能必須用當前主機的主網路介面的名稱替換`ens33`,因為本次模擬搭建的環境為虛擬機器環境,所以必須檢視網絡卡是否對應。 檢視網路配置,從下邊的文字可以看出虛機的IP地址為: `172.16.2.6/24`,對應的網絡卡名稱為: `ens33` ```shell CentOS8$ ip addr 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:e6:20:79 brd ff:ff:ff:ff:ff:ff inet 172.16.2.6/24 brd 172.16.2.255 scope global dynamic noprefixroute ens33 valid_lft 84375sec preferred_lft 84375sec inet6 fe80::22ec:5ec9:b729:d16d/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: virbr0: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:3b:9a:58 brd ff:ff:ff:ff:ff:ff 4: virbr0-nic: mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:3b:9a:58 brd ff:ff:ff:ff:ff:ff ``` 因此,修改的檔名稱為 `/etc/sysconfig/network-scripts/ifcfg-ens33` ```shell CentOS8$ sudo nano /etc/sysconfig/network-scripts/ifcfg-ens33 ``` 將上述開啟的檔案更改為: ```shell TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="none" # 取消 DHCP 服務, 更改為 Static IP 模式 DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="2e9c162d-fbed-4f65-8a42-e69285538ac2" DEVICE="ens33" ONBOOT="yes" IPADDR="172.16.2.6" # IP Address NETMASK="255.255.255.0" # NetMask GATEWAY="172.16.2.1" # Gateway / Router DNS1="172.16.2.11" # ns1的IP地址 DNS2="172.16.2.12" # ns2的IP地址 DOMAIN='nyc3.example.com' ``` 2.重啟`NetworkManager`服務 ```shell CentOS8$ sudo systemctl restart NetworkManager.service ``` 3.安裝 `bind-utils` ```shell CentOS8$ sudo yum install bind-utils ``` 4.檢視 `resolv.conf` 確認配置是否生效 ```shell CentOS8$ cat /etc/resolv.conf # Generated by NetworkManager search nyc3.example.com nameserver 172.16.2.11 nameserver 172.16.2.12 ``` ### 4.5 測試客戶端 #### 4.5.1 Forward Lookup Test 在客戶端 (Host) 輸入以下命令: ```shell CentOS8$ nslookup host1 ``` 正確輸出: ```shell Server: 172.16.2.11 Address: 172.16.2.11#53 Name: host1.nyc3.example.com Address: 172.16.2.4 ``` #### 4.5.2 Reverse Lookup 在客戶端 (Host) 輸入以下命令: ```shell CentOS8$ nslookup 172.16.2.11 ``` 正確輸出: ``` 11.2.16.172.in-addr.arpa name = host1.nyc3.example.com. ``` ### 4.6 維護 DNS 配置資訊 再完成上邊的任務之後,我們已經搭建了一個簡單的 DNS 伺服器 在虛擬機器網路上,現在的任務是我們需要維護我們的 DNS記錄來保證伺服器的運作穩定和便於維護,這個功能可以及時、有效地反映伺服器的環境以及執行情況。 #### 4.6.1 新增一個新的Host到當前的BIND配置中 ##### 4.6.1.1 Primary Server - ns1 + 第一步: 將新主機的私有IP地址新增到受信任的ACL中(`named.conf.options`)。 + 第二步: 更改 Primary Server下的 `db.nyc3.example.com` 檔案, 為新主機新增一條 `A` 記錄,增加`Serial`的值;格式根據之前的格式來增加即可。 + 第三步:更改 Primary Server下的 `db.16.172` 檔案,為新主機增加一條新的 `PTR` 記錄,增加 `Serial` 的值,格式根據之前的格式來調整即可。 + 第四步:執行之前的配置過程的所有檢查步驟。 + 第五步:重新啟動 BIND9 服務。 ##### 4.6.1.2 Secondary Server - ns2 + 第一步: 將將新主機的私有IP地址新增到受信任的ACL中(`named.conf.options`)。 + 第二步: 檢查配置檔案是否正確: `sudo named-checkconf` + 第三步: 重啟 Secondary Server的 BIND9 服務 ##### 4.6.1.3 Host-Client 配置 + 新增新的Host(客戶端) 的流程就參照之前的步驟 #### 4.6.2 DNS日誌記錄 從上邊來看,我們可以為 DNS Server 增加一個 `logging`模組,新增的內容為下邊: ```shell logging{ channel default_logfile { file "/var/log/bind/example_1.log" versions 3 size 1m; print-category yes; print-severity yes; print-time yes; severity info; }; channel default_querylogfile{ file "/var/log/bind/query.log" versions 3 size 1m; print-category yes; print-severity yes; print-time yes; severity info; }; channel default_databaselogfile{ file "/var/cache/bind/data/database.log" versions 3 size 3m; print-time yes; print-severity yes; severity debug; }; category default { default_logfile; }; category queries { default_querylogfile; }; category database { default_databaselogfile; }; category unmatched { null; }; }; ``` ## 5. DNS Server的壓力測試 - queryperf 工具 對於普通的DNS伺服器來說,根據進行域名解析的過程不同,被分成了兩種解析模式:遞迴查詢和迭代查詢。簡單來比較這兩個的區別: **遞迴查詢** 遞迴查詢由客戶端向**本地域名伺服器**傳送請求,然後等待本地域名伺服器返回結果。 如果**客戶端**向一個**本地域名伺服器**請求一個域名的查詢操作但是本地域名伺服器並不知道查詢域名的IP地址,那麼**本地域名伺服器**就會模仿扮演成客戶端向根域名伺服器傳送繼續查詢的請求**而不是讓主機自己再向根域名伺服器傳送進行下一步的查詢**,直到查詢到結果或者查詢完所有的根域名伺服器; 所以 查詢的結果就是 一個特定的IP地址或者是未找到域名的報錯資訊。 **迭代查詢** 如果**根域名伺服器**收到了**本地域名伺服器**傳送的迭代查詢請求報文時,要麼給出所要查詢的IP地址,要麼返回引導的域名伺服器進行查詢,所以查詢的動作如果不能給出最終的結果,那麼就是給客戶端返回一個DNS伺服器列表供客戶端繼續查詢。 從上邊的概念來看,實現遞迴的DNS伺服器效能評價更加困難,因為被測試的DNS伺服器有可能與其他的根域名伺服器或者是其他權威伺服器進行查詢互動,或者是管理以及維護之前瞭解到的域名資料快取。 ### 安裝 queryperf 【等待補充】 ### 配置 queryperf 【等待補充】 ## 6. DNS Server的安全性配置 首先, BIND9 的 `options` 提供的 `allow-query` 引數可以對訪問DNS解析伺服器的客戶端地址和網段進行限制,從而達到對陌生客戶端和惡意IP地址的封禁。 `named.conf.options` 中的引數 `dnssec-enable` 、`dnssec-validation` 等配置引數都是維護 DNS 伺服器安全性的非常重要的配置引數,DNS 的設計起始於上世紀 80 年代,當時網際網路規模小得多,安全性並非首要設計考慮因素。當DNS的遞迴解析器(DNS Resolver )向權威域名伺服器傳送查詢請求的時候,解析器無法驗證響應的真實性。解析器只需要檢查響應的IP地址與解析器傳送初始查詢的IP地址是否相同。 但是, 這種檢查機制存在一個非常嚴重的問題:權威域名伺服器的請求包的源地址非常容易被偽造和仿冒,攻擊者很容易冒充來自權威域名伺服器的響應,然後偽裝成解析器最初查詢的權威域名伺服器,因此可以很輕鬆將使用者重定向到其他的惡意網站。 因為需要考慮到遞迴解析器可能被入侵的場景,域名解析器有一種快取的機制用來加速解析流程,其原理是從權威域名伺服器和根解析器時候收到的上次DNS資料儲存到本地來加速下一次應答,避免查詢一個或者多個權威伺服器引發的服務延遲。然而,依靠快取存在一個缺點,如果攻擊者傳送的假冒的DNS權威域名伺服器響應被接受,那麼其快取就會被一直快取在遞迴解析伺服器中,因此之後所有的查詢DNS Server 的主機都會接收到欺詐性DNS資料。如果使用者訪問銀行網站,會怎麼樣?使用者裝置在其配置的遞迴域名伺服器中查詢銀行網站的 IP 地址。不過,攻擊者可以通過偽造IP地址向解析器注入惡意的快取資料,屆時 IP 地址並非指向目標合法網站,而是指向攻擊者建立的某個網站。這個欺詐網站冒充銀行網站,看上去毫無差別。使用者會毫無防備地輸入名稱和密碼,這就導致使用者在不經意間向攻擊者透露了自己的銀行憑證,攻擊者可以堂而皇之地以使用者的身份登入合法銀行網站進行轉賬或執行其他未經授權的操作。 對於解決這個問題, BIND 提供了一種名叫 `DNSSEC` 的安全擴充套件服務以及配套的金鑰生成工具供網路人員使用。 ##### DNSSEC DNSSEC 採用基於公鑰加密的數字簽名技術來加強 DNS的驗證強度。 DNSSEC 並非對DNS查詢和響應的過程進行傳輸加密,而是資料所有者對 DNS 資料進行簽名加密。 每一個 DNS Zone 在配置的時候 BIND 服務會為其建立一個公鑰和私鑰的配對的祕鑰對。 DNS zone 的所有者使用該區域的私鑰對區域內的DNS資料進行簽名,併為這些資料生成簽名。 DNS 解析器生成的 公鑰 對該區域內所有的 DNS資料驗證真實性。如果有效,證明DNS資料合法,則將所有的DNS資料返回給使用者。如果沒有通過驗證,解析器會認為發生了攻擊,丟棄資料併為使用者返回錯誤。 DNSSEC 在 DNS協議中新增加的兩個安全的功能: + 資料來源驗證 - DNS 解析器通過加密的方式驗證收到的資料是否確實來自其認定的資料傳送區域。 + 資料完整性保護 - DNS 解析器可以確信,自區域所有者使用私鑰第一次進行數字簽名,資料在傳輸過程中並未遭到修改。 每個zone都會發佈一個公鑰,遞迴解析器可以檢索公鑰以驗證區域中的資料,區域的公鑰也必須經過簽名。 ##### DS-records (Delegation Record) DS-records 用來保證金鑰分發的安全和DNS訊息內容的分發安全; 常見的 DS-records的分發格式為: + 關鍵字標籤 (Key Tags):一個簡短的數值,可以幫助快速識別所引用的DNSKEY記錄; + 演算法 (Algorithm):引用 DNSKey-record 的密碼學演算法; + 摘要型別 (Digest Type):用於建立摘要值的加密雜湊演算法; + 摘要 (Digest):引用的DNSKEY記錄的加密雜湊值; ##### ZONE 檔案安全配置分析 在 Debian9 下的所有的資料庫檔案都儲存到了配置的資料夾中,其路徑為:`/etc/bind`,每建立一個新的 ZONE 的配置檔案都會在當前路徑下建立一個新的`db`檔案來記錄資源地址和域名之間的對映關係,為了瞭解 DNSSEC在其中到底是怎麼應用的,我們可以去分析這些檔案的`DNSSEC`公鑰配置來明確 DNSSEC 在其中的配置原理。 ##### 在 Debian9 DNS伺服器上配置金鑰 - NS 1.首先需要在 `named.conf.options` 檔案以及引用檔案中的 `options` 加入一下配置: ```shell dnssec-enable yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; ``` 2.確定我們儲存金鑰的路徑,一般來說儲存 zone 的資料庫檔案的路徑為: `/var/cache/bind`,這個地方儲存著 zone 配置的資料庫檔案。我們在這個地方新建一個資料夾 `keys`,然後找到 `dnssec-keygen` 的配置資料夾,呼叫建立金鑰的命令: ```shell $ find / -name "dnssec-keygen" /usr/sbin/dnssec-keygen $ cd /var/cache/bind/keys ``` 建立金鑰的方式如下: -a : RSA | RSAMD5 | DSA | RSASHA1 | NSEC3RSASHA1 | NSEC3DSA | RSASHA256 | RSASHA512 | ECCGOST | ECDSAP256SHA256 | ECDSAP384SHA384 | DH | HMAC-MD5 | HMAC-SHA1 | HMAC-SHA224 | HMAC-SHA256 | HMAC-SHA384 | HMAC-SHA512 (default: RSASHA1, or NSEC3RSASHA1 if using -3) -b : RSAMD5: [512..4096] RSASHA1: [512..4096] NSEC3RSASHA1: [512..4096] RSASHA256: [512..4096] RSASHA512: [1024..4096] DH: [128..4096] DSA: [512..1024] and divisible by 64 NSEC3DSA: [512..1024] and divisible by 64 ECCGOST: ignored ECDSAP256SHA256: ignored ECDSAP384SHA384: ignored HMAC-MD5: [1..