Linux伺服器 Linux伺服器

網站伺服器建置與管理 - RockyLinux 9

網站伺服器建置與管理 > 課程內容 > 第 9 堂課 - 領域名稱伺服器 (DNS)

第 9 堂課 - 領域名稱伺服器 (DNS)

上次更新日期 2022/11/18

雖然要連上 Internet 得要使用 TCP/IP,但不論是 IPv4 還是 IPv6 的 IP 位址都是數字與英文的混合資料,對於人腦來說,真的是很難記憶。 因此早期的工程師就透過 /etc/hosts 來進行對應。但是 email 到 web 的火紅程度,讓 server 的數量整個大增,因此 /etc/hosts 無法負荷了! 所以後來就有分散式設定主機名稱與 IP 對應的 DNS 系統產生!DNS 真是好重要的服務!沒有了它,網際網路基本上就已經是癱瘓的狀態! 現在讓我們來架設屬於你的 DNS 系統吧!

學習目標

  • 理解 DNS 的正解/反解/zone 的意思
  • 了解 named.conf 的設定與正解 zone、反解 zone 的設定
  • 了解 master/slave DNS server 的設定
  • 9.1: Domain Name Service (DNS) 系統
  • 9.2: DNS 的階層架構與查詢方向
  • 9.3: DNS 伺服器正解與反解的記錄項目 (Resource Record, RR)
  • 9.4: 設定不含自身資料庫的 cache only DNS 伺服器
  • 9.5: DNS 正解設定
  • 9.6: DNS 反解設定
  • 9.7: Master/Slave 的設定
  • 9.8: 課後練習

9.1: Domain Name Service (DNS) 系統

DNS 原始最主要的目的是『透過主機名稱來找到該伺服器的 IP 』,如此一來,人們就可以不用記憶 IP 而只須記憶主機名稱即可。 而主機名稱相對來說就像人名,會比較好記。想想看,你是記憶朋友的名字比較厲害,還是記憶朋友的身份證比較厲害?戶政事務所要找的是身份證號碼, 但是我們要找的是人名,兩者間的對應,對於伺服器來說,就是 DNS 系統了。所以說, DNS 系統就是網際網路的戶政事務所囉。 相關的 DNS 目標為:

  • 每部伺服器應該會有一個網路主機名稱
  • 且該主機名稱應該要『註冊在這一個 DNS 系統的架構底下』!
  • 所以,透過詢問 DNS 系統,就會知道該伺服器的主機名稱對應到的 IP 了
  • 找到 IP 是最重要的目的!
  • DNS 的主機命名方式

主機名稱也不是隨便就能命名的!就像您的大名一樣,也不是可以隨便更改的!至少,你的姓氏基本上就是不能變更對吧!一般來說,人名與地址相關的命名方式為:

  • 先分區域,包括台北的、高雄的、台南的
  • 再分姓氏,姓蔡的、姓邱的、姓林的等等
  • 最後才是名字
  • 一般 DNS 的寫法與美式姓名比較像,重要的姓氏在後面,名字在前面,所以就會變成:
    • 鳥哥.蔡.台南 (住台南的蔡鳥哥)
    • 鳥哥.邱.台北 (住台北的邱鳥哥)
    • 都叫鳥哥,但是因為姓氏與住址不同,而可以找到正確的人名~我們姑且稱之為『完整的人名系統』

網路主機名稱跟上述的系統架構就很像了!你必須要去註冊一個領域名 (姓氏),你的主機名 (名字) 才能夠讓人家找到正確的地方:

  • 所有主機名稱都是從一個『頂層』所延伸出來的,這個頂層也稱為 root,設計上是一個小數點 (.)
  • 你可以跟頂層註冊一個姓氏,例如 .tw 這個頂層姓氏
  • 然後透過 .tw 自己分配下層領域,例如 .gov.tw, .edu.tw..
  • 每個下層姓氏再自己成立所需要的主機名稱,例如 www.gov.tw, www.edu.tw 這兩個政府與教育部的 WWW 伺服器主機名!
  • 從主機名稱到最頂層 (www.gov.tw.) 這個完整的主機名稱,就被稱為 FQDN (Fully Qualified Domain Name)

這一個大架構其實可以視為分散式『資料庫』系統!因為所有的名字都在個別的 DNS 伺服器當中設定,再透過加入 DNS 系統,讓大家都能查詢的到! 基本的 DNS 大架構是這樣的:

  • 最頂層 (類似根目錄) 基本上有 13 部系統在管理下層的資料連結
  • 每一個節點只負責自己所管理註冊的網域,其他網域則會去頂層 (類似根目錄) 尋找關聯點再去往下找。

所以最重要的就是『註冊』囉!就像你生出小孩,得要去戶政事務所報戶口一樣啦!只是有所謂的『授權』功能,讓你也能開小型戶政事務所而已。

  • DNS 資料庫的記錄:正解、反解與領域 (zone)

我們經常聽到領域名稱 (domain name) 對吧!那就是 DNS 的基本項目,領域名稱就有點像是你的祖籍姓氏這樣,那主機名稱就有點像是你的名字而已。 不過在查詢的時候,你總是得要查詢到你的『祖籍姓氏』之後,才能查到你吧!就有點像族譜這樣。不過,因為查詢的方式有時會從主機名稱查到 IP, 有時需要從 IP 反查到主機名稱,因此就有一些定義需要了解一下:

  • 從主機名稱查詢到 IP 的流程稱為:正解
  • 從 IP 反解析到主機名稱的流程稱為:反解
  • 在 DNS 伺服器的資料庫設定中,不管是正解還是反解,每個領域的記錄就是一個區域 (zone)
  • DNS 伺服器資料庫的類型、權重與同步方式

