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下載源碼,參考管理員手冊進行編譯安裝。
- 地址:https://www.isc.org/download/
- github:https://github.com/isc-projects/bind9
使用包管理工具進行安裝:
例如: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端口,如果要修改端口可以在這個配置文件(named.conf.options)中進行修改。(一般情況下這個端口不用改)
# 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/named/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)重啟服務后即可生效
訪問控制
通過option配置塊的allow-query 和 allow-transfer可以用于設置訪問控制。如果不設置默認就是允許任何客戶端進行查詢和請求區域傳輸。
- allow-query: 用于控制哪些客戶端可以向DNS服務器發起查詢
- allow-transfer: 用于控制哪些DNS服務器被允許從當前服務器同步(或請求)區域數據,即進行區域傳輸。
options { allow-query { any; }; allow-transfer { none; }; # none:不允許任何服務器同步或請求該服務器上的完整區域數據。,如果要允許修改為any或指定的ip地址 }
上層DNS指定
當BIND服務器收到一個它無法直接回答的DNS查詢時(例如,因為它不是查詢的域的權威服務器,并且查詢結果也不在其緩存中),會默認到互聯網上找根。為了提高查詢效率,將這個查詢轉發(forward)到 forwarders 列表中指定的一個或多個DNS服務器上去。
options { forwarders { 114.114.114.114; 180.76.76.76; }; }
區域配置
這是配置DNS正向解析的第一步。bind的區域配置是通過 zone 配置塊來實現的。區域配置就是配置域名解析的規則。
例如:自帶的 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、測試
可以通過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.
BIND配置文件特點
- BIND的配置文件有點和JSON格式相似,它們都具有層次結構和使用括號來定義塊。
- BIND使用大括號來定義一個塊,并且每個配置語句以分號結束
- 可以使用//進行單行注釋,或使用/* */進行多行注釋。
配置文件檢查
編寫完配置文件后,可以通過named-checkconf和named-checkzone檢查配置文件是否有語法錯誤。
named-checkconf 檢查的是named.conf這個配置文件,也可以手動指定配置文件
# 不指定配置文件 默認檢查named.conf named-checkconf # 手動指定配置文件 named-checkconf /path/x.conf
named-checkzone 檢查的是域名對應的區域數據庫文件
格式為:
named-checkzone [zone-name] [zone-file-path]
主從結構配置
通過配置BIND的主從結構,實現區域數據的冗余和負載分擔。
具體操作就是: 1、主服務器配置區域信息、如果發生數據的更改只能在主服務器上完成。
2、從服務器負責從主服務器復制區域數據信息,從服務器也可以回答關于其區域的DNS查詢
主服務器配置:
(1)在options配置快中通過allow-transfer設置只能從服務器進行區域傳輸,如果不寫默認所有的服務器都能進行傳輸,太危險。
options { allow-transfer { 192.168.0.102; }; }
(2)區域配置和區域數據配置,實現方法就和上面搭建正向解析DNS步驟是一樣的。
# 區域配置 sudo vim /etc/bin/yongshen/yongshen.zones zone "yongshen.com." { type master; file "/etc/bind/yongshen/db.yongshe.com"; }; # 區域數據配置 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
從服務器配置;
(1)在options配置快中通過allow-transfer設置不允許所有的服務器都能進行傳輸,保證安全
options { allow-transfer { none; }; }
(2)區域配置和主服務器的區域配置略有不同,首先就是要使用masters 指定主服務器的ip地址,而且file指定不在指定一個區域數據文件了,而是指定指定同步過來的資源記錄存放位置
# 區域配置 sudo vim /etc/bin/yongshen/yongshen.zones zone "yongshen.com." { # 區域名稱要保持一致 type slave; # 類型為slave masters {192.168.0.102;}; # 指定為主服務器地址 file "/var/cache/bind/db.yongshe.com"; # 指定同步過來的資源記錄存放位置 };
說明:
從服務器(Slave)通過file指令指定同步過來的資源記錄(zone data)的存放位置。這個位置是一個文件系統路徑,指向一個文件,當從服務器從主服務器(Master)進行區域傳輸時,這個文件會被更新。
例如:
- 基于Debian/Ubuntu的系統:資源記錄通常存放在/etc/bind/zones/或/var/cache/bind/下
- 基于Red Hat/CentOS的系統:資源記錄通常存放在/var/named/或/var/named/slaves/
- 其他UNIX/Linux系統:路徑可能會有所不同,但通常會在/var/named/或/etc/namedb/之類的位置
說明;如果需要將同步過來的資源文件存放在一個指定的位置,需要修改一些去安全權限才行。
(3)測試
AppArmor
在ubuntu2004中搭建主從架構的時候,從服務器上通過file指定同步過來的資源記錄存放位置,默認是存放在/var/cache/bind下,如果自定義一個目錄會出現 “dumping master file: xxxxx: open: permission denied”這種提示,這是因為受到了AppArmor定義的策略影響。
這個輸出說明了named有一個策略被激活了,策略的名字是(/usr/sbin/named),這個策略影響著正在運行的named進程(PID 468483)
AppArmor說明
AppArmor是Linux的一個內核安全模塊,它是基于路徑來限制程序能夠訪問的資源,從而增強系統的安全性。大多數情況下,在 Ubuntu 和 openSUSE 等發行版中默認啟用AppArmor模塊,Red Hat系列的發行版默認啟動的是SELinux模塊。
AppArmor一般用于在特定路徑下隔離應用程序的環境,例如可以限制一個進程只能訪問必要的文件和目錄,即使文件系統給予它足夠的權限了,通過AppArmor進行限制后照樣沒權限。
AppArmor有兩種工作模式:enforce(強制)模式和complain(投訴)模式,強制模式下不符合策略的操作會被拒絕。而投訴模式下不會組織不符合策略的操作,只會記錄到日志。
AppArmor為進程定義的策略規則是存放在 /etc/apparmor.d/ 目錄中,策略規則文件命名方式按照 進程所在的絕對路徑命名(需要把/換為.)
例如:為 /usr/sbin/named 定義的 AppArmor 策略文件將命名為 usr.sbin.named。因為named進程的路徑是:/usr/sbin/named
AppArmor 策略文件也是特別簡單的,只需要在配置文件里面加入相關文件路徑,然后指定權限。策略生效后進程就只能按照定義的策略隊則權限去訪問一個文件了。
文件路徑 權限
例如:給某個進程編寫一個策略文件,策略規則是只能以讀權限訪問A文件,那么除了A文件他有讀權限,其它目錄相對于這個進程來說,什么操作權限都沒有。
named的默認策略:
根據AppArmor策略文件的定義規則,為 /usr/sbin/named 定義的 AppArmor 策略文件將命名為 usr.sbin.named。
ehigh@ubuntu:~$ cat /etc/apparmor.d/usr.sbin.named # vim:syntax=apparmor # Last Modified: Fri Jun 1 16:43:22 2007 #include <tunables/global> # 定義了named進程的權限和限制的作用域。 /usr/sbin/named flags=(attach_disconnected) { #include <abstractions/base> #include <abstractions/nameservice> # capability指令 定義了named進程能夠使用的Linux功能 capability net_bind_service, capability setgid, capability setuid, capability sys_chroot, capability sys_resource, # 明確了可以訪問哪些文件 # 定義了文件和目錄訪問權限, r:代表讀取權限。 w:代表寫入權限。 k:允許named進程鎖定文件。 l:代表鏈接權限。m:代表執行權限,并將文件作為共享對象加載。 # /etc/bind should be read-only for bind # /var/lib/bind is for dynamically updated zone (and journal) files. # /var/cache/bind is for slave/stub data, since we're not the origin of it. # See /usr/share/doc/bind9/README.Debian.gz /etc/bind/** r, /var/lib/bind/** rw, /var/lib/bind/ rw, /var/cache/bind/** lrw, /var/cache/bind/ rw, ....... # some people like to put logs in /var/log/named/ instead of having # syslog do the heavy lifting. /var/log/named/** rw, /var/log/named/ rw, ...... }
解決方法;
為了解決自定義區域數據文件沒權限這個問題,可以采取以下方案:
方法一: 將AppArmor工作模式改為complain模式實現進程不受到策略的影響。
# 修改策略模式 sudo aa-complain /etc/apparmor.d/usr.sbin.named # 重新加載策略 sudo apparmor_parser -r /path/to/profile
方法二:
修改named的策略文件,將存放區域數據文件的目錄加到策略文件中,并賦予對應的權限。
sudo vim /etc/apparmor.d/usr.sbin.named /etc/bind/zones/** lrw,
例如:自定義從服務器存儲資源數據文件的目錄為/etc/bind/zones
1、修改策略文件,將自定義的目錄加入到策略文件中,并指定操作權限
sudo vim /etc/apparmor.d/usr.sbin.named /etc/bind/zones/** lrw,
2、修改區域配置文件,讓 同步過來的資源記錄存放位置 自定義存放到/etc/bind/zones中
zone "foreverhigh.com" { type slave; masters {192.168.5.202;}; file "/etc/bind/zones/db1.foreverhigh.com"; };
3、修改目錄權限,讓bind擁有讀寫權限
sudo chmod 755 /etc/bind/zones
4、重新加載策略文件并且重啟bind服務
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.named sudo systemctl restart bind9
5、檢查是否生效
鏈接:https://www.cnblogs.com/arthinking/p/14450337.html
(版權歸原作者所有,侵刪)
文末福利
掃碼無償領?。▊渥⑦\維入門到進階)
添加圖片注釋,不超過 140 字(可選)
本文鏈接:http://www.thecarconnectin.com/46823.html
網友評論comments