1.簡介
域名系統(英文:Domain Name System,縮寫:DNS)是因特網使用的命名系統,用來把便於人們使用的機器名字轉換成為IP地址 即解決的是IP地址和域名的映射問題。
DNS是多層命名服務器構成的分布式數據庫,屬於應用層協議,DNS使用TCP和UDP端口53。
當前,對於每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符,是Internet的核心功能。
DNS系統是由各式各樣的DNS軟件所驅動的,包括:
- BIND(Berkeley Internet Name Domain),這是應用最廣的DNS軟件.
- DJBDNS(Dan J Bernstein's DNS implementation)
- MaraDNS
- NSD(Name Server Daemon)
- PowerDNS
2.請求方式
迭代查詢:LocalDNS服務器只告訴客戶機另外一台DNS服務器的地址,讓客戶機自己去循環查詢結果。
遞歸查詢:委托給LocalDNS服務器去查詢,LocalDNS服務器直接返回結果給客戶機,一般DNS解析都是用遞歸查詢的方法。
3.域名解析過程
- 先檢查瀏覽器的緩存 看有沒有對應解析過的ip
- 查看本地的hosts文件
- 向本地指向的dns服務器 發起域名解析請求 看看有沒有緩存
- 沒有的話就向根dns服務器發起請求
- 根服務器回返回給頂級域名服務器的地址
- 本地服務器去向頂級域名服務器請求
- 頂級域名解析服務器會返回注冊的域名服務器
- 本地服務器再去向注冊的域名服務器發起域名解析請求
- 返回解析出來的ip
- 本地域名服務器再返回給客戶端
4.DNS資源記錄
DNS 區域采用資源記錄的形式存儲信息。每條資源記錄均具有一個類型 , 表明其保留的數據類型。
- A : 名稱至 IPv4 地址
- AAAA : 名稱至 IPv6 地址
- CNAME : 名稱至 ”規范名稱 “ ( 包含 A/AAAA 記錄的另一個名稱 )
- PTR : IPv4/IPv6 地址至名稱
- MX : 用於名稱的郵件交換器 ( 向何處發送其電子郵件 )
- NS :域名的名稱服務器
- SOA:“授權起始”, DNS 區域的信息 ( 管理信息 )
SOA詳解:
$ORIGIN .
$TTL 3600 ; 1 hour
txt.com IN SOA ns.txt.com. mail.txt.com. (
2 ; serial
28800 ; refresh (8 hours)
3600 ; retry (1 hour)
604800 ; expire (1 week)
1800 ; minimum (30 minutes)
)
Serial:
數值Serial代表這個Zone的序列號,作用:供Slave DNS判斷是否從Master DNS獲取新數據,每次Zone文件更新,都需要修改Serial數位. RFC19122.2建議的格式為YYYYMMDDnn其nn為修訂號;表示在某年(YYYY)、月(MM)、日(DD)進行了第幾次(nn)修改
Refresh:
數值Refresh設置Slave DNS多長時間與Master DNS進行核對Serial核對,目前bind的notify參數可以設置每次Master DNS更新都會主動通知Slave DNS更新,Refresh參數主要用於notify參數關閉時。
Retry:
數值Retry設置當Slave DNS試圖獲取Master DNS Serial時,如果Master DNS未響應,多長時間重新進行檢查。
Expire:
數值Expire將決定Slave DNS在沒有Master DNS的情況下權威的提供域名解析服務的時間長短。
Minimum:
在8.2版本之前,由於沒有獨立的STTL指令,所以通過SOA最后一個字段來實現,但由於BIND. 8.2后出現了STTL 指令,該部分功能就不再由SOA的最后一個字段來負責,由STTL全權負責.SOA的最后一個字段專門負責negative answer (negative caching)
5.DNS排錯
它顯示來自 DNS 查找的詳細信息 , 其中包括為什么查詢失敗 :
- NOERROR : 查詢成功
- NXDOMAIN : DNS 服務器提示不存在這樣的名稱
- SERVFAIL : DNS 服務器停機或 DNSSEC 響應驗證失敗
- REFUSED : DNS 服務器拒絕回答 ( 也許是出於訪問控制原因 )
6.源碼方式安裝
本文章所使用的系統環境為 Centos 7.5 操作系統,安裝的是bind-9.16.3版本
6.1創建非特權用戶named
[root@localhost ~]# cat /etc/group //查看是否存在named組
[root@localhost ~]# groupadd -g 53 named
[root@localhost ~]# cat /etc/passwd //查看是否存在named用戶
[root@localhost ~]# useradd -M -s /sbin/nologin -g named named
6.2安裝依賴包
[root@localhost ~]# yum -y install libcap libcap-devel libuv libuv-devel openssl-devel
6.3上傳安裝包並檢查安裝包信息
[root@localhost ~]# ls
anaconda-ks.cfg bind-9.16.3.tar.xz initial-setup-ks.cfg epel-release-latest-7.noarch.rpm
[root@localhost ~]# md5sum bind-9.16.3.tar.xz
2b207d5699d7acb0a2e997b7cd53d9c2 bind-9.16.3.tar.xz
為了確保BIND將構建dnssec-keymgr,以root用戶身份安裝python模塊:
[root@localhost ~]# yum -y install python36 python36-devel
[root@localhost ~]# pip3 install ply -i https://mirrors.aliyun.com/pypi/simple/
6.4解壓安裝包
[root@localhost ~]# tar xf bind-9.16.3.tar.xz
6.5進入到解壓文件中進行配置編譯
[root@localhost ~]# cd bind-9.16.3/
[root@localhost bind-9.16.3]# ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named --localstatedir=/var --with-libtool --disable-chroot --disable-static
[root@localhost bind-9.16.3]# echo $?
0
[root@localhost bind-9.16.3]# make && make install
[root@localhost bind-9.16.3]# echo $?
0
6.6安裝完成之后配置rndc和named.conf主配置文件
[root@localhost ~]# cd /usr/local/bind9/sbin/
[root@localhost sbin]# ./rndc-confgen > /etc/named/rndc.conf
[root@localhost ~]# cd /etc/named/
[root@localhost named]# tail -10 rndc.conf | head -9 | sed -e s/#\ //g > named.conf
[root@localhost ~]# vim /etc/named/named.conf
options {
directory "/var/named";
pid-file "/var/named/named.pid";
dump-file "/var/named/cache_dunmp.db";
statistics-file "/var/named/named_stats.txt";
version none;
hostname none;
recursion yes;
allow-query { any; };
listen-on port 53 { any; };
querylog yes;
max-cache-size 0M;
};
logging {
channel query_syslog { syslog local3; severity info; print-time yes; };
channel query_log {
file "/var/dnslog/query.log" versions 5 size 500m;
print-time yes;
severity info;
};
category queries { query_log;};
channel general_log {
file "/var/dnslog/general_log" versions 5 size 500m;
print-time yes;
print-category yes;
print-severity yes;
severity info;
};
category default { general_log; };
category general { general_log; };
};
創建域名記錄存放的目錄並修改權限
[root@localhost ~]# mkdir -p /var/named
[root@localhost ~]# chown root:named /var/named/
[root@localhost ~]# chmod 770 /var/named/
創建DNS日志存放目錄並修改權限
[root@localhost ~]# mkdir -p /var/dnslog
[root@localhost ~]# chown root:named /var/dnslog/
[root@localhost ~]# chmod 770 /var/dnslog/
修改配置文件的權限
[root@localhost ~]# chmod 640 /etc/named/*
[root@localhost ~]# chown root:named /etc/named/*
使用named用戶啟動服務並查看是否成功
[root@localhost ~]# /usr/local/bind9/sbin/named -4u named -c /etc/named/named.conf
[root@localhost ~]# ps xua |grep bind
rpc 679 0.0 0.0 69220 1056 ? Ss 13:25 0:00 /sbin/rpcbind -w
named 59934 0.0 0.8 236140 15212 ? Ssl 16:15 0:00 /usr/local/bind9/sbin/named -4u named -c /etc/named/named.conf
root 60043 0.0 0.0 112724 972 pts/0 R+ 16:26 0:00 grep --color=auto bind