根據上述的說明,我們知道 DNS 最頂層是由 13 部主機所構成,然後再依據一層一層的註冊來授權下游 DNS 來分別設定屬於自己的族譜 (正反解資料庫)。 另外,由於 DNS 是很重要的服務,因此同一個領域可能會有許多部系統協同服務,以避免單一主機掛掉而導致整個 DNS 記錄資料的損毀。 而為了簡化設定的流程,因此就有所謂的主從 DNS 伺服器。

先來說說 DNS 伺服器的資料庫類型吧:

  • hint: 記錄最頂層 (.) 的領域記錄方式,每部 DNS server 都應該要有這個記錄才對
  • master: 讓管理員主動或透過管理程式碼主動修改主機名稱與 IP 對應的資料庫內容,該伺服器就是 DNS master。 並且可以提供 DNS 資料庫給 slave 查詢。
  • slave: 與 master 同樣可以管理同一個 domain 的資料庫,但其資料庫的來源為直接從 master 的記錄中同步而取得的

也就是說,全部的 DNS server 應該都要知道最頂天的 . 這個 zone 的類型是獨一無二的 hint 類型,其他的設定則主要是 master 設定。 而為了簡化設定,所以假設你有三部內容需要完全一模一樣的 DNS 伺服器,那麼針對某一個特定的 zone,就可以指定一台為 master, 其他兩台為 slave,你只要手動更新了 master 的資料庫,那麼其他兩部 slave 的 DNS server 就會自動的更新了!問題來了, 那麼 Internet 在查詢你的這個特定的主機名稱時,會先向 master 查詢嘛?其實是這樣的:

  • 無論 master 還是 slave ,其所記錄的資料應該是一模一樣
  • 在 DNS 系統當中,領域名稱的查詢是『先搶先贏』的狀態,因此每一部 DNS 伺服器的角色在 Internet 上面都是一樣的。

好的,那麼 Master/Slave 資料的同步是如何進行的呢?基本上的流程是這樣的:

  • DNS 伺服器,slave 透過分析來自 master 的資料庫序號 (serial number) 判斷是否需要更新,若比 slave 自己記錄的序號還要大,則更新自己的資料庫,否則就不更新。
  • Master 若主動修改過資料庫,通常 DNS 系統會發出訊息告知 slave 來更新資料
  • Slave 也會定期去向 master 要求資料庫,並透過上述的序號比對方式來決定是否要更新。
例題 9.1.A: 完成底下的練習:
  1. DNS 最主要的目的是什麼?
  2. DNS 最頂層的名稱亦稱為 root,他的代表符號為何?
  3. 何謂 domain name, hostname 與 FQDN (可以隨便舉例說明較佳)?
  4. 嘗試說明什麼是正解?反解與 zone
  5. DNS 的資料庫記錄中,依據其資料的設定與取得方式,主要分為幾種類型 (type)?

9.2: DNS 的階層架構與查詢方向

DNS 的架構是一層一層疊起來的,你可以加入所謂的授權來取得建立 DNS 資料庫的權限。不過,基本上 DNS 的階層架構是有點像底下說明的:

  1. 如前所述,DNS 是有階層架構的,而最頂層的稱為 root ,以小數點 (.) 為符號表示。
  2. 相關的階層可以使用如下的圖示來解釋:
  3. 除了頂層的 root 之外,第一層 (top level domain, tld) 主要可以分為兩大類:
    • 一般最上層領域名稱 (Generic TLDs, gTLD):例如 .com, .org, .gov 等等
    • 國碼最上層領域名稱 (Country code TLDs, ccTLD):例如 .tw, .uk, .jp, .cn 等
  4. 常見的 gTLD 有底下幾大類:
    名稱代表意義
    com公司、行號、企業
    org組織、機構
    edu教育單位
    gov 政府單位
    net 網路、通訊
    mil 軍事單位
  • DNS Server 的查詢流程 (由主機名稱找到 IP 的完整程序)

為什麼你隨意指定一台 DNS 伺服器,然後將你要找的主機名稱丟給她,她就能夠幫你找到正確的 IP 呢?這是由於每個查詢大致都是從點 (.) 開始查起, 那就有點像目錄樹的根目錄的功能。然後一個一個經由『授權』的 DNS server 去往下找,就能找到每部 DNS server 自己指定的 zone 了!

  1. 一般來說,上層管理者,只會將『查詢權』交辦給下層管理者,這可以稱為『授權』
  2. 下層管理者只會記錄自己的主機名稱,只要自己設定完成,全世界立刻生效!有點像分散式系統
  3. 由於『授權』與類似『分散式資料庫』系統,因此任何一部 DNS 伺服器,只要能找到 root (.) 的所在, 就可以找到所有合法的 DNS 主機名稱與 IP 的對應。
  4. 透過上述的說明,我們可以簡單的知道 DNS 查詢的流程如下:
  5. 可以透過 dig +trace domainname 來查詢『授權』與『記錄』的結果
