1. 程式人生 > >DNS-bind

DNS-bind

dns 基本原理 bind

DNS:Domain Name Service 應用層協議,采用C/S構架

使用端口53/udp用於地址解析, 53/tcp用於主從同步,953/tcp用於rndc(remove netservice domain controler)

DNS名稱解析name resolving FQDN<--->IP

nsswitch名稱解析framework

技術分享

使用本地stub resolver 讀取配置文件/etc/nsswitch.conf,通過庫調用讀取本地是否有對應記錄,沒有則通過庫調用執行dns解析。

本地hosts文件結構

IPADDR FQDN Ailases

域名結構

根域

一級域名: Top Level Domain: tld

com, edu, mil, gov, net, org, int,arpa

三類:組織域、國家域(.cn, .ca, .hk, .tw)、 反向域

二級域名

三級域名

最多127級域名

一條域名的解析過程:

技術分享

首先查找本地/etc/hosts是否有記錄,有則使用本地記錄(可以修改優先級),沒有找到則向本地DNS服務器發送請求,服務器,首先查詢自己緩存,緩存中有直接返回值,沒有則向根域名服務器發送請求(對於DNS服務器只是單向的,自頂而下,不知上級域名服務器是哪一個,但是都有根服務器的地址),根返回(這裏是com)服務器中一個,本地NS繼續向com服務器發送域名解析查詢,域名服務器返回目標服務器NSIP(如果存在),本地NS繼續向目標NS服務器發送域名解析查詢,目標NS返回查詢結果,本地NS服務器把記錄加入緩存。

叠代查詢:對於local-NS而言,它所工作方式就是叠代查詢,每次NS向不同服務服務器發送請求並返回結果;

遞歸查詢:對於client而言,它的查詢就是遞歸的,它把請求給local ns,等待ns返回結果;

技術分享

1.Bind中的socket采用的是epoll模型

2.Bind業務處理主要要關註一個run函數和isc_app_run函數

3.Bind運行主要是兩個線程和一個do while循環

main() {
     ...
     setup();//初始化工作
           / * Start things running and then wait for a shutdown request or reload. */
     do { result = isc_app_run(); //啟動APP
          if (result == ISC_R_RELOAD) { 
                ns_server_reloadwanted(ns_g_server); //如果重啟加載
         } else if (result != ISC_R_SUCCESS) {
                                              ...
                               result = ISC_R_SUCCESS; } }
                              while (result != ISC_R_SUCCESS);
                               ...}


  1. 在setup函數裏初始化配置相關,比較龐雜,這裏主要關註create_managers裏,有兩個重要的函數isc_taskmgr_createisc_socketmgr_create2這兩個函數分別起兩個線程,分別是run和watcher。分別處理任務隊列。和監聽socket管理相關。

  2. 這個do while循環,主要是result = isc_app_run();這個函數實際上等待各種結束程序信號,處理業務,如果需要重啟服務調用ns_server_reloadwanted。

  3. run主要執行的代碼是dispatch(manager),dispath主要執行的是(event->ev_action)( (isc_task_t *)task,event);處理事件相關

  4. watch主要執行的代碼是result = watch_fd(manager, fd, msg);在watch_fd中,關鍵代碼是epoll_ctl(manager->epoll_fd, EPOLL_CTL_ADD, fd, &event),這裏重新註冊epoll事件,然後epoll_wait再等待,而後再處理,如此反復。

DNS主從

主DNS服務器

從DNS服務器

緩存DNS服務器(轉發器)

主DNS服務器:管理和維護所負責解析的域內解析庫的服務器

從DNS服務器:從主服務器或從服務器“復制”(區域傳輸)解析庫副本

序列號:解析庫版本號,主服務器解析庫變化時,其序列遞增

刷新時間間隔:從服務器從主服務器請求同步解析的時間間隔

重試時間間隔:從服務器請求同步失敗時,再次嘗試時間間隔

過期時長:從服務器聯系不到主服務器時,多久後停止服務

“通知”機制:主服務器解析庫發生變化時,會主動通知從服務器


1在配置文件定時同步間隔時間refresh time同步

2修改文件後,使用rndc -c 從服務器key文件 notify,通知從更新需要同步

區域傳輸:

完全傳輸axfr:傳送整個解析庫

增量傳輸ixfr:傳遞解析庫變化的那部分內容


