DNS: Domain Name Service
C/S
S: bind bekerley internet
name domain
C: 共享庫
53/udp, 53/tcp
名稱解析:主機名解析
把一種名稱轉換爲另一種名稱的過程
名稱:字串、數字
解析庫:某種存儲
username <--> uid
某種存儲:
文本文件
關係型數據庫
LDAP:Lightweight Directory Access Protocol, 389/tcp
解析:根所用戶所提供一種名稱,去查詢解析庫,以得到另一種名稱
hosts: 文本文件
IANA:
文本文件
ftp:--> DNS(中心服務器)
Unix:
向下授權管理機制
根域:root domain
一級域:top-level domain(頂級域)
二級域:公司、組織、個人使用
主機:www
其中根域和頂級域是有inan直接管理分配的
遞歸:
A --> B --> C –> D
A問B;B自己不知道,但B知道C有A要的結果,然後B去找C要結果;但C自己也不知道,但C知道D有A要的結果,然後C去找D要結果;得到結果後逐級上報結果,D給C,C給B,B給A
迭代:
A --> B
A --> C
A –> D
互聯網上是 遞歸 + 迭代的方式,
根結點:全球的根節點一共13個
DNS中的名稱與對應的主機的真實主機名不要求是一樣。這可以實現負載均衡
一個名稱可以對應多個IP
一個IP上也可以多個名稱
DNS名稱解析:
FQDN --> IP正向解析
IP -->
FQDN反向解析。郵件服務器要求必須是反向解析的,負責認爲是垃圾郵箱服務器
反向解析的域名後綴 .in-addr.arpa
一級域:
組織域: .com, .org, .net, .mil軍事組織,
.edu, .gov政府組織, .info, .cc, .me, .tv
國家域:.cn,
.us, .uk, .jp, .tw, .hk, .iq, .ir
反向域:.in-addr.arpa
域:domain是一個邏輯概念,
區域:zone是一個物理概念,任何一個解析庫都叫做一個區域,故一個域有2個區域,但並不是域包含區域,層級不同。
正向解析:FQDN --> IP
正向解析庫 從物理概念來講是個文件
反向解析:IP
--> FQDN
反向解析庫 從物理概念來講也是個文件
區域解析庫:
資源記錄:rr(resource record) 每一行的條目,用來標記不同的身份
有類型的概念:用於標記此記錄解析的屬性
SOA:
Start Of Authority, 起始授權記錄,一個區域文件只能有一個,標記這個NS服務器區域由誰來管理;
NS:Name Server名稱服務器,可以有多個
MX:
Mail eXchange, 郵件交換器,MX記錄有優先級屬性(0-99);
A:FQDN -->
IP,專用於正向解析庫
PTR: IP --> FQDN,專用於反向解析庫
AAAA:FQDN --> IPv6,專用於正向解析庫
CNAME: Canonical
Name,正式名稱
DNS查詢:
遞歸
迭代
hosts --> local dns cache --> dns server (cache) --> 迭代
非權威應答:通過緩存,未必準確
客戶端要接入互聯網就要給其DNS指向,linux是在/etc/resolv.conf裏面用nameserver配置指向DNS服務器的,可以有多個,一般只有第一個生效,在第一個出問題後第二個才生效
DNS服務器類型:
主DNS服務器
從DNS服務器
緩存服務器:只負責一半的任務,不用註冊,只管出去迭代,而不給外部解析本地。
解析庫文件同步的過程:區域傳送 (單方向傳送)
zone transfer
完全區域傳送:axfr
增量區域傳送: ixfr
週期性檢查 + 通知
子域授權:
爲什麼要創建子域呢?比如在一個大公司中申請了一個域名,但公司有上百臺主機,而且每個不同的部門要求自我獨立互不影響,此時一個域管理起來就很困難了,所以在這個域下劃分幾個子域來實現更好的管理。
正向子域授權:
只需要在父域的區域解析庫中添加“膠水記錄”, glue record
子域名稱 IN NS
子域的名稱服務器,注意每個子域可能有主從多臺服務器,此時用ns,ns2,ns3,……。
ops IN
NS ns.ops
ns.ops IN A 172.16.100.77
子域和父域不一定在同一網段下,只要2個能夠通信即可。例如,這裏用父域172.16.249.191;子域是192.168.1.199。
先編輯/var/named/mageedu.com.zone加入我們所需的條目
重新載入# rndc reload
本地測試# dig -t NS ops.mageedu.com @172.16.249.191
我們做完全區域傳送看下# dig -t AXFR mageedu.com @172.16.249.191
接下來我們建立子域服務器:我們子域的地址是:192.168.1.199
進入我們所在主機,安裝bind後 在# vim /etc/named.conf中把不方便我們實驗的東西註釋掉;然後直接啓動named,由於是第一次安裝啓動bind,所有啓動是生成/etc/rndc.key會慢些。完成後,編輯# vim /etc/named.rfc1912.zones文件,定義新的區域:zone “ops.mageedu.com” IN {
type master;
file “ops.mageedu.com.zone”;
};
配置好後,本地測試# dig -t A mail.ops.mageedu.com @192.168.1.199
而後去父節點測試# dig -t NS ops.mageedu.com @172.16.249.191
配置轉發器:
# vim /etc/named.conf配置
加入允許遞歸項和轉發對象:172.16.249.191就當前而言就是父域的服務器。
# named-checkconf
# rndc reconfig重讀配置文件
# dig -t A www.mageedu.com @192.168.1.199解析mageedu.com域
也可以轉發某個或某些特定的區域給上層DNS服務器;配置轉發器:
首先改變/etc/named.conf的配置,然後清空緩存#rndc flush
配置#vim /etc/named.rfc1912.zones文件
檢查
此時想解析# dig -t A www.sohu.com就解析不了了
編譯安裝
首先得到所需的bind源代碼,此處以bind-9.9.5爲例,解壓後cd到bind-9.9.5下
確保系統用戶named的存在,不存在則添加之。
# ./configure --prefix=/usr/local/bind9.9.5 --sysconfdir=/etc/named/ --enable-threads --disable-chroot --disable-ipv6
# make && make install。
# vim /etc/profile.d/bind.sh
提供主配置文件/etc/named/named.conf
爲根及localhost提供區域解析庫
# dig -t NS . @a.root-servers.net > /var/named/named.ca
# named-checkconfig
# named -g -u named -c /etc/named/named.conf
# named -u named
、提供rndc
# rndc-confgen -r /dev/urandom > /etc/named/rndc.conf
# chown root:named /etc/named/rndc.conf
# chmod 440
/etc/named/rndc.conf
把rndc.conf中的後半段複製到named.conf中,並啓用之;
提供腳本
#!/bin/bash
#
#
description: named daemon
# chkconfig: - 25 80
#
pidFile=/usr/local/bind9/var/run/named.pid
lockFile=/var/lock/subsys/named
confFile=/etc/named/named.conf
[ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
start() {
if [ -e $lockFile ]; then
echo "named is already running..."
exit 0
fi
echo -n "Starting named:"
daemon
--pidfile "$pidFile" /usr/local/bind9/sbin/named -u named -c "$confFile"
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
touch $lockFile
return $RETVAL
else
rm -f $lockFile
$pidFile
return 1
fi
}
stop() {
if [ ! -e $lockFile ]; then
echo "named is stopped."
# exit 0
fi
echo -n "Stopping named:"
killproc named
RETVAL=$?
echo
if [ $RETVAL -eq 0 ];then
rm
-f $lockFile $pidFile
return 0
else
echo "Cannot stop
named."
failure
return 1
fi
}
restart() {
stop
sleep 2
start
}
reload() {
echo -n "Reloading named:
"
killproc named -HUP
#killall
-HUP named
RETVAL=$?
echo
return $RETVAL
}
status() {
if pidof named &>
/dev/null; then
echo -n "named is running..."
success
echo
else
echo -n "named is
stopped..."
success
echo
fi
}
usage() {
echo "Usage: named
{start|stop|restart|status|reload}"
}
case $1 in
start)
start ;;
stop)
stop ;;
restart)
restart ;;
status)
status ;;
reload)
reload ;;
*)
usage
exit 4
;;
esac