前言
域名系統(DNS)是互聯網基礎設施的核心,將易記域名映射為機器可識別的 IP 位址。本文系統梳理 DNS 理論基礎、查詢機制、資源記錄類型、主從同步原理,並提供基於 CentOS 6.7 + BIND 的完整實驗實作,涵蓋快取服務器、正反向解析區域、主從區域傳送、HTTP 服務驗證等企業級部署場景。
一、理論基礎篇
1. DNS 服務定義與企業自建動機
- 定義:分散式資料庫,提供域名↔IP 映射,核心服務埠 TCP/UDP 53。
- 企業自建理由:
- 節省內網域名解析佔用的外網頻寬
- 解析內網伺服器私有 IP(如內部 Web、郵件、資料庫)
- Active Directory 域環境依賴內網 DNS 定位網域控制器(SRV 記錄)
2. 核心架構與協議特性
| 項目 | 說明 |
| 架構模型 | Client/Server,應用層協議 |
| 傳輸協議 | UDP 53(查詢/回應,<512 bytes);TCP 53(區域傳送、>512 bytes 回應) |
| BIND | Berkeley Internet Name Domain,ISC 維護,最廣泛部署的 DNS 軟體 |
| 命名空間 | 樹狀層級:根域 → 頂級域 → 二級域 → 三級域…最多 127 級 |
3. 查詢類型:遞迴 vs 迭代
- 遞迴查詢:客戶端→本地 DNS,本地 DNS 必須返回最終結果(或錯誤),中間過程對客戶端透明。典型:主機→本地 DNS
- 迭代查詢:本地 DNS→根域→頂級域→權威域,每層返回下一層 NS 記錄,由本地 DNS 逐層追問。典型:本地 DNS→根/權威 DNS
4. 正向解析 vs 反向解析
- 正向:Domain Name → IP(A/AAAA 記錄),普遍部署
- 反向:IP → Domain Name(PTR 記錄),主要用於郵件伺服器反向驗證防垃圾郵件
- 兩者屬於獨立命名空間,各自維護區域檔案
5. DNS 伺服器角色
- 主 DNS (Master):維護區域權威資料,管理員手動編輯區域檔
- 從 DNS (Slave):透過區域傳送從主/其他從伺服器複製區域資料,提供冗余與負載分擔
- 快取 DNS (Caching-only):無權威區域,僅遞迴查詢並快取結果,加速回應
- 轉發器:將特定查詢轉發給指定上游 DNS,減少跨網查詢流量
6. 資源記錄 (RR) 詳細解析
區域檔由大量 RR 組成,語法:name [TTL] IN rr_type value
| 類型 | 全稱 | 用途 | 範例 |
| SOA | Start of Authority | 區域權威起始記錄,含序列號、刷新/重試/過期/最小 TTL | @ IN SOA ns1.admin. (2024010101 2H 10M 1W 1D) |
| NS | Name Server | 宣告區域授權名稱伺服器 | @ IN NS ns1 |
| A | Address | 域名→IPv4 | www IN A 192.168.1.10 |
| AAAA | IPv6 Address | 域名→IPv6 | www IN AAAA 2001:db8::1 |
| PTR | Pointer | IP→域名(反向區域),IP 反寫 + .in-addr.arpa. | 10 IN PTR www.example.com. |
| CNAME | Canonical Name | 別名記錄,指向另一個規範名稱 | web IN CNAME www |
| MX | Mail Exchanger | 郵件交換器,含優先權數值(越小優先級越高) | @ IN MX 10 mail |
| TXT | Text | 任意文本,常用於 SPF、DKIM、域名驗證 | @ IN TXT "v=spf1 mx -all" |
7. 區域傳送機制與 SOA 關鍵參數
- 全量傳送 (AXFR):傳送完整區域資料
- 增量傳送 (IXFR):僅傳送變更部分(需主從 BIND 版本支援)
- SOA 協調參數:
Serial:序列號,主伺服器資料變更時遞增(格式建議 YYYYMMDDNN)
Refresh:從伺服器檢查更新間隔(預設 2H)
Retry:檢查失敗重試間隔(預設 10M,必須 < Refresh)
Expire:長時間無法連絡主伺服器後,從伺服器停止服務(預設 1W)
Minimum:否定答案快取 TTL
- Notify 機制:主伺服器資料變更主動通知從伺服器即時同步
二、實戰實驗篇(CentOS 6.7 × 3 + Windows 7 × 1)
實驗拓撲
| 角色 | 主機名 | IP |
| 主 DNS | DNS-master | 10.68.7.235 |
| 從 DNS | DNS-slave | 10.68.7.231 |
| Web 伺服器 | http | 10.68.7.234 |
| Windows 客戶端 | Windows-Client | 10.68.7.236 |
任務一:部署快取 DNS 服務器
# 安裝套件
yum -y install bind bind-utils bind-libs
# 編輯主配置 /etc/named.conf
options {
listen-on port 53 { 10.68.7.235; 127.0.0.1; };
directory "/var/named";
allow-query { any; };
recursion yes;
dnssec-enable no; # 實驗環境關閉 DNSSEC 避免驗證失敗
dnssec-validation no;
};
# 啟動驗證
service named start
ss -tunlp | grep :53
任務二:配置主 DNS 正向解析區域 (yangbin.com)
# 建立區域檔 /var/named/yangbin.com.zone
$TTL 1D
$ORIGIN yangbin.com.
@ IN SOA ns1.yangbin.com. admin.yangbin.com. (
2016120701 ; Serial
2H ; Refresh
5M ; Retry
7D ; Expire
1D ) ; Minimum
IN NS ns1
IN NS ns2
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.68.7.235
ns2 IN A 10.68.7.231
mx1 IN A 10.68.7.232
mx2 IN A 10.68.7.233
www IN A 10.68.7.234
web IN CNAME www
# 在 /etc/named.rfc1912.zones 定義區域
zone "yangbin.com" IN {
type master;
file "/var/named/yangbin.com.zone";
allow-update { none; };
};
# 權限與驗證
chown :named /var/named/yangbin.com.zone
named-checkzone "yangbin.com" /var/named/yangbin.com.zone
service named reload
rndc status
dig @10.68.7.235 www.yangbin.com A
任務三:配置主 DNS 反向解析區域 (7.68.10.in-addr.arpa)
# 區域檔 /var/named/7.68.10.in-addr.arpa
$TTL 1D
$ORIGIN 7.68.10.in-addr.arpa.
@ IN SOA ns1.yangbin.com. admin.yangbin.com. ( ...同正向... )
IN NS ns1.yangbin.com.
IN NS ns2.yangbin.com.
235 IN PTR ns1.yangbin.com.
231 IN PTR ns2.yangbin.com.
232 IN PTR mx1.yangbin.com.
233 IN PTR mx2.yangbin.com.
234 IN PTR www.yangbin.com.
# 區域定義
zone "7.68.10.in-addr.arpa" IN {
type master;
file "7.68.10.in-addr.arpa";
allow-update { none; };
};
任務四:配置從 DNS 實現主從同步
# 從伺服器 /etc/named.rfc1912.zones
zone "yangbin.com" IN {
type slave;
masters { 10.68.7.235; };
file "slaves/yangbin.com.zone";
};
zone "7.68.10.in-addr.arpa" IN {
type slave;
masters { 10.68.7.235; };
file "slaves/7.68.10.in-addr.arpa";
};
# 主伺服器需允許區域傳送(在區域定義加入 allow-transfer { 10.68.7.231; };)
# 關鍵驗證:查看 /var/log/messages 確認 Transfer completed
# 修改主區域序列號後執行 rndc reload,觀察從伺服器自動同步(Notify 機制)
任務五:部署 HTTP 服務與 Windows 客戶端驗證
# http 伺服器
yum -y install httpd
echo "ServerName www.yangbin.com" >> /etc/httpd/conf/httpd.conf
service httpd start
# Windows 7 設定 DNS 指向 10.68.7.235 (主) 或 10.68.7.231 (從)
# 瀏覽器訪問 https://www.yangbin.com 成功顯示測試頁面
三、生產環境最佳實踐總結
- 安全性:限制區域傳送目標(
allow-transfer)、關閉開放遞迴(allow-recursion)、啟用 DNSSEC、隱藏 BIND 版本號(version "None";)
- 高可用:一主多從、異地部署從伺服器、使用 Anycast 架構
- 維運:序列號規範化(YYYYMMDDNN)、定期
rndc dumpdb 檢查快取、監控查詢日誌(rndc querylog)、時間同步(NTP)
- 測試工具:
dig +trace 追蹤解析路徑、dig -t axfr 模擬區域傳送檢洩、rndc status 監控服務狀態