DNS and BIND
DNS and Bind
BIND:Berkeley internet name Domain, 伯克利互聯網名稱域;
名稱域--名字空間:
倒置的樹
根域(.)
頂級域(Top Level Domain, TLD)
組織域: com, org, edu, gov, mil, net, ...
info,cc, 中國, ......
地理域: cn, tw, hk, jp, iq, ......
方向域: in-addr.arpa
DNS的名稱解釋方式:
正向解析: 名稱 --> IP
方向解析: IP地址 --> 名稱
註意: 正向解析和方向解析所使用的名稱非同一空間, 非同一棵殊; 也就是非同一數據庫;
DNS查詢類型:
遞歸查詢: 客戶機向DNS服務器進行DNS查詢的過程;
叠代查詢(重指引): 當服務器使用叠代查詢時能夠使其它服務器返回一個最佳的查詢點提示或主機地址, 若此最佳的查詢點中包含需要查詢的主機地址, 則返回主機地址信息, 若此時服務器不能夠直接查詢到主機地址, 則是按照提示的指引依次查詢, 知道服務器給出的提示中包含所需要查詢的主機地址為止, 一般的, 每次指引都會更靠近根服務器(
DNS服務器的分類:
至少負責一個域的數據庫:
主DNS服務器
輔助DNS服務器(從DNS服務器)
不負責任何域的數據庫:
緩存DNS服務器(存根DNS服務器)
一次完整的DNS查詢請求流程:
Client--> hosts --> Local Cache --> first DNS(recursive) -->
1.-->服務器本地緩存或本地數據庫中有結果, 直接響應客戶端;
2.-->ROOT(iteration) --> TLD_DNS_SERVER --> 二級域DNS_SERVER--> ...... --> ns.xx. --> 解析結果;
DNS解析一個域名的過程:
1.一臺通過ISP接入了互聯網的計算機A(下面簡稱A). ISP會給A分配一個DNS服務器, 這個DNS服務器不是權威服務器, 而是相當於一個代理的dns解析服務器, 他會幫助A叠代權威服務器返回的應答, 然後把最終查到IP返回給A.
2.現在A要向A網絡設置裏的DNS發起請求查詢www.baidu.com這個域名了.
3.該DNS拿到請求後, 先檢查一下自己的緩存中有沒有這個地址, 有的話就直接返回. 這個時候那個的ip地址, 會被標記為非權威服務器的應答.
4.如果緩存中沒有的話, 該DNS會從配置文件裏面地區13個根域名的服務器的地址(這些地址是不變的, 直接在BIND的配置文件中).
5.然後像其中一臺發起請求.
6.根服務器拿到這個請求後, 知道他是com.這個頂級域名下的, 所以就會返回com域中的NS記錄, 一般來說是13臺主機名和IP.
7.然後該DNS想其中一臺再次發起請求, com域的服務器發現你這請求是baidu.com這個域的, 我一查發現了這個域的NS, 那我就返回給你, 你再去查. (目前百度有4臺baidu.com的頂級域名服務器).
8.該DNS不厭其煩的再次向baidu.com這個域對的權威服務器發起請求, baidu.com收到之後, 查了下有www的這臺主機, 就把這個IP返回給你了.
9.然後該DNS那搞了之後, 將其返回給了客戶端, 並且把這個保存在高速緩存中.
查詢得到的解析答案:
權威答案: 由直接負責管理對應信息的DNS服務器返回的答案;
非權威答案: 由指定的服務器從緩存中或者利用叠代的方式查詢到的答案;
還有兩種可能:
肯定答案: 能夠按照客戶端請求完成正確的名稱解析的答案;
否定答案: 無法按照客戶端的請求完成正確的名稱解析所返回的答案; 即客戶端鎖清秋的解析內容不存在或無法找到映射資源;
DNS:
主從DNS服務器:
傳輸方式: Push(推), Pull(拉)
傳輸協議: TCP
主DNS服務器: 維護所負責解析的區域數據庫文件的主體服務器, 即: 可以在區域數據庫中進行增, 刪, 改得管理操作; 讀寫操作均可進行;
從DNS服務器: 也稱為輔助DNS服務器, 從DNS服務器或其他的從DNS服務器以區域傳送的方式復制對方的區域數據庫; 從DNS服務器無法完成管理類操作, 只能進行讀寫操作;
為了保證DNS服務器中的數據庫和從DNS服務器中的數據庫一致;
序列號: Serial, 即數據庫的版本號; 主DNS服務器的數據庫內容如果發生變化, 序列號應該自增; 如果從服務器接收到的新的數據庫, 如果其序列號沒有變化, 則忽略; 如果發現其比當前自身的數據庫序列號更大, 則更新;
刷新時間間隔: refresh, 從DNS服務器每隔多長時間到主DNS服務器上檢查序列號的變化更新情況;
重試時間間隔: retry, 從DNS服務器向主DNS服務器要求同步數據庫失敗之後, 再次發起嘗試請求的時間間隔;
過期時間: expire, 從DNS服務器始終聯系不上主DNS服務器時, 從DNS服務器多長時間之後停止服務;
否定答案的緩存時長: minimal TTL
題外話:
服務器時間同步的方法:
1.到互聯網同步時間;
2.自架時間服務器;
CentOS 6-: ntpd服務器
CentOS 7: ntpd服務器, chrony服務器
ntpd的配置: /etc/ntp.conf
restrict 172.16.0.0 mask 255.255.0.0 nomodify
CentOS 6-: service ntpd start
CentOS 7: systemctl start ntpd.service
區域數據傳送:
主DNS服務器可以主動跟通知從DNS服務器更新數據;
從DNS服務器可以主動的向主DNS服務器發出更新請求;
兩種類型:
全量傳送: AXFR, All Transfer, 傳送整個數據庫;
增量傳送: IXFR, Increment Transfer, 僅傳送自上次變化之後的數據內容
對於BIND, 默認是允許所有客戶端請求區域傳送; 需要進行訪問控制;
區域是DNS服務器用於進行正常的權威解析活動的必要的基礎;
資源記錄(RR): 存放於區域數據庫文件中的那些用於解析工作的數據.
資源記錄:
記錄的類型: A, AAAA, PTR, SOA, NS, CNAME, MX
SOA: Start of Authority, 起始授權記錄;
在任何一個數據庫中有且只有一條SOA記錄, 必須是數據庫的第一條記錄
A: Address, 主機記錄;
標識從完全合格域名到IP地址的映射關系, FQDN --> IPv4;
AAA: Address, FQDN --> IPv6;
PTR: PoinTeR, 指針記錄;
標識從IP地址到完全合格域名的映射關系, IP --> FQDN
NS: Name Server, 名稱服務器記錄;
用戶標明當前域所有的DNS服務器;
CNAME: Conanical Name, 別名記錄;
標識從完全合格域名到完全合格域名的映射關系, FQDN --> FQDN
MX: Mail eXchanger, 郵件交換器記錄;
標識域中郵件服務器的主機名, 從域名映射到完全合格域名, Domain name --> FQDN
優先級: 0-65536, 數字越小優先級越高;
區域數據庫中資源記錄的定義格式:
語法: name|FQDN [TTL] IN RR_TYPE VALUE
註意:
1.名稱部分可以寫FQDN, 也可以除去域名部分的主機名, 其域名會從配置文件中繼承, 也可以使用宏$Origin來定義;
2.TTL是以每秒為單位的時間概念, 如果省略, 則從全局定義的宏$TTL繼承
3."@"符號可以用於引用當前區域的域名;
4.同一個name可以通過多條記錄定義多個不同的VALUE; DNS在查詢此類記錄的時候, 會以輪詢的方式一次調取每個記錄的內容;
5.多個name通過多條記錄對應一個VALUE, 通常用於多個名稱對應同一個VALUE, 通常用於多個名稱對應同一個IP地址, 可以使用CNAME記錄來進行標識;
七種資源記錄在區域數據庫中的具體格式:
SOA資源記錄;
name: 當前域的域名, 如: qhdlink.com.; 或者可以使用"@"代替域名;
value:
1.當前區域的主DNS服務器的FQDN;
2.當前區域數據庫的管理員的郵件地址; 但是使用"."來代替"@"; 如:
mailmaster.qhdlink.com.([email protected])
3.主從服務器進行區域傳送的相關定義及否定答案的統一TTL;
格式可以寫成一行, 如下:
(Serial 1H 15M 1W 1D)
也可以寫成多行:
( Serial; 1H;refresh 15M;retry 1W;expire 1D);minimal
(分行的好處就是可以加註釋, 分號後面的就是註釋.)
例如: ([email protected])
$TTL 86400 qhdlink.com. 86400 IN SOA ns1.qhdlink.com. master.qhdlink.com.( 2017081001;serial 1H;refresh 15M;retry 1W;expire 1D);ttl
NS記錄: (必須有)
name: 當前域的域名
value: 當前區域內某DNS服務器的完全合格域名, 如: ns.qhdlink.com.
註意:
1.一個域中可以有多個NS資源記錄;
2.每個NS資源記錄都必須要有一個A記錄與之對應;
例如:
1.正常寫法:
qhdlink.com. 86400 IN NS ns1.qhdlink.com. qhdlink.com. 86400 IN NS ns2.qhdlink.com.
2.使用宏繼承的寫法:
$Origin qhdlink.com. $TTL 86400 IN NS ns1 IN NS ns2
MX記錄: (必須有)
name: 當前域的域名;
value: 當前域中某有效的郵件服務器的主機名;
註意:
1.一個域中, 可以有多條MX資源記錄;
2.每個MX資源記錄都必須要有一條A記錄與之對應;
例如:
qhdlink.com. 86400 IN MX 10 mail1.qhdlink.com. @ IN MX 20 mail2
A記錄:
name: 域中某主機的FQDN或主機名;
value: 與主機名對應的IPv4地址;
例如:
www.qhdlink.com. 86400 IN A 192.168.1.1 www.qhdlink.com. 86400 IN A 192.168.1.2 www.qhdlink.com. 86400 IN A 192.168.1.3 www.qhdlink.com. 86400 IN A 192.168.1.4 www IN A 192.168.1.1
泛域名: *.qhdlink.com. IN A 1.2.3.4
直接域名(空域名): qhdlink.com. IN A 2.3.4.5
泛域名和直接域名都是防止用戶寫錯名稱而導致無法給出正確的解析結果;
CNAME記錄:
name: 別名的FQDN或簡單的名稱;
value: 真正的名稱的FQDN或其簡單名稱;
例如:
web.qhdlink.com. 86400 IN CNAME www.qhdlink.com.
web IN CNAME www
AAAA記錄: 規則和A記錄一致;
ftp.qhdlink.com. 86400 IN AAAA fe08::1
ftp.qhdlink.com. 86400 IN AAAA ::1
PTR記錄:
name: 將IP地址反過來寫, 並在其後綴加反向域的標準後綴; 所以其完整寫法應該是: 1.72.16.172.in-addr.arpa.
value: FQDN
例如:
1.72.16.172.in-addr.arpa. 86400 IN PTR www.qhdlink.com.
如果有全局宏定義的話:
1.72 IN PTR www www.qhdlink.com.
註意:
1.網絡部分的地址和標準後綴可以省略;
2.PTR記錄的value部分, 必須寫FQDN;
3.如果剩余的IP地址中的主機部分仍然是多段, 主機部分依然需要反著寫;
BIND軟件:
BIND ---- Berkeley Internet Name Domain, Berkeley 開發, ISC(isc.org)維護
bind-libs: 為bind的其他應用程序提供共享庫文件;
bind-utils: 通用工具包, 如: dig, host, nslookup等;
bind: 主程序包, 包括: DNS服務器程序(named), 解析庫, 檢測工具;
bind-chroot: 設置偽根, 啟用監牢的模式, 安全體現;
實現DNS協議的程序是BIND, BIND的服務器的主程序named;
named: DNS Server
53/udp: 完成主機名查詢;
53/tcp: 完成區域傳送;
bind:
主配置文件: /etc/named.conf
可以在此配置文件中使用include命令包含其他的配置文件;
/etc/named.isclv.key
/etc/named.rfc1912.zones
聲明區域:
/etc/named.root.key
主配置文件的格式:
1.註釋方式:
//: 單行註釋;
/* ...... */: 任意內容註釋;
2.分段配置的特點:
a.訪問控制列表定義段:
acl ACL_NAME {......};
b.全局選項段:
options {......};
c.日誌配置段:
logging {......};
d.區域配置段:
zone "ZONE_NAME" IN {......};
e.視圖配置段:
view VIEW_NAME {......};
f.include包含段:
include /PATH/TO/SOME_CONFIG_FILE
全局配置段:
options { listen-on port 53 { 127.0.0.1; 172.16.72.1; }; 在啟動DNS服務之後, named進程監聽的IP地址; directory "/var/named"; 規定的解析庫(區域數據庫)的根目錄; allow-query { localhost; }; 訪問控制語句, 允許哪些主機將查詢請求發送至本服務器; 默認為localhost, 即只為服務器自身提供查詢請求處理; recursion yes; 全局開啟遞歸查詢; 默認為所有客戶端開啟遞歸查詢; 初學者, 建議關閉dnssec功能; nssec-enable no; dnssec-validation no; dnssec-lookaside no; };
測試工具:
dig, host, nslookup
dig: DNS查找工具
格式:
dig [@Server] [-t RR_TYPE] [query_options]
@Server: 表示為此次的查詢請求使用指定的DNS服務器完成; 如果不給, 那麽就讀取/etc/resolv.conf中的nameserver配置項的值;
-t RR_TYPE: 指定此次查詢請求的資源記錄類型;
查詢選項:
+[no]trace: 跟蹤整個解析過程;
+[no]recurse: 要求目標DNS服務器必須[不]進行遞歸查詢;
方向解析查詢:
dig -x IPADDR
模擬區域傳送:
dig -t axfr DOMAIN_NAME [@Server]
host命令:
host [-t RR_TYPE] DOMAIN_NAME SERVER
nslookup命令:
命令行工具+交互式命令:
命令行工具: nslookup DOMAIN_NAME
交互式命令: nslookup
> server IP_ADDR
指定此次查詢使用的DNS服務器IP地址;
> set q=RR_TYPE
要查詢的資源記錄的類型;
> QUERY_NAME
壓迫查詢解析的主機名;
> set type=RR_TYPE
同set q=RR_TYPE
rndc: DNS服務器端的控制命令; 953/tcp
rndc status: 查看服務器端的運行狀態;
rndc reload: 通知服務器端程序重載配置文件和區域文件;
DNS服務的配置:
1.基本的正向和方向區域的配置和解析;
2.主從服務器的設置;
3.子域和子域的委派;
4.轉發器;
5.訪問控制列表和視圖;
基本的正向和方向區域的配置和解析:
1.配置一個正向的區域:
1) 定義區域: /etc/named.rfc1912.zones
zone "ZONE_NAME" IN { type {master|slave|forward|hint}; file "ZONE_NAME.zone"; }; zone "qhdlink.com" IN { type master; file "qhdlink.com.zone"; };
2) 創建區域數據文件
/var/named/qhdlink.com.zone
註意修改權限:
# chown :named qhdlink.com.zone
# chmod o-r qhdlink.com.zone
$ORIGIN qhdlink.com. $TTL 86400 @ IN SOA ns1.qhdlink.com. admin.qhdlink.com. ( 2017081001;serial 1H;refresh 15M;retry 1W;expire 1D);TTL IN NS ns1.qhdlink.com. MX 10 mx1.qhdlink.com. ns1.qhdlink.com. IN A 172.16.72.1 www IN A 172.16.100.1 www IN A 172.16.100.2 www IN A 172.16.100.3 web IN CNAME www mx1 IN A 172.16.100.4
3) 重載配置文件和區域文件, 使配置生效;
a.檢測語法是否正確:
named-checkconf
檢測named.conf及其輔助配置文件的語法正確與否;
named-checkzone "ZONE_NAME" FILE_NAME
檢測域名和區域數據庫文件是否對應和是否存在語法錯誤;
b.重載配置文件;
# rndc reload
# systemctl reload named.service
# service named reload(CentOS 6-)
2.配置一個反向的區域:
1) 定義區域: /etc/named.rfc1912.zones
zone "ZONE_NAME" IN { type {master|slave|forward|hint}; file "ZONE_NAME.zone"; }; zone "16.172.in-addr.arpa" IN { type master; file "172.16.zone"; };
2) 創建區域數據文件
/var/named/172.16.zone
註意修改權限:
# chown :named 172.16.zone
# chmod o-r 172.16.zone
$ORIGIN 16.172.in-addr.arpa. $TTL 86400 @ IN SOA ns.qhdlink.com.admin.qhdlink.com. ( 2017081001;serial 1H;refresh 15M;retry 1W;expire 1D);TTL IN NS ns1.qhdlink.com. 1.72 IN PTR ns1.qhdlink.com. 1.100 IN PTR www.qhdlink.com. 2.100 IN PTR www.qhdlink.com. 3.100 IN PTR www.qhdlink.com. 4.100 IN PTR mx1.qhdlink.com.
3) 重載配置文件和區域文件, 使配置生效;
a.檢測語法是否正確:
named-checkconf
檢測named.conf及其輔助配置文件的語法正確與否;
named-checkzone "ZONE_NAME" FILE_NAME
檢測域名和區域數據庫文件是否對應和是否存在語法錯誤;
b.重載配置文件:
# rndc reload
# systemctl reload named.service
# service named reload(CentOS 6-)
2.主從服務器:
註意: 主從服務器都是區域級別的概念;
配置一個從區域:
ON slave:
1) 定義區域
zone "ZONE_NAME" IN { type slave; file "slaves/ZONE_NAME.zone"; masters { MASTER_IP; }; };
示例:
zone "qhdlink.com" IN { type slave; file "slaves/qhdlink.com.zone"; masters { 172.16.72.1; }; };
2) 檢測並重載配置文件;
~]# named-checkconf
~]# rndc reload
On Master:
1.確保區域數據文件中為每個名稱服務器都提供NS記錄;
2.在正向區域文件中, 需要為每個NS記錄提供A記錄;
3.為NS記錄提供的A記錄所指向的IP地址必須是從服務器的真實IP地址;
4.註意主從服務器的時間同步;
轉發器:
1.區域轉發:
專門針對某個特定的區域, 實現的轉發器轉發;
定義在/etc/named.rfc1912.zones文件中的zone聲明中;
zone "baidu.com" IN { type forward; forward {first|only}; forwarders { 172.16.72.1; }; };
first: 首先轉發, 當指定的轉發器無響應時, 再自行叠代;
only: 只使用轉發器進行轉發, 不執行自行叠代;
2.全局轉發:
針對那些沒有通過zone在本地定義的區域的查詢請求, 全部轉發給轉發器, 請求轉發器予以遞歸查詢;
/etc/named.conf options { ... forward {first|only}; forwarder { SERVER_IP; }; ... };
子域委派授權:
在父域的區域文件中直接授權即可;
qhdlink.com區域的文件/var/named/qhdlink.com.zone
tech.qhdlink.com. IN NS ns.tech.qhdlink.com. ns.tech.qhdlink.com. IN A 172.16.69.1
在子域的NS服務器上, 直接創建子域的區域文件, 管理資源記錄即可;
/etc/named.rfc1912.zones zone "tech.qhdlink.com" IN { type master; file "tech.qhdlink.com.zone"; }; touch /var/named/tech.qhdlink.com.zone chown :named /var/named/tech.qhdlink.com.zone chmod 640 /var/named/tech.qhdlink.com.zone
如果想要從子域的NS服務器解析父域的資源記錄, 則需要轉發器的定義;
定義區域轉發:
在子域的NS服務器上的/etc/named.rfc1912.zones中定義父域轉發器;
zone "qhdlink.com" IN { type forward; forward first; forwarders { 172.16.72.1; }; };
定義全局轉發:
在子域的NS服務器的主配置文件/etc/named.conf文件中定義:
options { ... forward first; forwarders { 172.16.72.1; }; ... };
總結:
1.可以通過委派授權, 使父域可以直接找到子域的NS服務器, 從而解析子域中的資源記錄;
2.可以通過區域轉發或全局轉發, 是子域能夠通過父域的NS服務器, 查找父域中的資源記錄;
bind中的基礎安全相關的配置:
acl: 訪問控制列表, 將一個或多個IP地址, 歸並為一個命名的集合, 隨後可以通過定義好的acl的名稱對該集合內的所有的IP地址進行統一的調用或設置;
bind有四個內置的acl:
none: 不包括任何一個IP地址;
any: 包括所有的IP地址;
local: 本機的IP地址;
localnet: 包括本機IP地址所在網段內的所有IP地址;
172.16.72.1/16 172.16.0.0/16
定義acl的語法:
acl acl_name { [!] ip; [!] network/prefix; }; acl mynet { 172.16.0.0/16; 127.0.0.1; ! 172.16.100.100; };
註意:
1.在調用acl之前, 確保其已經被定義;
2.通常在主配置文件/etc/named.conf中定義, 並且放在options之前;
經常與acl配合使用的訪問控制指令:
allow-query { acl|IP|Network; };
允許向本服務器發起查詢請求的主機, 即: 白名單;
allow-transfer { acl|IP|Network; };
允許哪些從服務器可以從本機進行區域傳送; 默認是所有主機都可以; 建議應該只允許從服務器完成此項工作, 白名單;
allow-recursion { acl|IP|Network; };
允許哪些主機向當前DNS服務器發起遞歸查詢請求;
allow-update { acl|IP|Network; };
DDNS, Dynamic DNS;
允許哪些主機動態更新區域數據庫中的資源記錄; 因為其不安全, 所以應該禁用;
視圖: view
定義視圖:
view VIEW_NAME { match_clients { acl; }; zone zone zone ...... };
註意: 一旦在bind中啟用的視圖, 則所有的zone都必須定義在視圖中;
視圖配置示例:
view intranet { match-clients { mynet; }; zone "." IN { type hint; file "named.ca"; }; zone "qhdlink.com" IN { type master; file "qhdlink.com.intra.zone"; allow-query { mynet; }; allow-update { none; }; allow-transfer { none; }; }; }; view internet { match-clients { any; }; zone "." IN { type hint; file "named.ca"; }; zone "qhdlink.com" IN { type master; file "qhdlink.com.inter.zone"; allow-update { none; }; allow-transfer { none; }; }; };
DNS and BIND