bind早期是有伯克利維護,後來交給了ISC進行維護,官方站點www.isc.org
在linux主機上提供可供選擇的域名解析機制,在/etc/nssswitch.conf文件提供了域名解析的平臺,裏面可以定義多重解析域名的方法以及本主機採用優先採用哪種域名解析方法。
hosts: files dns
其中files表示優先使用本地hosts文件來解析域名
dns表示其次使用dns服務來解析域名,這兩者的順序即表示他們使用時的優先級
而在/usr/lib64目錄下有以下三口庫文件可以實現域名解析:
libnss_files.so.2
libnss_dns.so.2
libnss_nis.so.2
接下來就是主要講解DNS的簡單介紹和一些基礎配置。
DNS系統在全球有13個根節點服務器,分佈在不同的地區,美國居多。
FQDN:叫做完全主機名,例如www.lw.com.
DNS系統的分佈式架構:
根(.)
頂級域名(如.com表示商業性質的域名;.org表示一些國際組織的域名;如.net;.edu;等等,這些按照不通電功能或地區來劃分的),頂級域名也可以稱爲一級域名。
二級域名:是一般公司或(個人用的。(一般對公司來說是較重要的,設計到業務的運轉)
DNS查詢方式:
遞歸查詢:只需要自己發送一次查詢請求,求他的解析請求都交給自己直接上層來進行查詢。
迭代查詢:每一次都需要自己來進行查詢,得到最終結果
一般情況下一個主機的查詢過程實際上是先遞歸、後迭代,而在DNS服務器之間的查詢被稱爲遞歸查詢。
DNS服務器的功能:一般只負責自己管轄域內的地址解析,如果要替不屬於自己域內的主機進行解析查找其他域內的主機,是需要開啓相應的功能的。
注意:正反向解析是兩個不同的名稱空間,可以或不使用同一個服務器來提供正反向解析
緩存dns服務器 :不負責解析域,只用來查找本域內的主機
轉發dns服務器 :用來爲指定的區域內的請求進行轉發請求的服務器,必須開始允許遞歸的功能。
主dns服務器:維護所負責的域內的主機地址解析的服務器,解析庫有管理員維護
從dns服務器:從主dns服務器或其他的從dns服務器那裏“複製”一份解析庫(被稱爲區域傳送)
serial序列號:解析庫的版本號。前提:任何時候主服務器解析庫發生變化,其序列號應該遞增,這個序列號是管理員手動修改的
refresh刷新時間:從服務器向主服務器請求同步解析庫的時間間隔
retry重試時間:從服務器向主服務器請求同步但失敗後再次發出同步請求的時間間隔
expire過期時長:從服務器始終聯繫不到主服務器時,多久後放棄從服務器角色,停止提供服務的時長
否定應答時間TTL:表示本服務器明確所查找的主機自己不負責的時候未來多久時間內不要在想自己發送請求解析的請求。
“通知”機制:指的是主服務器在解析庫發送變化時主動向從服務器發出通知,從而讓從服務器來進行解析庫的同步
區域傳送:
全量傳送:傳送整個解析庫
增量傳送:只傳送解析庫中變化的內容
DNS:
domain:
正向:FQDN-->IP
反向: IP-->FQDN
FQDN:full qualified domain name 完全主機域名
例如www.lipengwei.com.(。是不能省略的)
一次完整的查詢請求經過的流程:
client--》hosts文件--》DNS service
local cache --》DNS server(recursion遞歸)--》server cache --》iteration(迭代)--》
解析答案:
肯定答案:明確知道自己能夠找主機的對應的ip地址。
否定答案:請求的條目不存在等原因導致無法返回結果的答案。
權威答案:只要是自己的直接上級返回的答案都是權威答案。
非權威答案:通過其他(非直接上級)返回的答案都是非權威答案。
主從服務器同步分爲:全部同步數據、增量數據同步數據
資源記錄:resource record(rr)
資源記錄類型:resource record type
區域解析庫:由衆多RR組成
SOA :start of authority,起始授權記錄,一個區域只能有一個SOA記錄,SOA還必須是第一條記錄
NS:name server,名稱服務器,專用於表明當前區域的dns服務器
CNAME:別名記錄
MX:mail exchanger.郵件交換器
A: FQDN-->IPv4
AAAA: FQDN-->IPv6
PTR:pointer,指針,進行反向解析,ip--》FQDN
資源記錄定義的格式:
通用語法格式:name 【TTL】 IN rr_type value
注意:
(1)TTL可以從全局繼承
(2)@可用於引用當前區域的名字
(3)同一個名字可以通過多條記錄定義多個不同的值,此時會以輪詢方式解析相應(這就是簡單的實現DNS輪詢方式實現負載均衡)
(4)同一個值也可能有多個不同的定義名字,通過多個不同的名字定義同一個值(僅表示可以通過不同的名找到同一個主機)
SOA:
name:當前區域的名字。如“lipengwei.com”
value:有多部分組成
(1)當前區域的主DNS服務器的FQDN,也可以使用當前區域的名字
(2)當前區域管理員的郵箱地址:但地址中不能使用“ @”,要使用。代替
(3)主從服務器協調屬性的定義以及否定答案的統一的TTL
例如:
lipengwei.com ttl IN SOA ns.lipengwei.com。 adminmail。lipengwei.com (
2015091401 //序列號,最多10位數
刷新時間
重試時間
過期時間
否定ttl值
);
注意:這value的值可以是當前區域名( @)或者使用在上級DNS服務器上填寫的主DNS服務器名
NS:
name :當前區域的名字
value:當前區域內的某個dns服務器的名字,如ns.lipengwei.com.
注意:一個區域可以有多個NS記錄
例如:
lipengwei.com. IN NS ns1.lipengwei.com.
lipengwei.com. IN NS ns2.lipengwei.com。
注意:
1、相鄰的兩個資源記錄name相同時,後續的可省略
2、對NS記錄而言,任何一個NS記錄後面的服務器名字,都應該有與之對應的A記錄
MX:
name:當前區域的名字
value:當前區域內的某個郵件服務器的主機名
注意:一個區域內可以有多高MX記錄,但每個記錄的value之間都應該有0-99的數字來表示其優先級,數字越小,優先級越高
例如:
lipengwei.com. IN MX 19 mx1.lipengwei.com.
IN MX 29 mx2.lipengwei.com.
注意:對MX記錄而言,任何一個mx記錄後面的服務器名字,都應該有一條與之對應的A記錄
A:FQDN-->IP
name:某主機的FQDN,如www.lipengwei.com。
value:主機名對應的ip地址
例如:
www.lipengwei.com. IN A 1.1.1.1
www.lipengwei.com. IN A 1.1.1.2
mx1lipengwei.com. IN A 1.1.1.3
mx2lipengwei.com. IN A 1.1.1.3
注意:
*.lipengwei.com. IN A 1.1.1.4
lipengwei.com. IN A 1.1.1.4(在用戶只輸入域名時也可以解析至特定的主機)
用來避免用戶寫錯名稱是給錯誤答案,可通過泛域名解析進行解析到某個特定主機
AAAA:
name:FQDN
value:IPv6
PTR:
name:ip地址,有特定格式,把ip地址反過來寫,有特定後綴in-addr.rapa.
如:
ip地址是1.2.3.4,寫法是4.3.2.1.in-addr.arpa。
4 IN PTR www.lipengwei.com.
注意:網絡地址以及後綴可省略,主機地址依然要反着寫
CNAME:
name :別名的FQDN
value:正式FQDN
例如:
web.lipengwei.com. IN CNAME www.lipengwei.com.
子域授權:每個域的名稱服務器,都是通過其上級名稱服務器在解析庫中進行授權。所謂的子域授權其實是
爲了分擔上級域的服務器的解析壓力而進行的分割數據,使其一部分解析功能交給其子域來完成解析而採取的一種
分佈式實現的方法。例如對正向區域的子域授權,只需要在其解析庫中添加子域信息的NS記錄和A記錄即可。(反向區域的子域授權比較困難,很少這麼做)
注意:只要父域在上級DNS服務器註冊過,但是其子域是不需要再註冊的。
例如:lpw.com.在。com。的名稱服務器上,解析庫中添加資源記錄
$TTL 1d
@ IN SOA @ admin.lpw.com (
2015091502
1H
5M
3D
3D )
IN NS ns1.lpw.com.
ns1.lpw.com. IN A 172.16.1.112
www IN A 172.16.1.112
ftp IN CNAME www
aps.lpw.com. IN NS nt1.aps.lpw.com.
aps.lpw.com. IN NS nt2.aps.lpw.com.
nt1.aps.lpw.com. IN A 172.16.1.110
nt2.aps.lpw.com. IN A 172.16.1.119
* IN A 172.16.1.112
這些記錄被稱爲glue record:也稱做粘合記錄
下面是bind程序包的組成以及配置實例:
安裝包:
bind包
bind-util包
bind-chroot包
而程序名字是named
bind的服務腳本:/etc/rc.d/init.d/named
主配置文件:/etc/named.conf,/etc/named/rfc1912.zones,/etc/rndc.key
解析庫文件:/var/named/ZONE.ZONE
注意:
1、一臺物理物理服務器可以同時爲多個區域提供域名解析
2、必須要有根區域文件,/var/named/named.ca
3、應該有兩個(如果包括ipv6的,應該更多)實現localhost和本地迴環地址解析的解析庫:/var/named/named.localhost,/var/named/named.loopback
rndc:romote name domain controller,默認與bind安裝在同一主機,且只能通過127.0.0.1來與named進程進行通信,tcp/953
主配置文件:
全局配置:options{};
日誌子系統配置:logging{};
區域定義:本機能夠爲哪些zone進行解析,就要定義哪些zone:
zone “zone_name” IN {}
注意:任何服務程序如果期望能夠通過網絡被其他主機訪問,則需要至少監聽在一個能與外部通信的ip地址上
配置緩存名稱服務器的配置:
1.只需要監聽本地能與外部通信的外部地址即可
2、allow-query 改爲 “any”
dnssec:dns secure :現代互聯網爲了避免dns被***和污染,使用了dns secure機制,需要每次對解析請求進行驗證
在不是嚴格要求使用的時候可以禁用該項及其key相關配置
建議:禁用dnssec
recursion 表示是否允許遞歸
主DNS名稱服務器配置:(在頭部定義的$ORIGIN VALUE 可以用來代替下面配置中省略的部分)
1步、在主配置文件中定義區域
zone "zone_name" IN {
type {master|slave|hint|forword};
file "zone_name.zone";
};
2步、定義區域解析庫文件(每一個區域對應一個其區域解析庫文件)
@ IN SOA ns1.lpw.com. admin.lpw.com (
2015091501
1h
5m
7d
1d )
IN NS ns1.lpw.com.
IN NS ns2.lpw.com.
IN MX mx1.lpw.com.
IN MX mx2.lpw.com.
ns1.lpw.com. IN A 172.16.1.108
ns2 IN A 172.16.1.108
mx1 IN A 172.16.1.11
mx2 IN A 172.16.1.12
ns1.lpw.com. IN A 172.16.1.108
3步、修改區域解析庫文件的權限和屬組(爲了安全起見)
反向區域配置:
區域名稱:網絡地址反寫。in-addr.arpa
172.16.100. ---》 100.16.172.in-addr.arpa
第一步:定義區域:
zone "zone_name" IN {
type={hint|master|slave}
}
第二步:定義區域庫文件
注意:不需要MX和A以及AAAA記錄,以PTR記錄爲主
$TTL 1D
$ORIGIN 1.16.172
@ IN SOA ns1.lpw.com. admin.lpw.com. (
2015091601
3h
5m
1d
1d )
IN NS ns1.lpw.com.
IN NS ns2.lpw.com.
112 IN PTR ns1.lpw.com.
112 IN PTR ns2.lpw.com.
112 IN PTR www.lpw.com.
主從複製配置:
問題:啓動新機器的bind時出現
[root@localhost etc]# service named start
Generating /etc/rndc.key:
網上解決辦法:
rndc-confgen -r /dev/urandom -a,重啓named服務即可
註釋:rndc-confgen是rndc的key的管理工具
第一步:新建主機,安裝bind,配置爲緩存dns服務器
第二步:主服務器的區域解析庫文件中必須有一條NS記錄是指向從服務器
修改主master區域項 allow-transfer { 172.16.1.110; };
第三步:從服務器只需要定義區域,而無需提供解析庫文件,解析庫文件應該放置在/var/named/slaves/下面
第四步:主服務得允許從服務器做區域傳送
第五步:主從服務器時間應該同步,可通過ntp進行
第六步:bind程序的版本應該保持一致,否則,應該從高、主低
注意:每次手動修改主DNS服務器區域文件時必須手動更新修改其序列號
rndc:
rndc --> rndc(953/tcp)
使用方法: rndc command
command:
reload:重載主配置文件和區域解析庫文件
reload zone :重載區域解析庫文件
retransfer zone :手動啓動區域傳送過程,而不管序列號
notify zone:重新對區域傳送發通知
reconfig :重載主配置文件
querylog :開啓或關閉查詢日誌功能
trace :遞增debug級別
trace level :指定使用的級別
注意:對於正常工作環境中不應該開啓日誌調試功能,區域文件都是放在內存中的,因此如果開啓querylog功能,就會對每一的查詢都立即記錄日誌到磁盤,增加I/O開銷,增大主機的負荷。所以非調試過程(在生產過程中)不要開啓。
正向解析區域子域方法:
在正向解析庫文件中添加子域的信息(NS和A記錄)
注意:在使用主域查詢子域時dig命令要加+norecurse
定義轉發服務器:
注意:被請求轉發的服務器需要能夠爲請求者做遞歸,否則轉發請求不予處理
(1)全部轉發:凡是對非本機所負責解析的區域的請求,統統轉發給指定的服務器
在options配置項添加兩項:
forward first|only; // first 表示先將請求委託給一個dns服務器來解析,如果他解析不到,則自己再向根請求解析
//only 表示所有的自己解析不了的請求都委託給一個dns服務器來解析,如果他解析不到,就認爲這個請求是解析不到的。
forwarders { ip; };
(2)區域轉發:僅轉發對特定區域的請求至某服務器
zone "zone_name" IN {
type forward;
forward { first|only;};
forwarders { ip;};
};
問題:在做轉發的dns服務器上請求被轉發服務器管轄的主機時報錯,查看/var/log/messages出現
verify failed due to bad signature (keyid=1518): RRSIG validity period has not begun
解決辦法:原因是簽證無效,最終原因是做實驗的兩個虛擬機的時間不一致,同步下時間就行了。
另外重要的一點:關閉dnssec功能:dnssec 是dns secure安全的dns服務器,指的是dns在每一次請求解析時都會要求驗證對方的數字簽名,所以在實驗環境中可能對導致數字簽名無效的錯誤提示從而不能夠解析成功。
dnssec-enable no;
dnssec-validation no;
DNS中的安全相關的配置:
定義acl訪問控制列表:
acl acl_name (
ip1;
ip2;
net/length;
);
bind有四個內置的acl:
none:沒有一個主機
any:任意主機
local:本機
localnet:本機的ip同掩碼運算後得到的網絡地址
注意:acl只能先定義,後使用,因此,其一般定義在配置文件options前面
訪問控制的指令:
allow-query{};允許哪些主機來本機進行查詢的主機名單:白名單
allow-transfer{}:允許進行區域傳送的主機
allow-recursion{} 允許遞歸的主機
allow-update{};允許更新區域數據庫中內容的主機,一般情況下應該不允許任何主機來主動更新服務器解析庫文件內容
bind 的view功能:
視圖:一個bind服務器可定義多個view,每個view中可定義一個或多個zone,在多個view中可定義相同的zone,每一個view用來匹配一組請求的客戶端,多個view內可能需要對同一個區域進行解析,但使用不同的區域解析庫文件,這是DNS可以實現CDN技術的主要原因。
view的設置:
view view_name{
match-clients{};
zone "zone_name" IN {};
};
注意:
(1)一旦啓用了view,所有的zone都只能定義在view中
(2)僅有必要在匹配到允許遞歸請求的客戶端所在的view中定義根區域
(3)客戶端請求到達時,是自上而下檢查每個view所服務的客戶端列表
(4)bind提供的view功能可以實現簡單的CDN的功能。
CDN :content delivery network 內容分發網絡,也叫做智能DNS系統
智能DNS供應商:
如:dnspod和dns。la
編譯安裝bind9
第一步:解壓源碼包
第二步:創建普通用戶named和組named
第三步:./configure --prefix=/usr/local/bind9 --sysconfig=/etc/bind/ --disable-ipv6 --disable-chroot --enable-threads
第四步:將編譯後的可執行程序添加到PATH環境變量中(在/etc/profile.d/下新建named.sh【PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH】)
第五步:設置庫文件(編輯/etc/ld.so.conf.d/named.conf【/usr/local/bind9/lib】),然後重讀此文件,ldconfig
第六步:導出頭文件:ln -sv /usr/local/bind9/include /usr/include/named
第七步:添加man手冊,在/etc/man.config中添加編譯後的man手冊
第八步:手動編輯namd.conf配置文件
監聽tcp|udp的53號端口
udp的53號端口主要用來監聽解析地址的
tcp的53號端口主要是用來主從服務器通信的監聽端口
named程序以root用戶啓動,然後切換至named用戶,
linux上爲了防止系統用戶運行進程被劫持而取得不應該有的權限,通常的做法就有兩個:
1、以系統用戶啓動進程後,切換至普通用戶來運行
2、chroot 來切換運行程序的根目錄
測試命令:dig命令
dig -t type name [@server] [query options]
dig 僅用於測試dns系統,因此,不會查詢hosts文件進行解析
查詢選項:
+[no]trace :跟蹤解析過程
+[no]recurse:進行遞歸解析
測試反向解析:
dig -x ip server
模擬區域傳送
dig -t axfr zone_name @server
例如:dig -t axfr lpw.com @172.16.1.108
注意:dig在查詢時默認是遞歸查詢,可以使用+norecurse
host命令:
host [-t type] name [servcer]
nslookup命令:
交互式查詢
nslookup>
server ip :指明使用哪個dns server來進行查詢
set q=rr_type:指明查詢哪種類型的資源類型記錄
name:要查詢的名稱