bind介紹 在區域網環境中,一般我們要搭建DNS服務,使用的是BIND(Berkeley Internet Name Domain)軟體來實現,BIND提供了一個名為named(也叫named daemon)的服務程式,用於處理DNS查詢。 BIND 由 Internet Systems Cons ...
bind介紹
在區域網環境中,一般我們要搭建DNS服務,使用的是BIND(Berkeley Internet Name Domain)軟體來實現,BIND提供了一個名為named(也叫named daemon)的服務程式,用於處理DNS查詢。
BIND 由 Internet Systems Consortium (ISC) 開發和維護,所以可以訪問ISC 的官方網站來獲取關於 BIND的相關信息。
除了BIND外,還有其它的軟體也可以用來搭建DNS服務,例如powerdns,dnsmasq,unbound,coredns(主要用在k8s環境中)等。
ISC官網:https://www.isc.org/
搭建正向解析DNS服務
-
正向解析:將功能變數名稱轉換為與之關聯的IP地址的過程
-
反向解析:一個查找與特定IP地址關聯的功能變數名稱的過程
1、安裝bind
一般通過Linux發行版提供的軟體包管理工具(例如yum、apt)進行安裝即可,如果需要進行編譯安裝,可以去官網或者github下載源碼,參考管理員手冊進行編譯安裝。
使用包管理工具進行安裝:
例如:ubuntu2004安裝bind9
# ubuntu
apt install bind9
# centos
yum install bind
2、修改配置
通過軟體包管理工具安裝了bind9服務後,配置文件一般放在 /etc/bind/ 目錄下,主配置文件一般是 named.conf
例如:在ubuntu2004中使用apt進行安裝後,預設帶的配置文件有這些
在主配置文件中,使用include 指令來引入了其它的配置文件。
有一個叫作named.conf.options的配置文件,包含了一個 options配置塊,options塊用於指定全局伺服器選項。這些選項會影響BIND伺服器的整體行為。
例如:埠指定、工作目錄指定、上層DNS、查詢許可權等。
埠配置
bind預設監聽UDP和TCP的53埠,如果要修改埠可以在這個配置文件中進行修改。(一般情況下這個埠不用改)
# any 表示any 允許所有的機器訪問本機這個dns伺服器
# ipv6埠指定
listen-on-v6 port 5353 { any; };
# ipv4埠指定
listen-on port 5353 { any; };
說明:
當使用 ss -ntl | grep 53 查看埠監聽時,有一個 127.0.0.53%lo:53 。這個是 systemd-resolved 服務預設監聽的地址和埠,在ubuntu1804及其以上的版本中預設啟用 systemd-resolved服務。
日誌配置
預設情況下,BIND把日誌消息寫到系統日誌裡面的,例如centos是/var/log/messages文件,ubuntu則是/var/log/syslog。如果我們想要自定義bind的日誌存放位置話,可以通過loging配置塊來實現。(如果沒需求可以不改)
loging配置塊定義如何記錄伺服器的活動。您可以指定記錄哪些類別的消息、它們的嚴重性以及它們應該記錄到哪裡。
(1)一般是/etc/bind目錄下單獨創建一個文件,叫作 named.conf.logging,通過在這個配置文件裡面添加日誌的相關配置。
sudo vim /etc/bind/named.conf.logging
logging {
channel query_log {
file "/var/log/namd/query.log";
severity info;
print-time yes;
};
channel other_log {
file "/var/log/named/other.log";
severity info;
print-time yes;
};
category queries {
query_log;
};
category default {
other_log;
};
};
說明:
-
需要保證文件的所屬組是bind(chown bind:bind /etc/bind/named.conf.logging)
-
需要保證bind對存放日誌的目錄具有讀寫許可權(chown bind:bind /var/log/named)
(2)編寫好配置文件後,將配置文件通過在主配置文件中通過include指令來引入。
include "/etc/bind/named.conf.logging";
logging的指令說明:
-
channel: 定義日誌輸出通道
-
category: 指定某個日誌類別應記錄到哪個通道
-
file: 指定日誌文件的路徑
-
severity: 設置日誌級別
(3)重啟服務後即可生效
區域配置
這是配置DNS正向解析的第一步。bind的區域配置是通過 zones 配置塊來實現的。區域配置就是配置功能變數名稱解析的規則。
例如:自帶的 named.conf.default-zones 這個文件中,就配置了一些預設的解析規則。
例如:我需要將www.yongshen.com這個FQDN解析為ipv4地址10.0.0.66,可以這樣做:
(1)先創建區域配置文件,命名方式一般是 功能變數名稱.zones。 一般單獨創建一個目錄來存放,方便後期管理
mkdir /etc/bind/yongshen
chown bind:bind /etc/bind/yongshen
然後在這個目錄下編輯區域配置文件:
sudo vim /etc/bin/yongshen/yongshen.zones
zone "yongshen.com." {
type master;
file "/etc/bind/yongshen/db.yongshe.com";
};
區域配置文件說明
zone配置塊,大致的格式就是:
zone "要解析的功能變數名稱" {
type master; # master表示這個是權威區域,該伺服器為該區域內的所有功能變數名稱提供權威答案
file xxxx; # 指定的文件包含了這個區域的所有資源記錄
};
type指令說明
type用於指定定義區域的類型,常見的類型有以下這些:
-
master:當有請求來時,可以根據file指定的文件中的信息返回權威答案
-
slave:當有請求來時,它可以響應請求,但它是一個從屬或備份區域。它從指定的主伺服器複製區域數據,自身不能直接修改區域內容。任何修改都需要在主伺服器上進行,並隨後同步到從伺服器
-
hint:此區域用於配置根DNS伺服器的信息
file指令說明
file指令用於指定 區域文件 , 也叫 區域數據文件。這個文件包含了若幹條資源記錄,通過這個文件可以為功能變數名稱提供詳細的解析信息。
這個文件的作用就是告訴BIND:“當有人查詢某個FQDN時,請給他這個IP地址作為答案”。
(2)編輯區域數據文件
區域配置文件搞定後,需要創建zone配置塊中file指定的區域數據文件,一個區域數據文件由若幹條區域數據記錄組成。
sudo vim /etc/bind/yongshen/db.yongshe.com
$TTL 86400
@ IN SOA master.yongshe.com. admin.yongshe.com. (
2023102401 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ; Minimum TTL
)
@ IN NS master.yongshen.com.
master IN A 10.0.0.66
www IN A 10.0.0.66
區域數據文件說明
一個區域數據文件由若幹條區域數據記錄組成,每條區域記錄由 5 部分組成:
NAME [TTL] IN type value
NAME
NAME:指定當前負責解析的功能變數名稱,可以使用 @ 符號來表示當前解析的功能變數名稱就是 區域配置裡面改zone配置塊指定的功能變數名稱
例如:
www IN A 10.0.0.66 表示要解析的FQDN就是 www.yongshen.com
TTL
TTL:表示緩存過期的時間,當一個客戶端(或者遞歸DNS伺服器)向權威DNS伺服器查詢一個功能變數名稱並得到答案後,這個答案(DNS記錄)會被緩存在客戶端或遞歸伺服器上。TTL值就是告訴這些客戶端或伺服器應該緩存這條記錄多長時間。在這個緩存時間內,如果再次有對同一條DNS記錄的查詢,客戶端或遞歸伺服器可以直接從自己的緩存中獲取答案,超過TTL指定的時間了記錄就會從緩存中被移除,相同的查詢請求就需要重新請求。
IN
IN:指的就是這個記錄屬於Internet類,其他類基本上都沒用了
type
type用於指定區域記錄的類型,不同類型的區域記錄有不同的作用。並且不同的類型,對應的value值也不同。
- A: 表示這條資源記錄類型是 IPv4地址記錄,用於將一個功能變數名稱映射為IPv4地址,所以value對應的值就是一個IPv4地址。
例如:
www IN A 10.0.0.66
- AAAA: 表示這條資源記錄類型是 IPv4地址記錄,用於將一個功能變數名稱映射為IPv6地址,value對應的值就是一個IPv6地址
例如:
mail IN AAAA 2001:db8::1
- NS: 這種記錄類型用於指定哪些DNS伺服器是權威伺服器,對應的value值是權威DNS伺服器的功能變數名稱(末尾的點不能省略)
例如:
@ IN NS master.yongshen.com. 表明權威伺服器是 master.yongshen.com.
具體過程如下:
1、當客戶端(或其他DNS伺服器)想要解析一個特定的功能變數名稱,例如 www.yongshen.com, 它首先會查詢其本地緩存或前置DNS伺服器。如果沒有找到答案,它可能會進一步查詢根伺服器或其他已知的上級伺服器來尋找關於yongshen.com域的權威伺服器信息。
2、在此情境中,權威伺服器的標識為 master.yongshen.com,這是通過NS記錄 @ IN NS master.yongshen.com. 指定的。這告訴詢問者,如果想要解析屬於yongshen.com域的任何主機名,它應該聯繫master.yongshen.com。
3、 但這還不夠,因為詢問者需要知道master.yongshen.com的實際IP地址才能與之聯繫。為了提供這一信息,還有一條A記錄:master IN A 10.0.0.66,告訴詢問者master.yongshen.com的IPv4地址是10.0.0.66。
4、當查詢請求到達IP地址10.0.0.66的伺服器時,因為該伺服器已經配置為yongshen.com域的權威伺服器並擁有該域的完整區域文件(通過zone配置塊的type和file實現的),它會查找關於www.yongshen.com的記錄。在此例中,它找到了記錄www IN A 10.0.0.66,所以它會將10.0.0.66這個地址返回給詢問者。
- SOA:這種類型的資源記錄在每個區域數據文件中有且只有一個,且是第一條記錄。用來設置這個區域的一些屬性信息的。對應的value就是這個區域的相關屬性信息。
# 郵箱只起到說明作用,不起實質的作用
@ IN SOA <主功能變數名稱伺服器名> <負責人郵箱> (
<序列號> ; Serial Number
<刷新時間> ; Refresh Interval
<重試時間> ; Retry Interval
<過期時間> ; Expire Time
<最小TTL> ; Minimum TTL
)
欄位說明:
-
主功能變數名稱伺服器名稱:權威的名稱伺服器,負責該DNS區域(通常為完全限定的功能變數名稱),用於告訴其他伺服器或者客戶端:“如果你有關於這個區域的問題,你應該來問我。” (在SOA記錄中指定的主功能變數名稱伺服器名稱通常就是該區域的權威名稱伺服器,這與NS記錄中列出的名稱伺服器一致。)
-
負責人郵箱:負責這個區域的管理員的電子郵件地址,一般使用“.”替代“@”。
-
序列號:表示區域文件的版本的數字,更改區域文件時應該增加這個數字。這樣如果搭建了主從架構,從屬或備份的DNS伺服器知道主伺服器的數據已經更改,從而觸發更新。
-
刷新時間:搭建主從架構時,告訴從屬伺服器多久檢查主伺服器的序列號一次
-
重試時間:從屬伺服器在刷新時間結束後嘗試聯繫主伺服器但失敗,它會在這個“重試時間”結束後再次嘗試。
-
過期時間:從屬伺服器在多長時間內無法與主伺服器通信後,將停止回答關於這個區域的查詢。例如向從伺服器請求:www.tom.com的ip地址是多少, 但是604800秒後都沒法和主伺服器通信,所以它就不會回答這個請求了。
-
最小TTL:其他伺服器應該緩存此區域中任何記錄的最短時間。
(3)將區域文件加入主配置文件
區域文件和區域數據文件都創建和配置後,需要將區域文件加入主配置文件中。
sudo vim /etc/bind/named.conf
include "/etc/bind/yongshen/yongshen.zones";
3、重啟服務
重啟bind服務後測試是否生效,我在ubuntu2004中使用apt安裝bind後,發現有bind9和named這兩個服務。
查看named的service文件時,發現使用Alias=bind9.service指定了一個叫作bind9.service的別名。
所以在使用ssytemctl enable named後,/lib/systemd/system/named.service在 /etc/systemd/system/下創建了兩個service文件, /etc/systemd/system/bind9.service和/etc/systemd/system/multi-user.target.wants/named.service。
bind9 是在 Debian 及其衍生版本(如 Ubuntu)上的軟體包名稱和服務名稱。在這些發行版中,通常將 named 的服務文件設置為 bind9.service,以與軟體包的名稱保持一致。所以使用named或者bind9來管理bind進程都是一樣的。
sudo systemctl restart bind9.service
4、測試
(5)可以通過dig工具來測試,dig預設使用的是53埠,如果修改了bind伺服器的埠,需要使用 -p 參數來指定埠號
# dig通過 @ 來指定DNS伺服器地址
dig www.yongshen.com @10.0.0.66 -p 5353
除了使用dig來測試dns是否可用外,還可以使用以下工具進行測試:
-
host:如果需要指定DNS伺服器地址,直接在後面寫地址就行了。例如:host www.baidu.com 192.168.13.66
-
nslookup:和host使用一樣,例如:nslookup www.baidu.com 192.168.13.66
說明: 如果DNS伺服器的埠不是預設的53,只有dig提供了 -p參數來指定,host和nslookup都是不指定手動指定埠的,
註意事項
BIND中FQDN說明:
在DNS和bind中,完全限定功能變數名稱的表現形式為由一個點(.)結尾的功能變數名稱。這個點代表DNS層級結構的根,所以FQDN實際上是從某個節點一直到DNS的根的完整表示。末尾不帶點就是一個相對於名。
在zone配置塊中: 定義了一個區域,這個zone配置塊負責處理關於yongshen.com的DNS請求,在指定區功能變數名稱稱的時候,如果最後加了點(.)表示這是一個完全限定功能變數名稱(不加點BIND也通常將其視為FQDN),但是可能會出現在不帶點的情況下,把他當作一個相對域,從而給它加上尾碼。
例如:特定的網路(企業或大學網路)裡面會自動加上尾碼,不帶點可能就給加上尾碼了
在區域數據文件中
-
資源記錄的NAME部分指定了需要處理的功能變數名稱,很多時候使用的都是相對功能變數名稱。例如:www IN A 10.0.0.66,會自動將當前zone的名稱追加在其後面。 www.yongshen.com
-
如果使用了全限定功能變數名稱,例如:www.yongshen.com. IN A 10.0.0.66,就不會將當前zone的名稱追加在其後面
$TTL說明
$TTL 是一個全局預設TTL,用於指定那些沒有明確設置TTL的記錄的生存時間。只需要在文件的頂部定義一次TTL,它會自動應用到所有後續的記錄上,除非這些記錄自己有明確的TTL設置
@ 符號說明
@ 符號是一個簡寫,代表當前區域的主功能變數名稱,即在zone配置塊中指定的功能變數名稱。
除了@符號外,經常用的還有一個 * 號, 符號是一個通配符,和shell中的*效果一樣,用來匹配該域中的任何未明確指定的主機名。
例如:
www IN A 10.0.0.66
* IN A 10.0.0.67
查詢www.yongshen.com 會範圍10.0.0.66,查詢其它的,例如mail.yongshen.com就返回10.0.0.67
區域數據文件省略說明
在BIND的區域文件中,連續的資源記錄(RRs)可以省略與前一條相同的部分。例如:
# 功能變數名稱 example.com. 在後續的記錄中被省略了,因為它與前一條記錄相同。
example.com. IN A 192.0.2.1
IN NS ns.example.com.
IN MX 10 mail.example.com.