DNS Client / Server

DNS 概述

DNS 全名為 Domain Name System,主要用來負責主機名稱與 IP 的對應。設備之間傳送資料是使用 IP 進行通訊,但人類對於記憶數字不如記憶文字方便,因此需要有將「名稱」轉換成 IP 的機制。

在 DNS 系統中,主機名稱的表示方式通常分為兩種:

  • FQDN(Fully Qualified Domain Name):完整網域名稱,例如主機名稱為 www,網域為 linux.class,其 FQDN 為 www.linux.class
  • Short Name(簡短名稱):只取主機名稱部分,例如 www 代表 www.linux.class

名稱對應表(hosts)

在 DNS 普及前,電腦數量少時會透過一個本機對應表檔案設定名稱與 IP 的對應關係,例如:

127.0.0.1 localhost localhost.localdomain
192.168.1.5 erp erp.internal.linux.class

在 Unix/Linux 系統中對應檔為 /etc/hosts,Windows 則為 C:\Windows\System32\drivers\etc\hosts。可直接編輯此檔案進行自定義對應。

範例:

# 修改 /etc/hosts
10.6.X.11 myweb.linux.class

測試:

ping myweb.linux.class

成功會顯示對應的 IP。

DNS 用戶端工具

使用 /etc/hosts 雖然簡單,但當主機數量增加時會導致管理困難,因此改用 DNS 服務來集中管理主機名稱與 IP 的對應。

常見 DNS 記錄類型:

類型 說明
A IPv4 對應
AAAA IPv6 對應
CNAME 別名對應
NS DNS 伺服器資訊
MX 郵件伺服器資訊

常用 DNS 用戶端工具包含:

  • nslookup
  • host
  • dig

這些工具包裝在 bind-utils 套件中,可透過以下指令安裝:

dnf install -y bind-utils

使用 host 工具範例

# 查詢 IPv4
host -t a www.google.com

# 查詢 IPv6
host -t aaaa www.google.com

# 查詢 MX 記錄
host -t mx gmail.com

# 查詢 NS 記錄
host -t ns yahoo.com

# 查詢 alias 和 IP
host tw.yahoo.com

範例解說:tw.yahoo.com 是別名,實際對應到多個 IP,說明有多台主機分擔服務。

DNS 查詢順序

Linux 系統查詢主機名稱時,會根據 /etc/nsswitch.conf 中設定的順序進行解析,例如:

grep hosts: /etc/nsswitch.conf
hosts:      files dns myhostname

代表會依序查詢 /etc/hosts、DNS、再查詢本機名稱。

DNS 查詢的伺服器由 /etc/resolv.conf 設定,例如:

nameserver 168.95.1.1
nameserver 8.8.8.8
search linux.class

其中 search 代表當輸入 www 時會自動補齊為 www.linux.class

註:使用 NetworkManager 的系統中建議透過 nmtui 等工具設定 DNS,而非直接編輯 /etc/resolv.conf,以免被覆蓋。

DNS 正解與反解

  • 正解(forward lookup):名稱轉為 IP。
  • 反解(reverse lookup):IP 轉為名稱。

DNS 採分散式授權結構。上層網域會告知查詢方下層網域的負責伺服器位置,細部記錄由子網域自行管理。

DNS 使用:

  • 通常在 UDP 53 埠運作
  • 若回應超過 512 bytes 則會切換至 TCP 53 埠

參考資料:

安裝 DNS Server 套件(bind-chroot)

在 Enterprise Linux 中,可使用 bind-chroot 提供 DNS 服務,並使用 chroot 增加安全性。

安裝:

dnf install -y bind-chroot

檢查設定檔與記錄檔:

ls -lh /etc/named.conf
ls -lh /var/named/

修改主設定檔 /etc/named.conf

cp -a /etc/named.conf /etc/named.conf_backup
vi /etc/named.conf

修改重點:

listen-on port 53 { 127.0.0.1; 172.16.2.X; };

recursion no;
dnssec-enable no;
dnssec-validation no;

zone "domainX.linux.class" IN {
	type master;
	file "db.domainX.linux.class";
	allow-query { any; };
};

設定 DB 檔案 /var/named/db.domainX.linux.class

cd /var/named
cp -a named.empty db.domainX.linux.class
vi db.domainX.linux.class

編輯內容:

$TTL 3H
@   IN  SOA @ nsadmin.domainX.linux.class. (
        1       ; serial
        1D      ; refresh
        1H      ; retry
        1W      ; expire
        3H )    ; minimum
@       NS      ns
ns      A       172.16.2.X

啟動 DNS 服務

systemctl enable named-chroot
systemctl start named-chroot

設定防火牆

firewall-cmd --permanent --add-service=dns
firewall-cmd --reload
firewall-cmd --list-all | grep dns

確認連接埠是否開啟

ss -ntulp | grep :53

應出現類似下列內容:

udp   UNCONN 0      0    172.16.2.11:53    0.0.0.0:*
tcp   LISTEN 0      10   172.16.2.11:53    0.0.0.0:*

本機驗證 DNS 記錄

安裝工具:

dnf install -y bind-utils

查詢 DNS Server 記錄:

host -t ns domainX.linux.class 127.0.0.1
host ns.domainX.linux.class 127.0.0.1

其它主機驗證

在其他主機進行測試:

host -t ns domainX.linux.class
host ns.domainX.linux.class