bind berkely Internet name domain

資源記錄:

技術分享

域domain和區域zone

domain 邏輯概念

zone 物理概念

主main

從slave

提示區hint(定義根)

轉發區forward(直接定義到哪裏找)

主配置文件和區域數據文件配置

主配置文件 /etc/named.conf

區域數據文件 /var/named/

option {
        diretory   "/var/named" ;
};
zone "." IN  {
        type hint;     
        file "named.ca"; #數據文件位置,相對於前面定義目錄的位置
};
zone "magedu.com." IN  {
        type slave;     #slave需要定義主服務器地址
        file "xx.db";
        master {master1_ip;master2_ip; };
};

最基本的一個named.conf配置文件

options {
        directory   "/var/named" ;
};
zone "." IN  {
        type hint;
        file "named.ca";
};
zone "localhost" IN {
        type master;
        file "named.localhost";
};
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "med.loopback";
};

檢查配置文件

[[email protected] ~]# chmod 640 /etc/named.conf
[[email protected] ~]# chown root:named /etc/named
named/               named.iscdlv.key     named.root.key       
named.conf           named.rfc1912.zones 
[[email protected] ~]# chown root:named /etc/named.conf
[[email protected] ~]# ls -l /etc/named.conf
-rw-r-----. 1 root named 233 Jul 28 17:46 /etc/named.conf
[[email protected] ~]# named-checkconf
/etc/named.conf:2: unknown option ‘option‘

少了個s修改配置文件

[[email protected] ~]# named-checkconf
[[email protected] ~]# named-checkzone "." /var/named/named.ca
zone ./IN: has 0 SOA records
zone ./IN: not loaded due to errors.  
[[email protected] ~]# named-checkzone "0.0.127.in-addr.arpa" /var/named/named.loopback
zone 0.0.127.in-addr.arpa/IN: loaded serial 0
OK

錯誤日誌位置/var/log/messages

Jul 28 17:36:56 localhost systemd: Started Generate rndc key for BIND (DNS).
Jul 28 17:36:56 localhost systemd: Starting Berkeley Internet Name Domain (DNS)...
Jul 28 17:36:57 localhost bash: zone localhost/IN: loaded serial 0
Jul 28 17:36:57 localhost bash: zone 0.0.127.in-addr.arpa/IN: loading from master file med.loopback failed: file not found
Jul 28 17:36:57 localhost bash: zone 0.0.127.in-addr.arpa/IN: not loaded due to errors.
Jul 28 17:36:57 localhost bash: _default/0.0.127.in-addr.arpa/IN: file not found
Jul 28 17:36:57 localhost systemd: named.service: control process exited, code=exited status=1
Jul 28 17:36:57 localhost systemd: Failed to start Berkeley Internet Name Domain (DNS).
Jul 28 17:36:57 localhost systemd: Unit named.service entered failed state.
Jul 28 17:36:57 localhost systemd: named.service failed.
named-checkconfig#只檢查語法錯誤,不檢查邏輯錯誤,重啟服務時候,就會反應出來,這裏file有個文件名寫錯了

在主配置文件中定義zone,在/var/named/下創建對應文件名的zone文件:

$TTL 600
magedu.com.(或者用@) IN SOA ns1.nmagedu.com.(NS) mail.magedu.com. (
                              20170727
                              2H 同步 間隔
                              5M 重試時間
                              2D expiretime
                              6H 緩存時間)
(與上面相同可省)  IN NS ns1(後面可省與域相同) 
                  IN MX 10 mail
   ns1           IN  A   172.16.253.116
mail               IN A  172
www            IN  A      172
WWW               IN A 172
ftp            IN CNAME www

反向區域 必須寫完整FQDN

$TTL 600
0.0.172.in-addr.arpa(或者@)              IN SOA ns1.nmagedu.com.(NS) mail.magedu.com. (
                              20170727
                              2H 同步 間隔
                              5M 重試時間
                              2D expiretime
                              6H 緩存時間)
(與上面相同可省)  IN NS ns1magedu.com.
                  IN MX 10 mail
1          IN  PTR  ns1.magedu.com
1               IN PTR  www.magedu.com.


本文出自 “庭前夜末空看雪” 博客,請務必保留此出處http://12550795.blog.51cto.com/12540795/1958375

DNS-bind