例題 9.2.A:完成底下的練習:
  1. 最頂層 (tld) 的 DNS 設定,主要分為那兩種項目?
  2. 最原本的 6 個 tld 主要是哪幾個?
  3. 請使用 dig 追蹤 www.ksu.edu.tw 的授權與設定分別在哪裡? (追蹤的英文為 trace)
  4. 請使用 whois (若沒裝,請自行安裝) 找出 ksu.edu.tw 的相關註冊資料
  5. 查詢一下, whois 的資料庫,使用的是那一個埠口?( google 查完,再到 /etc/services 查看)

9.3: DNS 伺服器正解與反解的記錄項目 (Resource Record, RR)

既然 DNS server 最重要的項目就是在記錄正解與反解,那麼正反解的資料主要又是記錄於 DNS 資料庫環境下,那麼到底這些資料記錄了哪些東西呢? 你可以使用 dig 來查詢所有的記錄資料格式,預設就是透過 A 這種記錄!無論如何,基本的記錄格式如下:

[domain]   [ttl]          IN [[RR type]  [RR data]]
[待查資料] [暫存時間(秒)] IN [[資源類型] [資源內容]]

例如查詢 www.ksu.edu.tw 這部主機的 IP 可以這樣做:

[student@localhost ~]$ dig www.ksu.edu.tw

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> www.ksu.edu.tw
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1133
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 4

;; QUESTION SECTION:
;www.ksu.edu.tw.                        IN      A

;; ANSWER SECTION:
www.ksu.edu.tw.         3600    IN      A       120.114.100.101   <==其中一筆資料

;; AUTHORITY SECTION:
ksu.edu.tw.             3600    IN      NS      dns2.ksu.edu.tw.  <==底下的也是喔!
ksu.edu.tw.             3600    IN      NS      dns1.ksu.edu.tw.
ksu.edu.tw.             3600    IN      NS      dns3.twaren.net.

;; ADDITIONAL SECTION:
dns1.ksu.edu.tw.        3600    IN      A       120.114.50.1
dns2.ksu.edu.tw.        3600    IN      A       120.114.150.1
dns3.twaren.net.        590     IN      A       211.79.61.47
dns3.twaren.net.        590     IN      AAAA    2001:e10:5c00:1::47

;; Query time: 0 msec
;; SERVER: 120.114.150.1#53(120.114.150.1)
;; WHEN: Mon Dec  4 15:04:16 2017
;; MSG SIZE  rcvd: 191

當 RR type 為 A (Address) 的時候,他的 RR data 就是 IP 位址囉!接下來讓我們來看看常見的 RR 有哪些!

  • 正解與反解都需要的記錄項目

正解與反解都需要的項目,大部分都是 Server 需要做的任務!包括記錄 DNS 主管理伺服器的 IP 以及相關 master/slave 更新的序號資料等等。 底下就稍微講解一下各個主要的 RR type:

  1. NS IP』: name server 的意思,亦即是管理該 domain 的伺服器 IP 位址
  2. SOA servername. admin_email. ( serial refresh retry expire ttl) 』主要是進行 master/slave 更新程序的相關資料,用在單一 DNS 設定上面沒啥重要,但是如果有 Master/Slave 搭配,就很重要了!
    • servername:主要管理這個 domain 的 master 伺服器主機名稱
    • admin_email:管理員的 email
    • 序號 (serial):slave 判斷 master 的資料是新的與否,就是透過這個 serial 號碼。為了避免設定值出錯, 通常使用的格式為『 YYYYMMDDnn 』
    • 重新更新 (refresh):多久讓 slave 主動來更新資料庫一次
    • 錯誤嘗試 (retry): 當前一次更新沒有成功,則在比較短的時間內 (retry) 會嘗試去更新
    • 嘗試錯誤時間 (expire):如果一直嘗試都沒有成功,經過多少時間之後就不再嘗試
    • 暫存時間 (ttl, time to live):若不再嘗試,則多久後此筆記錄應予以刪除
    • 上述的時間範圍應該是這樣的:
      • Refresh >= Retry * 2
      • Refresh + Retry < Expire
      • Expire >= Rrtry * 10
      • Expire >= 7Days
    • PS. 不過,一般 DNS 設定時都有範例檔,直接引用範例檔的時間參數就不會出錯了!
例題 9.3.A:完成底下的練習:
  1. 以 dig -t ns ksu.edu.tw 查詢崑山科大的 DNS 伺服器設定為何
  2. 以 dig -t soa ksu.edu.tw 查詢崑山科大的 DNS 伺服器設定為何
  3. 若將上述兩題改為 www.ksu.edu.tw 這樣的主機名稱,會發生什麼情況?
  4. 想一想,為何上述資料使用 ksu.edu.tw 而不是 www.ksu.edu.tw 呢?

由於 NS 與 SOA 都是在設定 domain 的相關事宜,因此你要帶入搜尋的資料,當然就得是要 domain (人類的姓氏,而不是名字) 的意思!

  • 正解常見的記錄項目

正解就是從主機名稱找到 IP 的方向,這種正解 zone 常見的設定記錄有:

  1. A IP』:記錄該主機名稱或領域的 IP 位址
  2. AAAA IPv6』:記錄該主機名稱或領域的 IPv6 的位址
  3. MX 權重數字 hostname』:與 email 有關的設定,可以設定多部 mail gateway,權重數字越小最重要, 而 hostname 必須要有 IP 才行 (就是要有 A 的對應喔!)!
  4. CNAME hostname』:有點類似『暱稱』『別名』的意思~
