寫在前面:
博客書寫牢記5W1H法則:What,Why,When,Where,Who,How。
本篇主要內容:
● tcp/ip回顧
● DNS協議/DNS服務相關概念
● bind安裝配置
正向解析區域
反向解析區域
主從服務器
子域配置
轉發配置
● bind安全設置
acl訪問控制列表
● bind view智能DNS
相關概念回顧:
tcp/ip
通信子網--->內核中實現
傳輸層:
添加源端口與目標端口等信息。
由於發送方與接收方的速率可能不同,這樣可能會導致數據丟失,所以在傳輸層的tcp首部信息中設置有“window”(窗口)大小設置。
裸套接字:
應用層進程的報文自己有控制功能,不通過TCP和UDP支撐,直接調用互聯網層的IP報文,這類報文稱爲裸套接字報文。
TCP:Transmission Control Protocol
面向連接的協議,雙方通信之前需要實現建立虛連接。
UDP:User Datagram Protocol
用戶數據報協議,雙方通信之前無需建立虛連接。
sctp等其他協議
互聯網層
添加IP等信息,完成網絡通訊
物理層
添加MAC地址等信息,萬層本地通訊,轉發、中繼
應用層
請求信息數據,包或包組
應用程序來實現各種協議
如:http/ftp/郵件發送smtp/郵件接收pop3/
tcp/ip協議中基於sockets的通訊一般爲C/S結構的。
Server端需要時刻監聽(listen)在IP:Port上,Client同樣需要一組IP:Port信息與Server通信。
DNS:Domain Name Service,應用層協議
相關概念:
將域名與IP地址進行相互轉換的協議。
C/S結構
默認端口爲:53/udp、53/tcp
域名:FQDN(Full Qualified Domain Name)
層級結構:
根域:.
記錄頂級域服務器信息,全球目前有13個根
頂級域:top level domain(tld)
記錄二級域服務器信息
組織域:
.com商業機構 .net網絡組織 .org非盈利組織 .gov政府部門 .edu教育機構 .mil軍工部門
國家/行政區域:
.cn中國 .iq伊拉克 .tw臺灣 .hk香港 .jp日本
二級域:
記錄三級域服務器信息以及本地域主機信息
baidu.com域 magedu.com域 com.cn域等
...
DNS查詢方式:
(1)遞歸查詢
客戶端向本地DNS查詢記錄,當本地DNS中沒有對應條目時,DNS服務器去網絡中查詢,並將結果返回給客戶端。
客戶端-->本地DNS
|-->根域
|-->頂級域 tld
|-->二級域
|...
(2)迭代查詢
客戶端向本地DNS查詢記錄,當本地DNS中沒有對應條目時,DNS返回根域地址給客戶端,客戶端依次去查詢。
客戶端-->本地DNS
|-->根域
|-->頂級域 tld
|-->二級域
|...
DNS名稱解析方式:
以下兩種解析方式,不是同一個名稱空間、不是同一個目錄樹、也不是同一個解析庫。
正向解析:FQDN-->IP
反向解析:IP-->FQDN
域名註冊方式:
萬網(國內,需備案)、godaddy(國外站點,無需備案)等代理註冊站點。
注意,一般註冊的是二級域名,如baidu.com,而www.baidu.com只是域中的一臺主機。
DNS服務器類型:
不負責解析域名:
緩存名稱服務器
負責解析至少一個域(也會緩存條目)
主域名解析服務器
從域名解析服務器
服務器返回的解析答案類型:
肯定答案:
否定答案:
不存在查詢的鍵,因此,不存在預期查詢的鍵對應的值。
權威答案:
返回本DNS服務器直接維護的條目,使用dig命令會有"aa"標識。
非權威答案:
非本機維護的條目(緩存或轉發)
主-輔DNS服務器:
主DNS服務器:維護所負責解析的域數據庫的那臺服務器;讀寫操作均可進行;
從DNS服務器:從主DNS服務器或其它從DNS服務器那裏“複製”一份解析庫;但只能進行讀操作;(注意“複製”操作是以區域zone爲單位的)
主從服務器協調屬性:
序列號:serial
也即是數據庫的版本號;主服務器數據庫內容發生變化時,手動設置其版本號遞增;
刷新時間間隔:refresh
從服務器每多久到主服務器檢查序列號更新狀況;
重試時間間隔:retry
從服務器從主服務器請求同步解析庫失敗時,再次發起嘗試請求的時間間隔;
過期時長:expire
從服務器始終聯繫不到主服務器時,多久之後放棄從主服務器同步數據;停止提供服務;
否定答案的緩存時長:
注意:時長對應的單位可以是M、H、D、W,對應分鐘、小時、天、星期
另外,當主服務器數據變動時,主服務器會"主動通知"從服務器更新數據;
區域傳送:
全量傳送:axfr, 傳送整個數據庫;一般第一次同步時使用。
增量傳送:ixfr, 僅傳送變動的數據;
區域(zone)和域(domain):
區域:
正向解析或反向解析的功能與數據庫的集合。
域:
如baidu.com這個二級域,包含了正向解析和反向解析區域。
區域數據庫文件zone格式:
資源記錄Resource Record(rr)
語法:
name [TTL] IN RR_TYPE value
記錄類型(RR_TYPE):
SOA
起始授權記錄,必須爲第一條,有且只能有一條。
name:當前區域名稱
如“fredme.com.”或“4.3.2.in-addr.arpa.”
value:
(1)當前區域名稱(也可以使用主DNS服務器名稱)
(2)當前區域管理員郵箱,其中"@"用"."代替
(3)主從服務器協調屬性定義,放入()內
(4)“;”後爲註釋信息
例:
magedu.com. 86400 IN SOA magedu.com. admin.magedu.com. ( 2017010801 ; serial 2H ; refresh 10M ; retry 1W ; expire 1D ; negative answer ttl )
NS
域名服務器條目
name:當前區域名稱
value:當前區域某DNS服務器FQDN名,如ns1.fredme.com
例:
fredme.com. 86400 IN NS ns1.fredme.com.
MX
郵件服務器條目
name:當前區域名稱
優先級:0-99,數字越小,優先級越高,即使只有一個mx服務器,也需要設置優先級
value:當前區域某郵件交換器的FQDN名
例:
fredme.com. IN MX 10 mx1.fredme.com.
A
IPv4-->FQDN條目
name:FQDN
value:IPv4地址
例:
www.fredme.com. IN A 1.1.1.1
AAAA
IPv6地址條目
name:FQDN
value:IPv6
CNAME
FQDN別名
name:FQDN格式的別名
value:FQDN正式名稱
例:
web.fredme.com. IN CNAME www.fredme.com.
PTR
FQDN-->IPv4條目
僅反向區域文件中配置
例:
23 IN PTR www.gredme.com.
注意:
(1)TTL可以全局繼承。如頭部定義$TTL 3600
(2)@表示當前區域名稱
(3)相鄰兩條記錄name相同時,後者可以省略name項
(4)正向解析區域文件中,各MX、NS記錄中的FQDN應該有對應的A記錄
bind安裝配置:
BIND:
Berkeley Internet Name Domain,ISC.org
是DNS協議的一種實現軟件程序,其主程序名稱爲named。
程序包:
bind-libs:被bind和bind-utils包中的程序共同用到的庫文件;
bind-utils:bind客戶端程序集,例如dig, host, nslookup等;
bind:提供的dns server程序、以及幾個常用的測試程序;
bind-chroot:選裝,讓named運行於jail模式下;
配置文件:
主配置文件:/etc/named.conf
或包含進來其它文件;
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
文件格式:
全局配置段:
options { ... };
日誌配置段:
logging { ... };
區域配置段:
zone { ... };
定義那些由本機負責解析的區域,或轉發的區域;
注意:每個配置語句必須以分號結尾;
解析庫文件:
/var/named/目錄下;
一般名字爲:ZONE_NAME.zone
注意:
(1) 一臺DNS服務器可同時爲多個區域提供解析;
(2) 必須要有根區域解析庫文件: named.ca;
(3) 還應該有兩個區域解析庫文件:localhost和127.0.0.1的正反向解析庫;
正向:named.localhost
反向:named.loopback
rndc:remote name domain contoller
遠程管理bind程序的軟件
953/tcp,但默認監聽於127.0.0.1地址,因此默認僅允許本地使用;
命令:
用於named服務控制
rndc status
查看named服務狀態
rndc stats
查看統計信息
rndc reload/stop/restart
重讀配置文件/停止服務/重啓服務
rndc flush
清空named緩存
緩存名稱服務器的配置:
bind程序安裝完成之後,默認即可做緩存名稱服務器使用,即沒有專門負責解析的區域,直接啓動服務;
監聽地址配置:
修改爲外卡IP,以供能夠訪問此IP的客戶端訪問DNS服務。
listen-on port 53;
listen-on port 53 { 172.16.100.67; };
關閉dnssec
初學者建議關閉dnssec
dnssec-enable no;
dnssec-validation no;
dnssec-lookaside no;
關閉僅允許本地查詢:
//allow-query { localhost; };
注意:
(1)"{}"左右有空格
(2)C語言格式的註釋信息,單行註釋//,多行註釋/* */
檢查配置文件語法錯誤:
named-checkconf [/etc/named.conf]
測試工具:
dig
用來測試DNS系統,所以不會查詢hosts文件中的記錄。
正向解析測試:
dig [-t RR_TYPE] name [@NS_IP] [query options]
query options:
+[no]trace:跟蹤解析過程;
+[no]recurse:進行遞歸解析;
反向解析測試:
dig -x IP [@server]
模擬完全區域傳送:
dig -t axfr DOMAIN [@server]
host
host [-t RR_TYPE] name SERVER_IP
nslookup
nslookup [-options] [name] [server]
交互式模式:
nslookup>
server IP:以指定的IP爲DNS服務器進行查詢;
set q=RR_TYPE:要查詢的資源記錄類型;
name:要查詢的FQDN;
正向解析區域配置:
(1)修改主配置文件/etc/named.conf
options部分:
listen-on
修改監聽IP地址,此地址爲客戶端能夠訪問的地址
allow-query
設定允許查詢的主機。註釋掉,不做限制
dnssec-enable
dnssec-validation
dnssec相關配置,關閉,設置爲no
(2)根據主配置文件的include項,修改/etc/named.rfc1912.zones
一般自定義zone配置都寫入到此文件
新建自定義zone條目:
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
注意:區域名字即爲域名;
(3)根據上步驟,新建zone文件
根據上步配置,假設指明的zone文件爲grub2.com.zone,在/var/named/目錄新建此文件,內容爲:
$TTL 3600 ;單位爲秒
$ORIGIN grub2.com. ;設定域名
@ IN SOA ns1.grub2.com. admin.grub2.com. (
2016041001 ;標識符
10M ;同步時間
1H ;重試時間
1D ;過期時間
1D ;否定回答的過期時間
)
IN NS ns1
IN MX 10 mx1 ;注意MX記錄有優先級值
ns1 IN A 192.18.31.7
mx1 IN A 192.18.31.6
www IN A 192.168.31.7
IN A 192.168.31.6 ;定義多個相同FQDN條目時,客戶端每次訪問顯示順序不同,相當於進行了負載均衡。省略FQDN表示與上一條目相同。
web IN CNAME www
注意:需要修改權限信息以保證數據安全:
chgrp named grub2.com.zone
chmod o= grub2.com.zone
(4)檢查配置文件與zone文件,重讀配置文件
named-checkconf
named-checkzone grub2.com. /var/named/grub2.com.zone
rndc reload
反向解析區域配置:
(1)修改/etc/named.rfc1912.zones文件
自定義zone條目:
zone "ZONE_NAME" IN {
type master|slave|hint|forward;
file "FILE.zone";
};
補充:
ZONE_NAME:
反寫的網段地址.in-addr.arpa
31.18.172.in-addr.arpa
FILE.zone:
網段.zone即可
172.18.31.zone
(2)定義zone文件
假設爲:172.18.31.zone
內容爲:
$TTL 36000
$ORIGIN 31.18.172.in-addr-arpa
@ IN SOA ns1.grub2.com. admin.grub2.com. (
2016041001
10M
1H
1D
1D
)
IN NS ns1.grub2.com.
7 IN PTR ns1.grub2.com.
6 IN PTR mx1.grub2.com.
7 IN PTR www.grub2.com.
6 IN PTR www.grub2.com.
補充:
反向解析區域zone文件也可以設置CNAME條目,但與正向解析zone不同,應該填寫IP
主從服務器:
從服務器是區域(zone)級別的同步。
其他從服務器仍然可以從從服務器同步,即級聯。
負載均衡:
即多臺DNS服務器都發揮作用爲客戶端提供服務的實現。
(1)將本地客戶端的DNS順序修改一下,一部分將主服務器設置爲主DNS,一部分將從服務器設置爲主DNS
(2)由上級完成,告知上級DNS服務器有多臺服務器,由上級分發到不同服務器上。
服務器原則:
(1)只給本地客戶端遞歸查詢
(2)非本地客戶端只提供本地管理的域名的查詢
從DNS配置方法:
(1)定義區域
指名類型爲從服務器(slave)
zone "ZONE_NAME" IN {
type slave;
file "slave/ZONE_NAME.zone";
masters { MASTER_IP; };
};
注意:之所以將zone文件指定到salve目錄下,是爲了安全,默認/var/named/目錄對named組沒有寫權限,而修改權限勢必會有安全隱患,所以選擇在salve子目錄是非常明智的。
(2)檢查配置文件,重載配置或重啓服務
named-checkconf
rndc reload
注意:
a.需要確保主服務器的區域數據文件中爲此從服務器配置了NS記錄以及對應的A或PTR記錄,修改區域文件後記得序列號修改一下。
b.主服務器應該設置訪問控制,只允許從DNS進行區域傳送。
c.需要注意系統時間需要同步,這樣才能保證後續同步操作。
ntpdate命令。
子域配置:
(1)正向解析區域授權子域:
只需要在上級域中添加子域的NS記錄以及對應的A記錄即可。
子域名稱 IN NS 子域域名服務器的FQDN
子域服務器FQDN IN A NS_IP
例:
ops.grub2.com. IN NS ns1.ops.grub2.com.
ns1.ops.grub2.com. IN A 172.18.31.9
注意:如果子域有主從等多臺服務器,需要在上級域中記錄多條。
(2)子域服務器配置
正常配置屬於此子域的主機或其子域即可。
定義轉發:
當客戶端從子域DNS服務器查詢父域中定義的域名條目時,由於子域中沒有相關記錄,所以子域DNS默認會去根域服務器遞歸查詢,而這樣做顯然沒有必要。比如,客戶端向ops.grub2.com的域服務器請求"www.grub2.com"域名對應IP地址。
當本地查詢不到條目時,設置轉發到其他特定服務器。
注意!只有允許遞歸查詢的客戶端請求才會被轉發。參照下面訪問控制指令。
區域轉發
僅轉發某特定區域的解析請求
zone "ZONE_NAME" IN {
type forward;
forward first|only;
forwarders { SEREVER_IP; ... };
};
first:首先轉發。服務器不響應時,再去迭代查詢
only:只轉發。
全局轉發
凡本地未定義區域,全部轉發給其他服務器。
在/etc/named.conf配置文件的開頭options {}中添加
forward only|first;
forwarders { SERVER_IP; ... };
bind安全相關配置:
acl:
訪問控制列表
將1個或多個地址歸併爲一個集合,通過集合對集合中所有地址進行統一調用。
由於acl只能先定義再使用,所以建議放到配置文件最前端。
在主配置文件/etc/named.conf最前端定義:
acl ACL_NAME {
IP;
NET/PRELEN;
};
注意:網段只支持"/數字"的格式
如:
acl localnet {
172.18.31.0/24;
127.0.0.0/8;
172.18.30.7;
};
內置acl:
none:空
any:任意
local:本機
localnet:本機IP所屬的網路
訪問控制指令:
在主配置文件中options { };中進行配置。
allow-query { };
允許查詢的主機,白名單
allow-transfer { };
允許向哪些主機做區域傳送,默認爲所有主機,建議設置爲僅允許從DNS服務器。
allow-recursion { };
允許哪些主機可以向當前DNS服務器發起遞歸查詢請求,默認允許所有主機。
使用時記得先註銷掉options{};中"recursion yes;"條目,此條目表示爲所有主機發起遞歸查詢。
allow-update { };
DDNS,允許動態更新區域數據庫文件內容。
bind view
智能DNS。對不同來源的客戶端解析爲不同的IP地址。CDN就是利用這種原理。
view VIEW_NAME {
zone
zone
...
};
如:
view internal {
match-clients { 172.18.0.0/8; };
zone "grub2.com" IN {
type master;
file "grub2.com/internal";
};
};
view external {
match-clients { any; };
zone "grub2.com" IN {
type master;
file grub2.com/external";
};
};
注意:view條目是從上到下匹配的,所以,應該將小範圍view放到前面。