寫在前面的話
網上關于 DNS 的文章其實一搜尋一大把,但是看别人的文檔一般都會有個問題,亂,不講究,全是 ctrl c + ctrl v,我個人是看不下去的。頭皮發麻。是以決定自己來寫寫這方面的東西,當然很多概念性的東西還是來源于網絡。至于寫這篇的目的其實算是做個總結。對于 DNS 這個東西。它可能不是你工作的必須,但是有它能夠解決你很多公司内網中複雜問題。我們後面提到的企業級,可能更多的還是說公司内網這樣的環境,至于生産環境,人有多大膽,地有多大産吧。
DNS 概念性東西
FQDN:完全限定域名,即每個域在全球唯一,域不是域名,google.com 是域,www.google.com 是域名。
域可以分為根域(.)和頂級域(TLD)
頂級域又可以分為三類:
1. 通用頂級域(.com 商業機構,.org 非營利性組織,.net 網絡服務機構等)
2. 國家頂級域(.cn 中國,.uk 英國,.us 美國,.jp 日本)
3. 反向域(基礎建設頂級域,.arpa)
DNS 查詢方式包含遞歸和疊代:
1. 遞歸是用戶端發起一次請求給 DNS 伺服器,通過多次查找傳回正确解析。
2. 疊代是發出多次請求查詢不同的 DNS 伺服器。
解析方式包含正向解析和反向解析:正向解析指代将 FQDN 轉換成 IP,反向則相反。
一般 DNS 的伺服器類型包含:主從 DNS 伺服器,緩存伺服器,轉發伺服器。
主從好了解,就是從自動更新同步主的配置,作為 backup 存在。
緩存的伺服器作用在于使用遞歸查詢,将查詢到的結果傳回用戶端,并緩存查詢的結果。
轉發伺服器作用在于當發現查詢不是本機的時候則将請求轉發出去。
DNS 監聽 TCP 和 UDP 都是 53 端口。
以下是一次完整的請求大緻過程:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3AzMzcjMxcTOtczNzYjM5MDNxkDM3ATOxAjMtcjN3kzN58CX3ATOxAjMvw1N2cTO3kzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
從客戶機到伺服器之前采用得是遞歸查詢,而伺服器之間則是采用疊代查詢。
DNS 記錄類型:DNS 域名資料庫由資源記錄和區檔案指令組成。
SOA 記錄:起始授權機構記錄,SOA 備注說明了衆多 NS(name server)記錄中誰是主名稱伺服器,不參與功能,但是不能缺少。
NS 記錄:域授權記錄,當請求到達根域的時候,通過 NS 記錄找到對應的域。
A 記錄:當通過 NS 記錄到達域以後,比如通路 www.baidu.com,通過 NS 我們找到了 baidu.com,此時就需要通過 A 記錄找到 www。
MX:将該域下的所有郵件伺服器位址指向郵件伺服器。
AAAA 記錄:A 記錄處理 IPV4,AAAA 處理 IPV6。
PTR 記錄:反向解析,将 IP 解析成域名。
CNAME:别名記錄,允許多個名字映射到另外一個域名。比如我們 ping 百度的時候可以發現傳回其實是 www.a.shifen.com 這個域名傳回。所有 www.baidu.com 其實是個别名。
搭建單台 DNS
我們這裡準備了三台虛拟機:
IP | 系統 | 說明 |
---|---|---|
192.168.100.111 | CentOS Linux release 7.5 | DNS 伺服器,主機名:demo-node1 |
192.168.100.112 | 客戶機,主機名:demo-node2 | |
192.168.100.113 | 客戶機,主機名:demo-node3 |
1. DNS 伺服器安裝 bind 服務:
yum -y install bind-utils bind bind-devel bind-libs
2. 配置主配置檔案:/etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { ::1; };
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
recursion yes;
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";
forwarders { 202.96.128.166;8.8.8.8; };
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
最終内容如下,紅色部分為我們修改的。
3. 追加域名解析入口配置:/etc/named.rfc1912.zones
zone "dylan.com" IN { # 測試用的域是 dylan.com
type master;
file "dylan.com.zone"; # 配置檔案為 dylan.com.zone,該檔案目錄為 /var/named/ 下
};
4. 配置單獨的解析檔案:
/var/named/
cp named.localhost dylan.com.zone
chown named.named dylan.com.zone
修改配置:dylan.com.zone
$TTL 1D ;TTL 修改配置生效時間,預設為一天
@ IN SOA @ rname.invalid. (
0 ; serial,配置編号,每次改完配置 +1,這樣從伺服器就知道更新配置
1D ; refresh,從伺服器重新整理時間,預設一天重新整理一次
1H ; retry,如果重新整理失敗,預設1小時重試一次
1W ; expire,緩存過期時間,一周
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
www IN A 192.168.100.112
我們新加了個 www.dylan.com 的 A 記錄。
4. 啟動服務測試:
systemctl start named
systemctl enable named
檢視端口:
netstat -tlunp | grep 53
結果如圖:
我們看到除了服務本身的 53 端口外,還監聽了 953,這是 dns 服務的一個插件,現在我們先不管。
本機測試解析:
dig @127.0.0.1 www.dylan.com
檢視結果:
另外介紹兩種檢查配置的方法:
# 檢查主配置
named-checkconf /etc/named.conf
# 檢查 zone 配置
named-checkzone dylan.com /var/named/dylan.com.zone
結果如下:
我們在用戶端修改 DNS 配置測試,修改網卡 DNS 配置重新開機網卡:
主從 DNS 服務搭建
1. 主從 DNS 的搭建開始的時候其實是和單機搭建一樣的,我們修改主伺服器的配置檔案:/etc/named.rfc1912.zones
将我們之前的配置進行修改:
zone "dylan.com" IN { # 測試用的域是 dylan.com
type master;
file "dylan.com.zone"; # 配置檔案為 dylan.com.zone,該檔案目錄為 /var/named/ 下
allow-update { 192.168.100.113; };
allow-transfer { 192.168.100.113; }; # 允許同步DNS的輔助伺服器IP
also-notify { 192.168.100.113; };
notify yes; # 啟用變更通告,當主檔案變更,通知從進行比較同步
};
紅色部分是我們新加的,并指定了從的位址,重新開機服務
systemctl restart named
2. 從伺服器也安裝 bind 并将 /etc/named.conf 配置拷貝過來。
接着也是配置:/etc/named.rfc1912.zones,此時就能展現主從的不同:
zone "dylan.com" IN {
type slave;
file "slaves/dylan.com.zone";
masters { 192.168.100.111; }; # 指定主伺服器的 IP
masterfile-format text; # 指定區域檔案的格式為text,不指定有可能會為亂碼
};
我們不需要再去配置 dylan.com.zone 檔案,因為我們需要去主同步。所有直接啟動從的 dns 服務。
systemctl start named
systemctl enable named
重新開機成功後我們會發現,在從伺服器的 /var/named/slaves 目錄下,dylan.com.zone 已經同步成功。
3. 修改主配置測試同步情況:
我們修改主伺服器的 dylan.com.zone,新加解析的同時,修改配置編号,讓從能夠探測到變化。
此時我們重新開機主伺服器,會發現從伺服器就能夠同步成功。
順便值得一提的是,我這裡使用 reload named 服務并沒有使配置生效。
小結
值得一提的是,我們在域名解析過程中,還會遇到某些特殊情況:
1. @ 可以引用當區域名字,比如直接通路 baidu.com 就是這樣的解析
2. 同一名字通過不同的名字定義多條記錄,此時 DNS 會輪詢響應。
3. 同一值可以多個名字。
4. * 泛域名解析,比如配置 *.baidu.com 指向某個 IP,那麼如果你通路 a.baidu.com 這種沒有配置的會預設走這個配置。