例題 9.3.B:完成底下的練習:
  1. 以 dig www.ksu.edu.tw 查詢崑山科大的 DNS 伺服器設定為何
  2. 以 dig -t mx mail.ksu.edu.tw 查詢崑山科大的 DNS 伺服器設定為何
  3. 以 dig -t txt mail.ksu.edu.tw 查詢崑山科大的 DNS 伺服器設定為何
  4. 以 dig tw.yahoo.com 查詢該伺服器的 IP 為何?
  • 反解常見的記錄項目

反解則是從 IP 去找到主機名稱。因為網路上的殭屍主機非常的多~一大堆喪屍...正規的服務為了避免被有問題的喪屍主機攻擊,因此會去反解他們的主機名稱! 如果無法對應,就表示該 IP 可能來自比較疏於管理的 ISP,就很可能被抵擋掉了!常見的反解大概只有這一個:

  1. PTR hostname』:其實反解大多也只有這個項目!就是某個 IP 對應的主機名稱而已。
  2. PS. PTR 就是 pointer 的縮寫!
例題 9.3.C:完成底下的練習:
  • 以 dig 查詢到 www.ksu.edu.tw 的 IP 之後
  • 再以 dig -x IP 查詢其反解資料為何?
  • 反解的主機名稱主要的設定為何?其 domain name 為何呢?
  • 同時觀察反解的 NS 設定為何?這相當的重要!

上面的最後一個練習相當的重要!那是因為反解的 zone 與正解的 zone 不一樣!由於西式姓名的寫法中,右邊出現的名字會比較重要,因此 DNS 的設定也是相同的, 一串主機名稱中,越右邊的名字越重要!代表的範圍越廣~不過,這與我們知道的 IPv4 的設定不同~ IP 位址的設定是如同數字,越右邊的越小~ 兩者的對應不一樣。因此反解為了要加入正解的查詢流程,所以得要將一些數值『反過來寫』,那就是反解 zone 的成因!要很注意!很注意!

9.4: 設定不含自身資料庫的 cache only DNS 伺服器

從 DNS 的查詢流程中,我們會知道查詢過的主機名稱會暫存一份到自己的快取中!如果自己沒有設定資料庫,單純拿來穿透防火牆的防線, 這時,這部 DNS 伺服器,就稱為 cache only 的伺服器囉:

  1. cache only 僅進行 DNS 代理查詢與將結果快取一份到自身記憶體當中的功能而已。
  2. cache only DNS server 也是需要知道 root (.) 的所在,因此依舊需要一個 zone 來紀錄才行!
  3. 最頂層 DNS 伺服器的紀錄是公開的資訊,一般 DNS 套件都會主動提供!
  • forwarding DNs server

另外,有時候為了簡化 cache only DNS 的設定,連 . 都不用給,直接讓 cache only DNS server 向上一層要求即可!這就是 forwarding DNS srver:

  1. 透過更上層 DNS 來代理查詢,而不是自己跑去 root 查詢!
  2. 詳細流程有點像這樣:
  3. 主要是因為透過上層伺服器代理,因此,甚至完全不需要 zone 來設定 root 的所在!
  • RockyLinux 的 DNS 安裝、設定、啟用與觀察

最早的 DNS 是由柏克萊大學所提出的概念,為了這個概念他們開發了一套軟體,稱為 Berkeley Internet Name Domain,簡稱為 BIND。 所以最終軟體名稱就被稱為 bind 囉!。不過這個 bind 軟體所產生的服務不是叫做 bind 喔!是被稱為 named 呢!

  1. DNS 伺服器軟體名稱為 bind (Berkeley Internet Name Domain, BIND)
  2. bind 軟體提供一個名為 named 的服務,這個服務的設定檔為 /etc/named.conf
  3. 因為 named 經常被攻擊,因此建議安裝 bind-chroot 將 bind 鎖在 /var/named/chroot 目錄內!
例題 9.4.A:
  1. 請安裝 bind, bind-chroot 等相關軟體,
  2. 並查詢 bind 所擁有的檔案檔名為何?

接下來請查詢 /etc/named.conf 這個主設定檔,分析一下該檔案內部的預設設定是否如下:

  1. 僅開放在 127.0.0.1 這個界面
  2. 僅允許本機 (127.0.0.1) 的資料查詢要求
  3. 針對整個 Internet 放行 DNS 代理查詢 (recursion) 的功能
  4. 載入了 . 的 zone
  5. 載入了文件上要求載入的 zone

由於預設只能讓自己找自己,這樣的 DNS 對於區網來說是沒用的~所以當然要設定一下,主要需要修改的項目,請處理如下:

  1. 建立一個內部的網域名稱為 mylan,內容包括自己的所有網域;
  2. 監聽在所有的界面上
  3. 允許回應所有人對本 DNS 伺服器的資料查詢要求
  4. 只允許 mylan 網域的 DNS 代理查詢 (recursion-allow {...})
  5. 保留載入 root 的 zone
  6. 取消其他 zone 的載入

實際設定情況有點像底下這樣:

[root@localhost ~]# vim /etc/named.conf
acl mylan { 192.168.254.0/24; 10.255.0.0/16; 127.0.0.0/8; };
options {
        listen-on port 53 { any; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
        allow-recursion { mylan; };
        dnssec-enable yes;
        dnssec-validation yes;
        bindkeys-file "/etc/named.iscdlv.key";
        managed-keys-directory "/var/named/dynamic";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

設定完畢之後就是啟動與觀察~啟動與觀察的詳細流程請參考底下的流程:

  1. 不要啟動 named 而是要啟動 named-chroot 才行!
  2. 啟動的埠口應該是在 port 53 才對!
  3. 將本機網路設定當中的 DNS server 第一部改成本機 (127.0.0.1) 之後,重新啟動網路 (nmcli, /etc/resolv.conf...)
例題 9.4.B:完成底下的練習
  1. 啟動 named-chroot 服務 (若成功,記得也需要開機啟動!)
  2. 觀察 named-chroot 的登錄檔資訊,同步觀察 /var/log/messages 裡面的資料!
  3. 使用 mount 觀察一下系統掛載的項目為何
  4. 觀察 port 53 是否啟動了?
  5. 觀察是否放行全世界 port 53 的查詢功能 (firewall 若沒設定,請設定!)
  6. 用自己的 DNS 查詢 www.ksu.edu.tw 的 IP 設定為何?( hint: dig... @...)
  7. 承上,再次查詢 www.ksu.edu.tw ,觀察其 ttl 的變化為何?
  8. 讓 client 端主機也同步設定第一部 DNS 為 server 的內部 IP !(若 client 端使用的是 DHCP 服務,請在你 Server 的 DHCP 設定中, 將 DNS server IP 指向你自己的 IP 位址)

上面的練習相當重要!每次啟動 named-chroot 都需要重新觀察 messages 這個檔案才行!

9.5: DNS 正解設定

一般來說,我們如果有大量主機名稱的設定需求,就得要架設 DNS 伺服器。而架設 DNS 伺服器的第一步,就是選擇一個合法授權且沒有人用過的領域名稱 (domain)。 你不知道某個領域名稱有沒有被人註冊?那就前往 ISP 提供的網站去查詢,或自己查詢均可。在台灣,你可以選擇 hinet 的網站來查詢, 如下連結所示:

在最上方 whois 查詢項目中,選好台灣的頂層領域名,然後輸入你想要的主機名稱,按下 go 之後,螢幕就會告訴你該領域名稱有沒有被使用了。 找到沒有被使用掉的主機名稱,就能夠開始註冊了!

  • 建置一個練習用的虛擬 zone 環境

因為我們是用來架設 DNS 練功用的,因此選擇的名稱可以不用符合 DNS 的現有環境。然後搭配我們原先的主機名稱設定,因此設定的 zone 為 lanXX.dic.ksu,幾個基本設定如下:

  • ZONE 名稱為 lanXX.dic.ksu
  • NS 為 server.lanXX.dic.ksu,且管理員 student@mail.lanXX.dic.ksu
  • server.lanXX.dic.ksu: 10.255.XX.254
  • client.lanXX.dic.ksu: 10.255.XX.1
  • www.lanXX.dic.ksu: CNAME to server.lanXX.dic.ksu
  • ftp.lanXX.dic.ksu: CNAME to server.lanXX.dic.ksu
  • mail.lanXX.dic.ksu: 10.255.XX.254
  • mail.lanXX.dic.ksu: MX ?? mail.lanXX.dic.ksu
  • 主設定檔的 zone 參數設定

在 /etc/named.conf 裡面新增一小段設定值:

zone "lanXX.dic.ksu" IN {
        type master;
        file "named.lanXX.dic.ksu";
};

此段設定值最重要的地方就在指定類型為 master 的資料庫格式,且檔名為 named.lanXX.dic.ksu。這個檔名預設會放在 /var/named 裡面喔!

  • 與主設定檔呼應的資料庫檔名設定

在 /var/named/ 新增一個檔案,檔名為 named.lanXX.dic.ksu,檔案內容有點像這樣:

$TTL    1D
@       IN SOA  server.lanXX.dic.ksu. student.mail.lanXX.dic.ksu. (
                2016112601 1D 1H 1W 3H )
@       IN NS   server.lanXX.dic.ksu.
server.lanXX.dic.ksu.      IN A            10.255.XX.254

client.lanXX.dic.ksu.      IN A            10.255.XX.1
www.lanXX.dic.ksu.         IN CNAME        server.lanXX.dic.ksu.
ftp.lanXX.dic.ksu.         IN CNAME        server.lanXX.dic.ksu.
mail.lanXX.dic.ksu.        IN A            10.255.XX.254
mail.lanXX.dic.ksu.        IN MX 5         mail.lanXX.dic.ksu.

仔細看,當你主機名稱設定具有 FQDN 的全名時,一定要在最後面加上小數點,這代表就是全名,否則就會被視為是一般主機名稱,需要再加上 zone name 才會變成 FQDN 的喔!這個小數點經常會被忘記,故請特別小心在意!

重新啟動 named-chroot 之後,務必要查看 named-chroot 的 status 以及 /var/log/messages 的內容! 務必要看到所啟動的 zone 與該 zone 的 serial 是正確的才行! 接下來就是測試了!請使用 dig 測試自己的設定是否正確!每一個紀錄項目都需要查詢!

例題 9.5.A:完成底下的練習
  1. 完成所有正解 A 的 dig 結果
  2. 完成正解 NS 的 dig 結果
  3. 完成正解 SOA 的 dig 結果
  4. 完成正解 MX 的 dig 結果

9.6: DNS 反解設定

反解的 zone 名稱與正解不太一樣~請搭配你的 IPv4 區網來建立好你的 zone 資料。一般來說,你可能會有如下的先期設定規劃:

  • ZONE 名稱為 XX.255.10.in-addr.arpa
  • NS 為 server.lanXX.dic.ksu,且管理員 student@mail.lanXX.dic.ksu
  • server.lanXX.dic.ksu: 10.255.XX.254
  • client.lanXX.dic.ksu: 10.255.XX.1
  • 主設定檔的 zone 參數設定

在 /etc/named.conf 裡面新增一小段設定值:

zone "XX.255.10.in-addr.arpa" {
        type master;
        file "named.10.255.XX";
};
  • 與主設定檔呼應的資料庫檔名設定

在 /var/named/ 新增一個檔案,檔名為 named.10.255.XX,檔案內容有點像這樣:

$TTL    1D
@       IN SOA  server.lan100.dic.ksu. student.mail.lan100.dic.ksu. (
                2016112801 1D 1H 1W 3H )
@       IN NS   server.lan100.dic.ksu.
254     IN PTR  server.lan100.dic.ksu.

重新啟動 named-chroot 之後,務必要查看 named-chroot 的 status 以及 /var/log/messages 的內容! 務必要看到所啟動的 zone 與該 zone 的 serial 是正確的才行! 接下來就是測試了!請使用 dig 測試自己的設定是否正確!每一個紀錄項目都需要查詢!

例題 9.6.A:完成底下的練習
  1. 完成反解 NS 的 dig 結果
  2. 完成反解 SOA 的 dig 結果
  3. 完成反解 PTR 的 dig 結果

9.7: Master/Slave 的設定

一般來說,一部 DNS 伺服器建立完畢後,除非是內部測試用的環境,否則,具有正解/反解 zone 的 DNS 系統,通常建議至少有兩部 DNS 伺服器提供服務, 可以避免由於伺服器暫時無法提供服務,而導致的困擾。另外,無論 master/slave 模式,這兩部伺服器在網際網路上的角色都一樣! 所謂的 Master / Slave 只是資料庫檔案建立的方式不同而已,這裡要特別再次強調。

由於我們的環境只有同學們自己的 VLAN 而已,因此,以自己的環境建立 master / slave 來架設 DNS 也是可以的。 底下我們將讓自己的 zone 提供給 client 作為另一個 DNS server 來提供服務喔。

  • Master DNS Server 的設定:

Master 的 DNS server 設定,我們之前已經設定妥當了,不過,這裡還是需要修訂!原因是,多了一部 DNS 系統來提供協助嘛! 因此當然需要這個設定值。此外,我們也需要開放 slave DNS 來要求資料才行!先來設計讓 slave DNS 可以到本系統要求資料庫的設計:

acl myslave { 10.255.200.0/24; };

zone "lan200.dic.ksu" IN {
        type master;
        file "named.lan200.dic.ksu";
        allow-transfer { myslave; };
};

zone "200.255.10.in-addr.arpa" {
        type master;
        file "named.10.255.200";
        allow-transfer { myslave; };
};

接下來到 /var/named 裡面去修改正解檔案,其實只有增加 NS 與相關的設定而已,有點像底下這樣:

$TTL    1D
@       IN SOA  server.lan200.dic.ksu. student.mail.lan200.dic.kus. (
                2016112602 1D 1H 1W 3H )
@       IN NS   server.lan200.dic.ksu.
@       IN NS   client.lan200.dic.ksu.
server.lan200.dic.ksu.      IN A            10.255.200.254
client.lan200.dic.ksu.      IN A            10.255.200.1
....

同樣修改反解設定,內容有點像這樣:

$TTL    1D
@       IN SOA  server.lan200.dic.ksu. student.mail.lan200.dic.ksu. (
                2016112802 1D 1H 1W 3H )
@       IN NS   server.lan200.dic.ksu.
@       IN NS   client.lan200.dic.ksu.
254     IN PTR  server.lan200.dic.ksu.
1       IN PTR  client.lan200.dic.ksu.

之後重新啟動 named-chroot,若有問題請依據問題一項一項解決,然後再測試每個設定項目的結果。其實最重要的只有 NS 這個項目, 可以這樣檢查:

[root@localhost ~]# dig server.lan200.dic.ksu
....
;; QUESTION SECTION:
;server.lan200.dic.ksu.         IN      A

;; ANSWER SECTION:
server.lan200.dic.ksu.  86400   IN      A       10.255.200.254

;; AUTHORITY SECTION:
lan200.dic.ksu.         86400   IN      NS      server.lan200.dic.ksu.
lan200.dic.ksu.         86400   IN      NS      client.lan200.dic.ksu.

;; ADDITIONAL SECTION:
client.lan200.dic.ksu.  86400   IN      A       10.255.200.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 日 12月 13 23:22:06 CST 2020
;; MSG SIZE  rcvd: 145

你會發現多了一個 NS 的設定喔!如果無法順利輸出 NS 的話,那麼也可以強制查詢 NS 紀錄即可:

[root@localhost ~]# dig -t ns lan200.dic.ksu
  • Slave DNS Server 的設定:

現在,來到你的 client 端,亦即是第二個 DNS 伺服器,依據同樣的方式安裝、設定好你的 DNS 伺服器, 讓它準備提供正常的服務!

[root@localhost ~]# yum install bind-chroot
[root@localhost ~]# vim /etc/named.conf
acl mylan { 192.168.254.0/24; 10.255.0.0/16; 127.0.0.0/8; };
...
	listen-on port 53 { any; };
	allow-query     { any; };
	allow-recursion { mylan; };
...
[root@localhost ~]# systemctl start named-chroot
[root@localhost ~]# systemctl enable named-chroot

[root@localhost ~]# ll -d /var/named/slaves/
drwxrwx---. 2 named named 6  8月 25 01:31 /var/named/slaves/

觀察一下, /var/named/slaves 這個預設的目錄確實可以讓 named 用戶寫入的!所以,現在從 master 處, 準備下載正確的檔案吧!先在 /etc/named.conf 裡面增加兩個新的 zone,分別是這樣的:

zone "lan200.dic.ksu" IN {
        type slave;
        file "slaves/named.lan200.dic.ksu";
        masters { 10.255.200.254; };
};

zone "200.255.10.in-addr.arpa" {
        type slave;
        file "slaves/named.10.255.200";
        masters { 10.255.200.254; };
};

然後重新啟動 named-chroot 之後,再測試一下有沒有成功的將檔案新增到該目錄下即可。當然啦,Master 的 firewall 請自行處理囉!

9.8: 課後練習

  1. (60%)實作題:啟動 Server 作業硬碟 - unit09
    1. 網路參數的設定,請依據底下的方式來設定好你的網路環境:
      1. 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.18.255.*/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.18.255.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      2. 使用 teamd 的機制建立內部區域網路的備援功能:
        • team 的界面使用 team0 卡號,且連線名稱請命名為 team0
        • team 使用 activebackup 備援功能,不要使用 loadbalance
        • team 的實體網卡 (team slave) 請使用 ens7 及 ens8 ,且其連線名稱名稱亦請命名為 ens7, ens8
        • team0 網路參數為: 172.19.*.254/24,不需要 gateway
      3. 主機名稱指定為: server*.example.dic
      4. 最終你的主機名稱與 IP 的對應為:
        server*.example.dic	172.18.255.*		別名為 server*
        server254.example.dic	172.18.255.254		別名為 server254
        server.lan*.example.dic	172.19.*.254		別名為 server
        client.lan*.example.dic	172.19.*.1		別名為 client
        
    2. 基本的伺服器作業系統設定行為:
      1. 依據底下的說明,選擇距離我們最近的成大網站來作為 yum server 的來源:
        成大 ccns 網站: https://mirror.ccns.ncku.edu.tw/howto/#rocky-linux
        請記得修改過設定檔,應該要將清單清除 (yum clean all) 較佳。
      2. 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, bind-utils, kernel
      3. 全系統自動升級,且每天凌晨 3 點也會自動升級一次。(請寫入 /etc/crontab 為主)
      4. 將 SELinux 修改成為 Enforcing 模式,且未來每次開機都自動為 Enforcing 才行
    3. 實際設定好本機防火牆
      1. 請關閉 firewalld 服務,並且自行安裝、啟動 iptables 服務
      2. 將預設的規則轉存到 /root/firewall.sh 這個檔案內
      3. 修改上述 firewall.sh 腳本,讓內容有點像底下這樣:
        1. 首先將全部的規則刪除 (應該有三條指令)
        2. 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
        3. 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
        4. 放行你自己的內部區域網路那個網域的連線要求 (針對 LAN 的信任設定)
        5. 讓 ssh 只對外部的區網放行,不會對 Internet 放行 (對 ssh 連線做限制較佳)
        6. 讓 http 針對整個 Internet 放行 (一般公開的服務設計)
        7. 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
      4. 重新啟動 iptables 服務,然後觀察規則是否正確
    4. 實際設定好 Server 的路由功能
      1. 讓核心支援 IP 轉遞的功能,並且每次重新開機都可以自動生效
      2. 修改 /root/firewall.sh ,在該檔案加入清除 nat 表格的規則與自訂鏈的設定
      3. 增加規則:讓來自內部網路的封包,在路由判斷後,並預計由 ens3 對外網卡出去的封包,全部偽裝成為 ens3 的 IP 位址 (一般在數據機上面的就是 public IP)
      4. 在 /etc/sysconfig/iptables-config 當中增加 nf_nat_ftp 及 nf_conntrack_ftp 模組功能
      5. 上述功能在開機後依舊能夠順利啟動
    5. 建立一個 DNS 服務
      1. 請使用 named-chroot 服務,不要使用 named 服務。
      2. 關於 DNS 的整體設定方面,底下的設定請修改掉:
        • DNS 需要針對所有的界面監聽服務
        • DNS 服務必須要放行給全世界來查詢 (allow-query)
        • DNS 僅有你的兩段區網與 127.0.0.0/8 才可以代詢 (allow-recursion)
      3. 設定一個正解 zone 為 lan*.example.dic,相關設定須有底下的記錄:
        • 這個 zone 允許 172.19.*.0/24 的來源進行更新
        • TTL 需要設定為 600 秒
        • SOA 的設定中, 伺服器名為 server.lan*.example.dic, email 需為 student@server.lan*.example.dic,序號需為當日的日期相關, 其他請自由設定
        • NS 需要設定使用 server.lan*.example.dic 與 client.lan*.example.dic 這兩部主機
        • server.lan*.example.dic 的 A 為 172.19.*.254
        • client.lan*.example.dic 的 A 為 172.19.*.1
        • pc2.lan*.example.dic 的 A 為 172.19.*.2
        • pc3.lan*.example.dic 的 A 為 172.19.*.3
        • pc4.lan*.example.dic 的 A 為 172.19.*.4
        • www.lan*.example.dic, ftp.lan*.example.dic, web.lan*.example.dic 都使用 CNAME 對應到 server.lan*.example.dic
      4. 針對 172.19.*.0/24 的網域設定一個反解的 zone,相關設定須有底下的記錄:
        • 這個 zone 允許 172.19.*.0/24 的來源進行更新
        • TTL, SOA, NS 均沿用與上述正解相同的設定
        • 172.19.*.254 對應到 server.lan*.example.dic
        • 172.19.*.1 對應到 client.lan*.example.dic
        • 172.19.*.2 對應到 pc2.lan*.example.dic
        • 172.19.*.3 對應到 pc3.lan*.example.dic
        • 172.19.*.4 對應到 pc4.lan*.example.dic
      5. 防火牆需要放行所有的人都能使用你的 DNS
      6. 讓你這部 Server 可以使用自己的 IP 作為 DNS 服務的來源設定 (nmcli...)。
  2. (30%)實作題:啟動 client 作業硬碟
    1. 網路參數的設定,請依據底下的方式來設定好:
      1. 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.19.*.1/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.19.*.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      2. 主機名稱指定為: client.lan*.example.dic
      3. 最終你的主機名稱與 IP 的對應為:
        server*.example.dic	172.18.255.*		別名為 server*
        server254.example.dic	172.18.255.254		別名為 server254
        server.lan*.example.dic	172.19.*.254		別名為 server
        client.lan*.example.dic	172.19.*.1		別名為 client
        
    2. 實際設定好本機防火牆
      1. 預設請使用 firewalld 防火牆服務,不要使用 iptables 服務!
      2. 請將預設的領域 (zone) 改為 work 領域,且 ens3 為其管理之界面網卡
      3. 預計放行的服務主要有 ssh 與 http 兩個服務,其他還可能有預設會啟用的 dhcp 用戶端服務。
      4. 查詢 rich rule (man firewalld.richlanguage),確認來自本機同一個 LAN 網段的封包,通通給予放行。
      5. 上述放行的防火牆服務,在下次重新開機後,依舊會存在才行
    3. 架設一個 slave DNS 伺服器
      1. 請使用 named-chroot 服務,不要使用 named 服務。
      2. 關於 DNS 的整體設定方面,底下的設定請修改掉:
        • DNS 需要針對所有的界面監聽服務
        • DNS 服務必須要放行給全世界來查詢 (allow-query)
        • DNS 僅有你的兩段區網與 127.0.0.0/8 才可以代詢 (allow-recursion)
      3. 設定一個正解 zone 為 lan*.exmpale.dic,相關設定為:
        • 其 master DNS 來源請設定為 172.19.*.254
      4. 針對 172.19.*.0/24 的網域設定一個反解的 zone,相關設定為:
        • 其 master DNS 來源請設定為 172.19.*.254
      5. 防火牆需要放行所有的人都能使用你的 DNS
      6. 讓你這部 Server 可以使用自己的 IP 作為 DNS 服務的來源設定 (nmcli...)。
  3. (10%)簡易問答題: 從具有 GUI 及中文的用戶端 Linux ,使用『 ssh root@172.19.*.254 』登入你的 Server ,之後建立 /root/ans.txt 的檔案,並將底下各題目的答案寫入你 server 當中!
    1. 以崑山科大的 www.dic.ksu.edu.tw 為例,說明何為 hostname, domain name 與 FQDN?
    2. 嘗試說明什麼是正解?反解與 DNS 的 zone
    3. DNS 的資料庫記錄中,依據其資料的設定與取得方式,主要分為幾種類型 (type)?
    4. 在 DNS 資料查詢中,主要的查詢會是向 master DNs 還是 slave DNS 做要求?
    5. 最原本的 6 個 gTLD 主要是哪幾個?每個 gTLD 最早是給什麼單位使用的?
  4. 上傳成績
    1. 請將 Server/Client 的硬碟通通啟動,並且確認兩者間的連線沒有問題;
    2. 在 Server 硬碟上面登入,然後用 root 的身份執行 vbird_server_check_unit ,並依據提示資料填寫你的學號與 IP 尾數
    3. 該程式會偵測你的系統,並且通知你哪個部份可能有問題,你需要持續觀察或者重新處理的部份會交代妥當。
    4. 若一切沒問題,螢幕就會出現如下的字樣,然後你就能夠使用 links 去檢查你的檔案是否有順利的上傳了!
    5. Please use links http://172.18.255.250/upload/unit09 to check your filename

  • 2022/11/18:將整體資料在 RockyLinux 9 上實作,變化不大!對題目的解釋稍微更新。