• 想用bind9的view功能实现多线路的自动导向,因在新网,申请的域名不支持这样的功能,所以,只好指向到自己的服务器实现该功能。

    实现的步骤:

    有两个域名,假设为:a.net和b.cn两个域名,在a.net中添加dns服务器ns.a.net和ns1.a.net分别指向到我自己的服务器IP上,并且在新网的mydns功能中做两条A记录也分别对应解析到这两个IP上,b.cn的dns服务器也修改到ns.a.net和ns1.a.net上

    两个服务器分别搭建bind9环境,named.conf如下:

    key "rndc-key" {
     algorithm hmac-md5;
     secret "eVlLdn/KBaRN3qZFzgwcFA==";
    };

    controls {
     inet 127.0.0.1 port 953
     allow { 127.0.0.1; } keys { "rndc-key"; };
    };

    options {
     directory "/var/named";
     version "I am bind";
     listen-on {218.58.15.155;127.0.0.1;};
    };

    acl CNCGROUP{58.16.0.0/16;
    58.17.0.0/17;
    58.17.128.0/17;
    58.18.0.0/16;
    58.19.0.0/16;
    58.20.0.0/16;
    58.22.0.0/15;};


    view "internal" {
    match-clients {10.0.0.8/8;};
      recursion yes;
      zone "." {
     type hint;
     file "/var/named/named.ca";
      };
      zone "localhost" IN {
     type master;
     file "/var/named/localhost.zone";
     allow-update { none; };
      };

      zone "0.0.127.in-addr.arpa" {
     type master;
     file "/var/named/named.local";
     allow-update { none; };
      };
    };


    view "cnc" {
      match-clients {CNCGROUP;};
      recursion no;

      zone "b.cn" {
      type master;
      file "/var/named/b.cn.cnc";
      };
    };

    view "other" {
      match-clients {any;};
      recursion no;

      zone "b.cn" {
      type master;
      file "/var/named/b.cn.bind";
      };
    };



    named.ca即从网上下载的最新的named.root

    named.local为:
    $TTL86400
    @ INSOA localhost.root.localhost. (
     42; serial (d. adams)
     1H; refresh
     15M ; retry
     1000H ; expiry
     1H ); minimum

     IN NS localhost.

    1 INPTR localhost.

    localhost.zone为:
    $TTL86400
    $ORIGIN localhost.
    @ 1D IN SOA @ root (
     42; serial (d. adams)
     3H; refresh
     15M ; retry
     1W; expiry
     1D ); minimum

     1D IN NS@
     1D IN A 127.0.0.1


    b.cn.bind为:

    $TTL86400
    $ORIGIN b.cn.
    @ INSOAns.a.net. root.b.cn.(
     1 ; Serial
     3600; Refresh
     900; Retry
     720000; Expire
     3600 ); Minimum
     ;INNSlocalhost.
     INNSns.a.net.
     INNSns1.a.net.
    @ INA 222.14.180.98
    www INA 222.14.180.98
    pic INA 222.14.180.99
    * INA 222.14.180.99

    b.cn.cnc为:
    $TTL86400
    $ORIGIN b.cn.
    @ INSOAns.a.net. root.b.cn.(
     1 ; Serial
     3600; Refresh
     900; Retry
     720000; Expire
     3600 ); Minimum
      ; INNSlocalhost.
     INNSns.a.net.
     INNSns1.a.net.
    @ INA 218.58.15.154
    www INA 218.58.15.154
    pic INA 218.58.15.155
    url INA 218.58.15.156
    * INA 218.58.15.155
  • rpm -ivh bind-9.2.4-2.i386.rpm

    [root@ns01 named]# rpm -q bind
    bind-9.2.4-2

    这样就安装好bind包了。

    参考http://www.5ilinux.com/blog/archives/000063.html 文章

    首先修改

    vi /etc/named.conf

    添加下面内容

    #############################
    zone "." {
    type hint;
    file "named.ca";
    };

    zone "0.0.127.in-addr.arpa" {
    type master;
    file "0.0.127.in-addr.arpa.zone";
    };

    zone "localhost" {
    type master;
    file "localhost.zone";
    };

    zone "5ilinux.com" {
    type master;
    file "5ilinux.com.zone";
    };

    去下载 named.ca 文件,但安装那篇文章里的下载地址无法下载。

    dig @a.root-servers.net > named.ca
    可以产生named.ca , 把 cp named.ca /var/named/named.ca
    通过rpm安装的bind,是没有localhost.zone,可以通过vi来产生一个新的文件
    vi /var/named/localhost.zone
    ##################
    $TTL 86400
    @ IN SOA @ root.localhost (
    1 ; serial
    28800 ; refresh
    7200 ; retry
    604800 ; expire
    86400 ; ttl
    )

    IN NS localhost.

    @ IN A 127.0.0.1
    ####################
    vi /var/named/0.0.127.in-addr.arpa.zone 
    ####################
    N SOA localhost. root.localhost (
    2 ; serial
    28800 ; refresh
    7200 ; retry
    604800 ; expire
    86400 ; ttl
    )
    @ IN NS localhost.

    1 IN PTR localhost.
    1 IN PTR ns1.
    ###################

    vi /var/named/5ilinux.com.zone

    ####

    $TTL 86400
    @ IN SOA ns01.5ilinux.com. root.localhost (
    3 ; serial
    28800 ; refresh
    7200 ; retry
    604800 ; expire
    86400 ; ttl
    )

    @       IN NS ns01.5ilinux.com.

    ns01 IN A 192.168.0.10
    ##################

    /etc/rc.d/iinit.d/named restart

    应该就可以使用了。你可以看一下/etc/resolv.conf

    开始的时候照着那篇文章做,但不行,

      IN NS ns01.5ilinux.com.

    后来改成

    @       IN NS ns01.5ilinux.com.

    就可以使用了

    这就是一个简单的dns配置的过程,够简单。

  • 2005-12-24

    架設 DNS--bind9

    2
    4
    2
    0
    0
    5
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .
    .
    .
    .
    .
    .
    .
    .
    .

     

    前面所介紹的伺服器服務大多是用在內部網路環境中的﹐不過﹐以現代的情況和未來的趨勢來看﹐每個網路或多或少都需要 Internet 連線以及向 Internet 提供服務。從這一章開始﹐我們將為大家陸續介紹一些在 Internet 環境中常用到的伺服器之架設技巧。就算您目前還沒真的需要架設 Internet 相關的伺服器﹐但許多企業的 Intranet 環境中﹐也需要相類似的伺服器來為企業內部網路提供服務。

    前提條件

    在眾多 Internet 伺服器當中﹐有一種服務是所有服務的基礎﹐就是 DNS 服務。DNS 可以說是一個不容易弄清楚的概念﹐尤其是其運作原理。如果您看過“學習網路”中的“ DNS 協定”(我強烈建議您看看這篇文章﹗)﹐相信應該有一定概念了﹐否則﹐您在如下的閱讀中可能難以理解﹐也浪費您的時間。

    無論如何﹐在您進一步閱讀下面文章之前﹐請您先確定能正確回答如下的問題﹕


    什麼是 DNS 的授權模式﹖是怎樣進行的﹖
    請解釋 zone 和 domain 的差別。
    什麼是 DNS 正解和反解﹖
    什麼是 DNS 的查詢模式﹖查詢過程是怎樣進行的﹖
    請解釋 DNS cache 的作用和它對查詢流程的影響。

    如果您未能從上面的聯結網頁找到答案﹐那我再推薦您多看一篇文章﹕


    http://turtle.ee.ncku.edu.tw/~tung/dns/dnsintro.html

    忠告﹕請不必急著知道怎樣設定 DNS﹐花點時間將 DNS 的原理弄明白非常重要﹐尤其是授權模式和查詢模式的正確理解。在日後的 DNS 架設和管理中﹐是否能正確理解這些 DNS 原理﹐往往是成敗的關鍵所在﹗

    如果您在 NT 或 Win2K 下面設定過 DNS 伺服器﹐相信您會覺得在 Linux 下面難多了。除了概念上要比較清楚外﹐另外對檔案的關聯也要有清晰的追蹤能力﹐這對於進行 debug 尤為重要。因為在 Windows 系統上面﹐您的所有設定都透過圖形界面進行﹐方便是方便﹐但也因為這個圖形界面﹐限制了您的設定靈活性﹐同時也阻隔了您對 DNS 系統的深入了解。當您完成了這章的學習﹐而且成功在 Linux 架設出複雜的 DNS 環境之後﹐歡迎您再回到 Win2K 上嘗試做同樣的事情。或許﹐您就會認同我這裡的觀點了...

    好了﹐閒話休提﹑言歸正傳﹐聽百遍不如做一遍﹐那就讓我們開始動手吧﹗

     

    探索 NAMED

    在 Linux 上面﹐提供 DNS 服務的套件是叫 bind﹐ 但執行服務程式名稱則是 named 。請您確定系統上裝有 bind﹑bind-utils﹑以及 caching-nameserver 這幾個套件﹐同時用 ntsysv 確定 named 被選擇為開機服務。

    首先﹐讓我們設定一個最重要的 dns 設定檔﹐它就是 /etc/named.conf 。我將我自己的設定檔案列出來﹐然後逐部份進行解釋﹕

    // generated by named-bootconf.pl

    options {
    directory "/var/named";
    /*
    * If there is a firewall between you and nameservers you want
    * to talk to, you might need to uncomment the query-source
    * directive below. Previous versions of BIND always asked
    * questions using port 53, but BIND 8.1 uses an unprivileged
    * port by default.
    */
    // query-source address * port 53;
    };


    先讓我們了解這個檔案上面用來做註解的符號是“ // ”﹐而不是一般 shell script 的“#”﹔另外﹐“ /* ”與“ */ ”之間則註解一整段文字。同時﹐每一個完整的設定都以“ ﹔”結尾﹐請不要少了它﹗(初學者經常會犯這個錯誤)

    上面的部份是在這個檔案開頭的 options 設定﹐首先用 directory 指定了 named 的資源記錄( RR - Resource Record )檔案目錄所在位置為﹕“/var/named”﹔也就是說﹐它會到這個目錄下面尋找 DNS 記錄檔案。所以﹐我們在這個檔案後面部份所指定的檔案﹐就無需使用絕對路徑了﹐但它們一定要放在這個目錄下面。

    接下來﹐有一段文字﹐如果您仔細閱讀一下﹐它大致是說﹕如果您要設定的 DNS 伺服器和 client 之間是隔著火牆的話﹐要將“// query-source address * port 53;”前面的註解符號“ // ”拿掉(當然﹐您也必須要設定好您的火牆啦)。不過﹐這只對早期的版本有影響﹐而在 bind 8.1 之後則無需擔心這個設定。

    接下來再讓我們看下一段句子﹕

    //
    // a caching only nameserver config
    //
    zone "." IN {
    type hint;
    file "named.ca";
    };


    透過這幾行﹐我們為 named 定義了 DNS 系統中的根區域“ . ”(root zone) 的設定﹐同時它是一個 internet ( IN ) 的區域類別( class )。這裡還指定了root zone 的伺服器種類( type ) 為“hint”(也只有這個 zone 會使用這樣的種類)。最後﹐用 file 指定這個區域記錄檔為﹕“named.ca”﹐也就是“/var/named/named.ca”檔案。雖然 named.ca 這個檔案中的‘ca’是 cache 的意思﹔但如果您了解 DNS 的運作﹐就應該知道這個暫存檔的作用﹐同時﹐為什麼我們會把 root zone 放在這裡。(嗯﹖想想看﹖尤其是查詢非本機區域的時候﹖)

    在 root zone 後面﹐您應該還會看到如下這兩段﹕

    zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
    };

    zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };


    這裡是定義出關於本機名稱的 DNS 解釋﹕第一個 zone 是 localhost 的正解 zone﹐其伺服器種類是 master﹐記錄檔名稱是 localhost.zone (在 /var/named 目錄下面)﹐但這個 zone 不允許客戶主機(或伺服器)自行更新 DNS 的記錄(當然﹐client 主機必須能支援 DNS submit 功能才行)。

    而第二個 zone 則是本機區域的反解 zone ﹐不過﹐這部份的解釋我想留到後面的真實例子中再作說明﹐請您留意就是了。

    上面的句子﹐當您安裝好 caching-nameserver 套件之後就被建立起來的﹐相信您不用勞什麼心力。在檔案最後﹐您或許還看到下面這段設定﹕

    key "key" {
    algorithm hmac-md5;
    secret "coqJswFdBMdNAItnLOpkmGgmJtccFsoNZZciWqxlGZBMUTOUxb0geYMFRyTT";
    };


    這是 bind 9.x 版本的新功能﹐用來進行區域轉移或 DNS 更新所用的加密處理。這個我們暫時不必理會﹐除非您有興趣進行這個研究。

    現在﹐我們暫時不要修改 named.conf 設定檔﹐請退出它﹐然後轉到 /var/named 目錄﹐看看裡面有些什麼東東﹖最起碼﹐您會看到如下三個檔案﹕


    named.ca
    localhost.zone
    named.local

    不知道您是否有靈感了﹖沒錯﹕剛纔在 named.conf 裡面﹐每一個 zone 所指定的 file 都出現在這裡﹗先讓我們看看 root zone 的檔案內容吧﹕

    ; This file holds the inFORMation on root name servers needed to
    ; initialize cache of Internet domain name servers
    ; (e.g. reference this file in the "cache . "
    ; configuration file of BIND domain name servers).
    ;
    ; This file is made available by InterNIC registration services
    ; under anonymous FTP as
    ; file /domain/named.root
    ; on server FTP.RS.INTERNIC.NET
    ; -OR- under Gopher at RS.INTERNIC.NET
    ; under menu InterNIC Registration Services (NSI)
    ; submenu InterNIC Registration Archives
    ; file named.root
    ;
    ; last update: Aug 22, 1997
    ; related version of root zone: 1997082200
    ;
    ;
    ; FORMerly NS.INTERNIC.NET
    ;
    . 3600000 IN NS A.ROOT-SERVERS.NET.
    A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
    ;
    ; FORMerly NS1.ISI.EDU
    ;
    . 3600000 NS B.ROOT-SERVERS.NET.
    B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107
    ;
    ; FORMerly C.PSI.NET
    ;
    . 3600000 NS C.ROOT-SERVERS.NET.
    C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
    ;
    ; FORMerly TERP.UMD.EDU
    ;
    . 3600000 NS D.ROOT-SERVERS.NET.
    D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90
    ;
    ; FORMerly NS.NASA.GOV
    ;
    . 3600000 NS E.ROOT-SERVERS.NET.
    E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
    ;
    ; FORMerly NS.ISC.ORG
    ;
    . 3600000 NS F.ROOT-SERVERS.NET.
    F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
    ;
    ; FORMerly NS.NIC.DDN.MIL
    ;
    . 3600000 NS G.ROOT-SERVERS.NET.
    G.ROOT-SERVERS.NET. 3600000 A 192.112.3***
    ;
    ; FORMerly AOS.ARL.ARMY.MIL
    ;
    . 3600000 NS H.ROOT-SERVERS.NET.
    H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53
    ;
    ; FORMerly NIC.NORDU.NET
    ;
    . 3600000 NS I.ROOT-SERVERS.NET.
    I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
    ;
    ; temporarily housed at NSI (InterNIC)
    ;
    . 3600000 NS J.ROOT-SERVERS.NET.
    J.ROOT-SERVERS.NET. 3600000 A 198.41.0.10
    ;
    ; housed in LINX, operated by RIPE NCC
    ;
    . 3600000 NS K.ROOT-SERVERS.NET.
    K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
    ;
    ; temporarily housed at ISI (IANA)
    ;
    . 3600000 NS L.ROOT-SERVERS.NET.
    L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12
    ;
    ; housed in Japan, operated by WIDE
    ;
    . 3600000 NS M.ROOT-SERVERS.NET.
    M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33
    ; End of File


    在 /var/named 中的 RR 記錄檔裡面的註解符號﹐和 /etc/named.conf 的註解符號不一樣哦﹕在 named.conf 中是用雙斜線“ // ”﹔而在這裡則使用 “ ﹔”符號。無論如何﹐您都不能用 “ # ”來做註解符號就是了。(好混亂哦~~~ 這就是電腦﹗^_^ )

    在上面這個 named.ca 檔案裡面﹐您如果將所有的註解行拿掉﹐您會發現一共有 13 行是以‘ . ’開頭的﹐那就是所謂的 root zone 了﹗然後﹐第二欄都是‘ 3600000 ’﹐這是 TTL (Time To Live) 設定﹐也就是在 cache 中保留的時間﹐以秒為單位(所以這裡是 100 小時)。其後的‘ NS ’是“Name Server”的意思﹐是 DNS 記錄名稱之一﹐也就是負責這個記錄的 name server 是哪一台主機(這裡一共由 13 台主機共同負責 root zone 的 NS 服務)。

    雖然我們這裡用 NS 指定了 name server 的主機名稱﹐但對電腦系統來說﹐這些名稱必須能解釋為 IP 位址才有用(呵~~ 這個正是 DNS 系統的功能)﹐所以﹐這裡分別用 13 個‘ A ’記錄﹐也就是 Address 的意思﹐解釋 [A-M].ROOT-SERVER.NET. 這些主機各自的 IP 位址所在。

    如果您了解 DNS 的查詢模式﹐您會知道 DNS 伺服器在查詢非自己管轄的 zone 的時候﹐首先會向 root 查詢下一級的 zone 在哪裡﹐然後逐級查詢下去。但問題是﹕當 named 剛啟動的時候﹐在 cache 裡面一片空白﹐它怎麼知道 root zone 的 servers 在哪裡呢﹖這不是一個矛盾嗎﹖所以﹐就必須靠這個檔案告訴 named 關於 root zone 的 servers 有哪些﹖以及在哪裡﹖ --- 明白了嗎﹖

    因為這個檔是以靜態的方式維護的﹐很難保證這個檔的內容永遠都正確﹐如果 root zone 的記錄發生改變了怎麼辦(雖然這機會不大)﹖或許﹐您已經在檔案的開頭註解那裡得知﹐您可以在任何時候透過 ftp 或 gopher 取得這個檔案的最新版本。如果您還沒讀過那些註解﹐那就請帶著字典讀一下吧。如果您真的有需要更新這個 named.ca 檔﹐那可以按如下步驟進行﹕

    ftp FTP.RS.INTERNIC.NET
    anonymous
    your_account@your.mail.server
    cd domain
    get named.root
    bye
    cp /var/named/named.ca /var/named/named.ca.bak
    cat named.root > /var/named/named.ca


    除了剛才的 named.ca 之外﹐第二個 zone 的記錄檔是 localhost.zone ﹐從 named.conf 中您應該知道它是 zone "localhost" 的記錄檔﹐它的內容如下﹕

    $TTL 86400
    $ORIGIN localhost.
    @1D IN SOA @ root (
    42 ; serial (d. adams)
    3H ; refresh
    15M ; retry
    1W ; expiry
    1D ) ; minimum

    1D IN NS @
    1D IN A 127.0.0.1


    內容很簡單﹐但您是否真的了解每一行的設定意思呢﹖如果不清楚或不確定﹐那就讓我們一起探討探討吧。

    首先﹐第一行是一個 TTL 設定﹐目前是定義出這個記錄檔裡面的各項記錄的預設 TTL 值為 86400 秒(剛好是一天)。您的記錄檔或許沒有這行﹐事實上沒什麼關係﹐您可以自己補上﹐否則﹐在啟動 named 的時候會碰到一些警告﹐無傷大雅的﹔但如果您的確在意那些警告﹐那就加上這行。您要知道﹐在記錄檔中宣告的所有資源記錄(RR - Resource Record)﹐都一定有一個 TTL 設定﹐如果沒有﹐則使用這裡預設的值。

    第二行是一個 ORIGIN 設定﹐說明下面的記錄源出何處(這裡是源出 localhost. 的記錄)。請您加倍留意最後的一個小數點“ .”﹐少了它或多了它﹐記錄名稱完全不一樣﹗在 DNS 記錄中﹐我們稱這樣以小數點結尾的名稱為“ 全域名稱 ”即 FQDN ( Fully Qualified Domain Name ) 。如果缺少了這個點會怎樣呢﹖就會將所屬的 ORIGIN ( @ ) 附加在記錄名稱後面﹔而這 ORIGIN 就是上一個 $ORIGIN 宣告之後的名稱﹐如果在前面找不到 $ORIGIN 宣告﹐那就以 /etc/named.conf 中定義的 zone 名稱為基準。以目前的例子來說﹐如果沒有這個小數點的話﹐“localhost”會變成“localhost.localhost”﹔但如果有小數點的話“localhost.”就只能是“localhost.”。所以﹐這個小點“.”非常重要﹐在以後設定中一定要非常留神﹗﹗(這也初學者最常犯的錯誤之一)

    然後﹐第三行﹐是一個 SOA 記錄的設定﹐在這裡我們看到一個特殊字符“ @ ”﹐它就是 ORIGIN 的意思﹐也就是剛纔所定義的 $ORIGIN localhost. 內容﹐您可以寫成 localhost. 也可以用 @ 來代替。假如這個檔前面沒有定義 $ORIGIN 的話﹐那這個 @ 的值就以 named.conf 裡的 zone 為準。既然這樣﹐當然是使用“@”啦﹐尤其對於像我這樣的懶惰鬼來說﹐巴不得少打一串字﹐同時還能避免因打字不準所造成的失誤﹐何樂不為﹖

    在 @ 之後﹐是 TTL 的設定﹐這裡是 1D﹐也就是一天的意思﹐如果您喜歡﹐可以用 86400 (秒) 來設定﹐如果這裡的 TTL 沒有設定﹐則參考前面的 $TTL 值﹐如果前面沒有定義 $TTL﹐那就參考其後介紹的 minium ttl 設定。


    Tips﹕事實上﹐您可以為每一個 RR 記錄設定其自己的 TTL ﹐只要將數字寫在第二個欄位﹐也就是‘IN’前面就可以了。

    在 TTL 之後是一個 IN﹐定義出目前的記錄類型是屬於 internet class 的 (奇怪﹐目前的 DNS 還有其它 class 嗎﹖)。

    在 IN 之後就是這行 RR 的記錄類別名稱﹐這裡是 SOA ﹐也就是“Start Of Authority”的意思﹐表示目前區域的授權記錄開始。每一個記錄檔只能有一個 SOA ﹐不得重複﹐而且必須是所負責的 zone 中第一個“記錄”。

    緊接 SOA 後面﹐指定了這個區域的授權主機和管理者的信箱﹐這裡分別是“ @ ”和“ root ”﹐也就是 localhost. 主機和 root 信箱。這裡要注意的是﹕SOA 的主機名稱必須能夠在 DNS 系統中找到一個 A 記錄 (以後會提到)﹔另外﹐我們平時使用的信箱通常是“user@host”這樣的格式﹐但因為“@”在 DNS 記錄中是個保留字符(剛才已經提過)﹐所以在 SOA 中就用“.”來代替了“ @ ”。目前這個信箱是 root (並沒有主機位址)﹐也就是本機﹐您可以寫成 “root.localhost.”但不能寫成“root@localhost.”。

    接下來的 SOA 設定﹐是被括在“( )”之間的 5 組數字﹐主要作為和 slave 伺服器同步 DNS 資料所使用的數據﹕


    Serial﹕其格式通常會是“年月日+修改次序”(但也不一定如此﹐您自己能夠記得就行)。當 slave 要進行資料同步的時候﹐會比較這個號碼。如果發現在這裡的號碼比它那邊的數值“大”﹐就進行更新﹐否則忽略。不過設 serial 有一個地方您要留意﹕不能超過 10 位數字﹗
    Refresh﹕這裡是是告訴 slave 要隔多久要進行資料同步(是否同步要看 Serial 的比較結果)。
    Retry﹕如果 slave 在進行更新失敗後﹐要隔多久再進行重試。
    Expire﹕這是記錄逾期時間﹕當 slave 一直未能成功與 master 取得聯絡﹐那到這裡就放棄 retry﹐同時這裡的資料也將標識為過期( expired )。
    Minimum﹕這是最小預設 TTL 值﹐如果您在前面沒有用“$TTL”來定義﹐就會以此值為准。

    以上的數字都是以秒為單位﹐但您也可以用 H(小時)﹑D(天)﹑W(星期)來做單位﹐如﹕3H 和 259200 是一樣的。但要值得一提的是﹕我在 RH6.2 版本中曾測試過使用 netconf 這工具來設定 DNS ﹐發現只能使用“秒”來設定。否則 netconf 會自動的把英文字母刪除掉﹐那就不是我所預期的設定值了。無論您用什麼單位來設定﹐都要遵守下面的規則﹕

    expire >= refresh + retry
    expire >= 10 * retry


    Tips﹕請注意﹕SOA 記錄中這對 “ ( ) ”符號之第一個 “ (”括號一定要和 SOA 寫在同一行﹐而不能用 Enter 斷行到下一行去(有時候您在書本的範例中看到這個符號排在下一行去了﹐那是因為版面的關係而已)﹐而且其左邊最好有一個空白鍵或 tab 建。而最後一個 “ )”括號也不能寫在註解符號 “ ﹔”的右邊。

    設定 DNS 的 RR 記錄檔﹐其格式要求非常嚴格﹐我們絲毫不能掉以輕心。比方說﹕如果句子不是以空白鍵﹑Tab 鍵﹑ 或註解符號 ( ; )開頭﹐也不在 SOA 的 “ ( ) ”之內﹐ 則表示要定義一個“新記錄項 (Entry) ”﹔如果句子是以空白鍵或 tab 鍵開始的話﹐其設定被視為上一個“記錄項”的內容。所以﹐如果您要為“同一個記錄項”定義多個記錄設定﹐而不想重複打字﹐您倒可以偷懶﹕在接著它的後面幾行用空白或 Tab 來縮排就可以了。所以﹐最後這兩行還是關於 localhost. 的設定﹐因為上一個“資料項”為 “ @ ”﹐也就是 localhost. 。當然﹐您如不喜歡﹐這兩行句子也可以這樣寫﹕

    ;; 修改前﹕
    1D IN NS @
    1D IN A 127.0.0.1

    ;; 修改後﹕
    @1D IN NS @
    @1D IN A 127.0.0.1

    ;; 或﹕
    localhost.1D IN NS localhost.
    localhost.1D IN A 127.0.0.1


    這兩行的意思是說﹕負責 localhost. 這個記錄的 name server ( NS ) 是 localhost. 這台機器﹔而 localhost. 的 IP Address ( A ) 是 127.0.0.1 。DNS 裡面的 A 記錄應該是最常見的記錄類型之一﹐如果在 IPv6 版本中﹐位址記錄名稱則改為 AAAA 。


    Tips﹕關於更多的記錄名稱﹐請參閱“學習網路”中的“DNS 協定”。

    最後﹐讓我們檢查剩下的 named.local 檔案吧。如果您還沒忘記 /etc/named.conf 的內容的話﹐應知道這個檔案是 zone "0.0.127.in-addr.arpa" 的‘反解’記錄檔﹐它的內容也很簡單﹕

    $TTL 86400
    @ IN SOA localhost. root.localhost. (
    1997022700 ; Serial
    28800 ; Refresh
    14400 ; Retry
    3600000 ; Expire
    86400 ) ; Minimum
    IN NS localhost.

    1 IN PTR localhost.


    前面的部份應該不用多解釋了(如果您還不清楚﹐那就必須重讀前面的文章)。最後一行我們看到一個“ PTR ”記錄﹐它是“Pointer”的意思。 PTR 通常用於反記錄當中﹐將 IP 指向主機名稱(剛好和 A 記錄相反)。您或許還不是很清楚這個句子為什麼是這樣設定的吧﹖或許您會這樣問﹕您不是說 PTR 是從 IP 反查詢主機名稱的嗎﹖為什麼這裡是 1 而不是 127.0.0.1 ?

    哦﹐如果您有這樣的問題﹐那證明您對 DNS 的查詢模式還不是了解得很透徹﹐不過也不用緊張﹐在後面的實作例子中﹐您將獲得更進一步的感性認識。這裡﹐我暫時簡單解釋上面這行就是了﹕

    我們知道 127.0.0.1 所對應的主機名稱就是 localhost ﹐因為這裡是反向查詢﹐所以 IP 順序是掉過來寫的﹐於是這個反查詢 IP 就是﹕“ 1.0.0.127.in-addr.arpa. ”﹐由於我們這裡的 ORIGIN ( @ ) 是“ 0.0.127.in-addr.arpa." ”﹐因為在記錄檔中﹐如果名稱不帶小數點﹐則被補上 $ORIGIN 或 zone 的名稱﹐所以這個 “ 1 ”就成了 1.0.0.127.in-addr.arpa. ”。同樣道理﹐後面的“ localhost. ”如果漏了最後的小點的話﹐則會成為“ localhost.0.0.127.in-addr.arpa. ”﹐這顯然是不對的。假如您喜歡﹐可以將這行句子修改成為下面的樣子﹕

    ﹔﹔修改前﹕
    1 IN PTR localhost.

    ﹔﹔修改後﹕
    1.0.0.127.in-addr.arpa. IN PTR localhost.


    嗯~~ DNS 的設定看起來真的蠻傷腦筋的﹐或許您到這裡已經被搞得亂七八糟了。假如真的如此﹐我建議您先休息一下﹐然後回來重讀上面的內容﹐直到您能理解之後﹐才繼續下面的。否則﹐越往後﹐您的問題越像滾雪球那樣越來越大﹐這更浪費時間啦~~~ Okay? Take it easy ...

    前面所看到的設定﹐事實上已經足夠讓您的 DNS 主機跑起來了﹗因為它能夠透過 root 查詢其他 DNS 的緣故﹐您無須在再加設任何設定﹐您就可以利用這台主機為大家提供 Internet 的 DNS 查詢服務。只是﹐這樣的 DNS 主機﹐我們稱之為 cache only name server 而已。如果您了解 DNS 的查詢流程﹐您應該知道 DNS 的 cache 作用和它的效益。所以﹐就算您不打算設定自己的 domain name 服務 ﹐我也建議您至少可以將 cache only NS 跑起來。

    設定 NAMED

    當您對 /etc/named.conf 檔案和 /var/named 目錄的設定有初步了解之後﹐下面﹐讓我們用一個實際例子來看看如何設定自己的 domain name 服務吧。我個人的習慣是先將網域和主機的資料整理出來﹐並列成一個表格﹕

    Domain 名稱 IP 位址
    rh71.siyongc.domain 192.168.100.23
    acer.siyongc.domain 192.168.100.20
    mdk.siyongc.domain 192.168.100.24
    emilie.siyongc.domain 192.168.100.11
    rh71.dmz.domain 10.0.1.131
    lp64.dmz.domain 10.0.1.130


    當所有的主機名稱和 IP 整理出來之後﹐再看看我們這裡需要設定哪些 domain ﹖ 從上面的資料中﹐我們不難發現有兩個正解 zone 和兩個反解 zone 需要設定﹐分別是﹕

    區域名稱 記錄項名稱
    siyongc.domain emilie﹑acer﹑rh71﹑mdk
    dmz.domain lp64﹑rh71
    100.168.192.in-addr.arpa 11﹑20﹑23﹑24
    1.0.10.in-addr.arpa 130﹑131


    因為這些 IP 和 domain 都在內部網路使用﹐所以我們省卻了註冊這關﹐同時也不必擔心授權的問題。但這些資訊也只能在內部網路使用﹐無論如何是不能設定在對外的 DNS 上面的 (為什麼﹖除了安全的考量之外﹐private IP 的使用本來就有這樣的規定﹐就算您真的對外散佈這些 DNS 資訊﹐在 IP 的路由上還是有問題﹐所以﹐內部的資訊﹐只能內部使用)。

    一般來說﹐我會先設定“反查詢區域(revers zone)”﹐當然﹐這是個人習慣而已。所以﹐我首先在 /etc/named.conf 上面補上兩個反解 zone 的設定﹕


    zone "100.168.192.in-addr.arpa" IN {// 定義反解區域名稱
    type master;// 定義伺服器類型
    file "192.168.100.rev";// 指定記錄檔名稱
    };// 結束區域設定

    zone "1.0.10.in-addr.arpa" IN {
    type master;
    file "10.0.1.rev";
    };


    注意哦﹕如果您要設定外部 DNS 的反解﹐那就先獲得 ISP 的授權才能自己設定﹔否則反解部份就不用自己擔心了﹐但一定要請 ISP 幫忙。


    Tips﹕假如您是 hinet 的固定制 ADSL 用戶﹐可以到 hinet 的網站填寫表格﹐請他們幫忙設定反解﹕


    http://hidomain.hinet.net/rever.html

    其它 ISP 的用戶﹐請自行接洽 ISP 的客服部門。無論如何﹐如果沒有取得授權﹐那就不要自己設﹗


    這裡﹐我們再一次碰到反解區域的識別標誌﹕“ .in-addr.arpa ”﹐同時﹐我們解釋一下上次關於本機反解還沒說明的地方﹕如果您了解 DNS 的授權和查詢過程(這章一開始的時候﹐我就已要求您一定要學習的)﹐您會知道反解查詢是先從 root 開始(正解也是一樣)﹐然後到 arpa ﹑到 in-addr ﹑到第一組 IP ﹑到第二組 IP ﹑...... 這樣查詢下來的。所以﹐在設定反區域的時候﹐您一定要將您的 net ID 部份反過來寫﹐例如﹕我的網路為 192.168.100.0/24﹐它的反查詢區域名則是﹕“100.168.192.in-addr.arpa”﹔假如我將 netmask 改為 16 bit ﹐即變成 192.168.0.0/16﹐它的反解區域名就會變成﹕“168.192.in-addr.arpa”。如果您還搞不懂如何區分 Net ID 和 Host ID﹐請立即去看一看“學習網路”中的“IP 基礎”。

    同時﹐我將這些 zone 都設定為“主 DNS 伺服器”(即﹕master﹐也有人稱之為 primary dns )。

    在每個 zone 的最後部份﹐我分別指定了它們各自的記錄檔名稱。它們都存放在 /var/named 這個目錄下面(也就是前面 options 指定的 directory 啦)。檔案的名稱隨您喜歡﹐不致做成混亂則可。

    完成上面的設定之後﹐我們就可以到 /var/named 目錄去建立相應的記錄檔案了。說實在﹐在 named.conf 裡面如何定義檔案名稱沒一定的標準﹐只要您能正確指定哪個記錄檔給哪個 zone 使用﹐而且檔案名稱能夠一致就行。首先﹐根據第一個 zone 的 file 設定﹐我要建立一個 /var/named/192.168.100.rev 檔案﹐其內容如下﹕

    $TTL 86400
    @ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (
    2001111601 ; Serial
    28800 ; Refresh
    14400 ; Retry
    3600000 ; Expire
    86400 ) ; Minimum
    @ IN NS rh71.siyongc.domain.
    @ IN NS lp64.dmz.domain.

    11 IN PTR emilie.siyongc.domain.
    20 IN PTR acer.siyongc.domain.
    23 IN PTR rh71.siyongc.domain.
    24 IN PTR mdk.siyongc.domain.


    而另外一個反解設定檔是 /var/named/10.0.1.rev ﹐我們依樣畫葫蘆就行了﹕

    $TTL 86400
    @ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (
    2001111601 ; Serial
    28800 ; Refresh
    14400 ; Retry
    3600000 ; Expire
    86400 ) ; Minimum
    @ IN NS rh71.siyongc.domain.
    @ IN NS lp64.dmz.domain.

    130 IN PTR lp64.dmz.domain.
    131 IN PTR rh71.dmz.domain.


    就這樣﹐反解 DNS 就設定完成了﹗是否很簡單呢﹖如果您回答“ Yes ”的話﹐那就讓我們繼續正解區域的設定吧。同樣的﹐先在 /etc/named.conf 裡面加上兩個 zone﹕

    zone "siyongc.domain" IN {
    type master;
    file "siyongc.domain";
    };

    zone "dmz.domain" IN {
    type master;
    file "dmz.domain";
    };


    完成後﹐再建立 /var/named/siyongc.domain 這個檔案﹕

    $TTL 86400
    $ORIGIN siyongc.domain.
    @ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (
    2001111601 28800 14400 3600000 86400 )
    IN NS rh71.siyongc.domain.
    IN NS lp64.dmz.domain.
    IN MX 10 rh71.siyongc.domain.
    IN MX 20 lp64.dmz.domain.

    ;; -- default address
    @ IN A 192.168.100.23

    ;; -- linux servers --
    rh71 IN A 192.168.100.23
    IN MX 0 rh71.siyongc.domain.
    IN MX 10 lp64.dmz.domain.
    IN HINFO "Petium II 266""Redhat 7.1"
    IN TXT "The internet gateway."

    mdk IN A 192.168.100.24
    IN MX 0 mdk.siyongc.domain.
    IN MX 10 rh71.siyongc.domain.
    IN HINFO "Petium II 266 dell""Mandrak 8.0"

    ;; -- Windows desktops --
    acer IN A 192.168.100.20
    IN MX 0 mdk.siyongc.domain.
    IN HINFO "Petium III 800 acer""Windows ME"

    emilie IN A 192.168.100.11
    IN MX 0 mdk.siyongc.domain.
    IN HINFO "Petium II 300""Windows 98"

    ;; -- cnames --
    gw IN CNAME rh71
    www IN CNAME rh71
    ftp IN CNAME rh71
    mail IN CNAME rh71


    這裡﹐我們在正解記錄檔裡面看到幾個新的記錄類別﹐或許需要進一步講解一下的﹕

    因為我這個區域的記錄分別由兩台主機負責﹐所以我這裡指定了兩個 NS 記錄。這裡﹐如果您確定上一個 ORIGIN 是正確的話﹐那也可以偷懶﹕正如我上面解釋過﹐如果名稱後面不是以“.”結尾的話﹐它所屬的 ORIGIN ( @ ) 就會自動的加在該記錄名稱後面﹔所以﹐您可以只寫“ rh71 ”而不帶小數點結尾﹐就會變成“rh71.siyongc.domain.”了﹐這個名稱實際就是我所要的。不過﹐我建議您在設定 NS 的時候還是儘量使用 FQDN 為好。

    接下來的 ‘ MX ’ 記錄恐怕要花些時間解析﹕


    MX 記錄

    MX 是‘Mail eXchange’的意思﹐它指定了負責該記錄項(可以為 domain 也可以是 host )的郵件伺服器名稱(最好使用 FQDN )﹐而且該名稱必須是一個 A 記錄(不建議使用 CNAME )。

    在郵件系統中﹐只要郵件伺服器雙方都知道對方的 IP 就可以進行郵件交換了。我們用 /etc/hosts 也可以做到名稱查詢的目的﹐但正如我們可以想像的﹕ineternet 有那麼多郵件伺服器﹐我們不可能一一為它們建立好 IP 對應。就算﹐我們可以這樣做﹐如果對方要更換郵件伺服器呢﹖要維護這樣一個對應殊非易事。既然﹐我們可以用 DNS 來查詢主機和 IP﹐為什麼不使用這麼便利的系統呢﹖這也是 DNS 系統的應用原因啊~~~ 但問題是﹐各區域的郵件伺服器名稱都不一樣﹐我們不可能知道對方的郵件伺服器主機名稱是什麼﹖就算知道﹐如果對方以後更換名稱呢﹖

    您看﹐即使我們使用了 DNS 系統來進行郵件路由﹐也不是這麼簡單的事情。但是﹐使用 MX 記錄就大大發揮了 DNS 系統的功能了﹕我們只要為每一個區域建立起 MX 記錄﹐利用 DNS 查詢得到的郵件伺服器名稱(郵件路由查詢中﹐DNS 只是其中一種方法)﹐這樣﹐當郵件伺服器要和對方的區域進行郵件傳遞的時候﹐就可以通過 MX 記錄得到對方的郵件伺服器名稱﹐而不需預先知道要和哪台郵件主機溝通。在日後﹐就算對方更換名稱﹐將 DNS 記錄改改就可以﹐完全無需知會其它郵件主機﹔而外面的郵件伺服器也根本無需認知到這個改變。

    這樣的設計﹐無疑是非常靈活便利的﹗另外﹐使用 MX 還有一個功能﹕您可以用多個 MX 同時指定好幾台郵件伺服器名稱﹐從而提供備援或平行處理服務。在我這個例子中﹐我就分別為‘siyongc.domain’這個區域指定了兩個 MX 記錄﹕‘rh71.siyongc.domain.’和‘lp64.dmz.domain.’。但您有沒有發現它們前面都有一個數字呢﹖這數字有什麼作用啊﹖

    問得好﹗當外面的郵件伺服器通過 DNS 查詢到我們的郵件伺服器﹐如果發現超過一台主機負責郵件交換的話﹐數值越低的就越先被查詢。但有時候該主機沒有回應呢﹖那麼就由下一個數值的主機負責了。這樣有一個好處就是﹕就算第一台郵件伺服器出現故障﹐也不至於導致郵件交換功能癱瘓掉。我們通常會將各自的 MX 主機儘量分佈在不同的位置上(例如別的城市或國家的分公司主機)﹐假如萬一發生專線﹑甚至 ISP 的問題﹐我們還能將郵件轉往下一台 MX 主機。然而﹐在設計上﹐由於帳號和 client 端的設定因素﹐我們的郵件並非真的完全轉到下一個 MX 主機接收﹐而是先將郵件暫時佇列( queue ) 在那台機器上﹐當原來的 MX 主機恢復連線之後﹐郵件會自動的從佇列主機那邊送回來﹐這樣就能避免郵件丟失或被退信。


    Tips﹕雖然﹐我們通常喜歡用‘10’﹑‘20’﹑‘30’.... 這樣的偏好值( preference ) 來分配 MX 記錄﹐但只要您喜歡﹐用‘1’﹑‘2’﹑‘3’... 這樣的順序一樣可以。不過﹐我建議您還是使用慣例啦。

    現在很多大型郵件系統﹐都可以同時使用多台郵件主機來提供郵件交換服務﹐這時候您可以將 MX 的 preference 設為相同﹐然後利用 NIS 和 NFS 服務﹐將郵件同步到相同的帳號去。您已經在前面的章節裡面學會了 NIS 和 NFS﹐等日後學習郵件主機架設的時候﹐不妨玩玩看﹗


    或許﹐您還發現我這裡為所有主機指定了 MX 記錄﹐有些直接指向自己(如 rh71﹑mdk 等)﹐而有些則指向別的機器(如 lp64﹑acer 等)。在 Linux 機器上面﹐各主機本身就具備郵件交換功能(除非您將之移除了)﹐而 Windows 則除非額外加裝﹐否則本身是沒有郵件交換功能的。這裡的設定是﹐從外面通過 DNS 查詢而寄往那些主機的郵件﹐都會轉到 MX 上面指定的郵件伺服器。這在實際的網路環境中很常見﹐尤其您接觸過“ mail hub ”這個概念。無論如何﹐我建議您應該幫負責 domain 的郵件伺服器本身設定一個偏好值最低的 MX 記錄指向自己(但這不是硬性必須如此的)。


    Tips﹕事實上﹐我當初對 MX 的理解一直存在著錯誤﹐直到有一次在新聞組上和大家討論﹐才糾正過來。如果您對這個故事感興趣的話﹐或是想更進一步了解 MX 的實際運作原理﹐請參考 << Sendmail 與 MX >> 一文。

    在過去﹐有些人並不知道如何正確的運用 MX 記錄﹐但相對的﹐他們會為 domain 名稱本身設定一個 A 記錄 (@ IN A 192.168.100.23 )。這樣的做法雖然不是正統的﹐但也行之有年了。而且﹐在許多網站的 URL 上﹐這樣的設定﹐也能讓您少輸入“ www. ”這四個鍵~~~


    另外﹐在這個檔裡面﹐您或許還發現‘ TXT ’這樣的記錄類別﹐它是‘Text InFORMation’的意思﹐它實際上不牽涉任何設定﹐只記錄一些環境說明而已﹔這和‘ HINFO(Host InFORMation) ’差不多﹐但 HINFO 一定要有兩項記錄(分別用引號分開)﹐其中第一項是關於 CPU 的訊息﹐第二項則是作業系統。然而﹐TXT 和 HINFO 這些資訊僅能在一個信任的環境中提供﹐如果您架設的 DNS 是對外提供服務的﹐那麼﹐就不要設定這些資訊了。要不然﹐入侵者可非常感謝您哦﹐因為您幫他們省卻了很多主機系統的探測手續~~~ 所以﹐這裡僅做範例﹐供您參考而已。

    而最後您所看到的‘CNAME’記錄又是怎樣的呢﹖CNAME 也是一個常見的記錄類別﹐它是一個別名記錄( Canonical Name )。當 DNS 系統在查詢 CNAME 左面的名稱的時候﹐都會轉向 CNAME 右面的名稱再進行查詢﹐一直追蹤到最後的 PTR 或 A 名稱﹐成功查詢後才會做出回應﹐否則失敗。例如﹐在正解查詢中﹐一個 IP 通常(當然也有例外)﹐只會對應一個 A 記錄﹐但我們可以使用 CNAME 在 A 名稱之上賦予該 IP 更多的名稱。也就是說﹕所有關於‘www.siyongc.domain’﹑‘ftp.siyongc.domain’﹑‘mail.siyongc.domain’這些名稱的查詢﹐實際上都會再查詢一次‘rh71.siyongc.domain.’這個記錄﹐直到找到它的 IP 位址為止。有些朋友或許會設定多層的 CNAME 查詢﹐例如﹕


    C CNAME B
    B CNAME A

    這樣的話﹐會一層一層的逐級 CNAME 下去... 但是﹐這很浪費 DNS 資源﹗因為每一個 CNAME 都一定會產生另外一個查詢動作﹐如果層級越多﹐那就產生越多的重複查詢。所以﹐精明的 DNS 管理員﹐都會儘量的減少查詢次數的發生﹐他會將 CNAME 變成這樣子﹕


    C CNAME A
    B CNAME A

    這樣就用心多了﹗

    基本上﹐我們在正解設定上所使用到的記錄大概就前面所看到的。哦﹐對了~~ 還有另外一個 /var/named/dmz.domain 檔案也不要忘記了﹕

    $TTL 86400
    $ORIGIN dmz.domain.
    @ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (
    2001111601 28800 14400 3600000 86400 )
    IN NS rh71.siyongc.domain.
    IN NS lp64.dmz.domain.
    IN MX 10 rh71.dmz.domain.

    ;; -- linux servers --
    rh71 IN A 10.0.1.131
    IN MX 0 rh71.dmz.domain.
    IN HINFO "Petium II 266""Redhat 7.1"
    IN TXT "The internet gateway."

    lp64 IN A 10.0.1.130
    IN MX 0 rh71.dmz.domain.
    IN HINFO "Pentium 90""Linpus ***"

    ;; -- cnames --
    gw IN CNAME lp64
    www IN CNAME lp64
    ftp IN CNAME lp64
    mail IN CNAME lp64


    您看﹗就這樣﹐我們的 DNS 就已經設定好了﹐包括反解和正解哦~~~

    重新啟動 named

    當您以為所有設定檔都設定好之後﹐最想做的事情莫過於要測試一下啦。但在測試之前﹐我們還要重新啟動 named ﹐否則﹐您查詢出來的還是舊資料。聰明的您或許已經知道使用如下命令來重新啟動DNS 服務了吧﹕

    service named restart


    然而﹐作為一個有經驗的 DNS 管理員﹐在重新啟動 named 服務之後﹐他一定會檢查一個檔案﹐就是 /var/log/messages 。因為﹐許多時候﹐當您執行 service named restart 之後您看到的都是綠色的 OK ﹐但事實上是否真的 OK 呢﹖誰也不敢保證﹐除非您在 log 檔中沒發現錯誤信息。所以﹐我也強烈建議您每次重新啟動 named 之後﹐一定一定要做如下動作﹕

    vi /var/log/messages


    然後按“G”鍵(大寫)跳到檔案末尾部份(事實上﹐您也可以用 tail 命令)。您或許會看到如下這樣的記錄﹕

    Nov 16 14:54:10 rh71 named[2211]: starting BIND 9.1.0 -u named
    Nov 16 14:54:10 rh71 named[2211]: using 1 CPU
    Nov 16 14:54:10 rh71 named: named startup succeeded
    Nov 16 14:54:10 rh71 named[2215]: loading configuration from '/etc/named.conf'
    Nov 16 14:54:10 rh71 named[2215]: the default for the 'auth-nxdomain' option is now 'no'
    Nov 16 14:54:10 rh71 named[2215]: no IPv6 interfaces found
    Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface lo, 127.0.0.1#53
    Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth0, 192.168.100.23#53
    Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth1, 10.0.1.1#53
    Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth2, 10.0.1.131#53
    Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface vmnet1, 172.16.233.1#53
    Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface vmnet8, 192.168.183.1#53
    Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface ppp0, 211.74.244.213#53
    Nov 16 14:54:10 rh71 named[2215]: running


    上面雖然有 'auth-nxdomain' 和 IPV6 的提示﹐但那是正常的(除非您有設定相關的功能)。如果沒有其它錯誤信息的話﹐那真要恭喜您了﹗

    但有時候您或許會看到有其他錯誤信息的﹐例如﹕

    Nov 16 15:01:49 rh71 named[2287]: loading configuration from '/etc/named.conf'
    Nov 16 15:01:49 rh71 named[2287]: /etc/named.conf:41: parse error near zone
    Nov 16 15:01:49 rh71 named[2287]: loading configuration: failure
    Nov 16 15:01:49 rh71 named[2287]: exiting (due to fatal error)


    這個錯誤信息明顯指出了是 /etc/named.conf 的問題﹐而且很可能在 41 行附近。根據我個人的經驗﹐這通常是您漏了 “ ﹔”符號的原因而已。

    如果您碰到如下信息﹐那是沒有為所有 RR 記錄項設定 TTL 而已﹐您可以為每一個記錄項補上 TTL (在 IN 前面)﹐也可以在記錄檔的前面用 $TTL 來設定﹕

    Nov 16 15:04:47 rh71 named[2395]: master.c:1172: unexpected error:
    Nov 16 15:04:47 rh71 named[2395]: dns_master_load: siyongc:3: no TTL specified.
    THIS ZONE WILL NO LONGER WORK IN FUTURE VERSIONS. Add a TTL.
    Nov 16 15:04:47 rh71 named[2395]: dns_master_load: siyongc:5: using
    RFC 1035 TTL semantics


    如果您碰到下面這樣的信息﹐那多是因為您打字錯誤的關係﹐輸入了 named 不認識的記錄類別名稱(例如漏了記錄名稱或打錯了)﹕

    Nov 16 15:07:44 rh71 named[2422]: dns_master_load: siyongc:2: unknown RR
    type 'siyongc.domain.'
    Nov 16 15:07:44 rh71 named[2422]: dns_zone_load: zone siyongc.domain/IN: loading
    master file siyongc: unknown class/type


    如下的問題﹐那可能是您沒有定義 SOA 記錄﹐或設定有錯誤﹕

    Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: could
    not find NS and/or SOA records
    Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: has
    0 SOA records
    Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: no
    NS records


    下面的問題可能是您的 SOA 記錄中多輸入了一組數字﹐或少輸入了一組數字﹐或數字格式有錯誤﹕

    Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: could not
    find NS and/or SOA records
    Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: has
    0 SOA records
    Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: no
    NS records

    Nov 16 15:18:24 rh71 named[2562]: dns_rdata_fromtext: siyongc:4: near eol: unexpected
    end of input
    Nov 16 15:18:24 rh71 named[2562]: dns_zone_load: zone siyongc.domain/IN: loading
    master file siyongc: unexpected end of input

    Nov 16 15:19:34 rh71 named[2640]: dns_rdata_fromtext:
    siyongc:4: near '14B400':
    syntax error
    Nov 16 15:19:34 rh71 named[2640]: dns_zone_load: zone
    siyongc.domain/IN: loading
    master file siyongc: syntax error


    以下問題可能是 SOA 的 “ ( ) ”符號有問題﹐要麼是“ ( ” 給斷到下一行了﹐要麼是“ ) ”給註解掉了﹕

    Nov 16 15:22:08 rh71 named[2669]: dns_rdata_fromtext: siyongc:3: near eol: unexpected
    end of input
    Nov 16 15:22:08 rh71 named[2669]: dns_zone_load: zone siyongc.domain/IN: loading
    master file siyongc: unexpected end of input

    Nov 16 15:22:52 rh71 named[2696]: dns_rdata_fromtext: siyongc:4:
    near 'IN': extra input text
    Nov 16 15:22:52 rh71 named[2696]: dns_zone_load: zone siyongc.domain/IN:
    loading master file siyongc: extra input text


    以下是您沒有設定 NS 記錄或 NS 記錄設定有錯誤﹕

    Nov 16 15:25:30 rh71 named[2801]: dns_zone_load: zone siyongc.domain/IN: no NS records


    下面的錯誤可能是您設定了一個記錄項超出了當前 ORIGIN 的範圍﹐例如 localhost. 或 siyongc. (也就是錯誤使用 FQDN )﹔或是錯誤的使用了 $ORIGIN 設定﹔或是在 named.conf 中有多個 zone 在分享同一份記錄檔﹕

    Nov 16 15:31:20 rh71 named[2920]: dns_master_load: siyongc:16:
    ignoring out-of-zone data


    下面的錯誤﹐有可能您在設定多個 $ORIGIN 並同時嘗試設定多個 SOA 時出現的錯誤﹕

    Nov 16 15:28:31 rh71 named[2855]: dns_master_load: siyongc:26:
    not at top of zone


    許多許多問題﹐事實上您都可以在 /var/log/messages 中找到﹐當您發現這些錯誤信息之後﹐看看是關於什麼記錄的﹐然後順藤摸瓜﹐留心一下檔案內容﹐就比較容易找到錯誤的原因了。

    有時候﹐您想簡化您的 DNS 設定工作﹐您可以使用 netconf 來做。不過﹐根據我的經驗是﹕netconf 未必能夠完全幫您正確的設定起來。當您重新啟動 named 之後﹐別忘了看一下 /var/log/messages ﹐確定沒有錯誤發生。如果您使用工具來設定 DNS 而碰到問題﹐這就需要您有手工設定的能力了。

     

    設定 DNS Client

    DNS 系統是一個典型的 Client/Server 架構﹐前面介紹的動作僅是確保 DNS 的 server 成功啟動起來而已﹐如果您要測試它﹐還必須設定好 client 端才行。

    不知道您會不會設定 linux 的 dns client 呢﹖如果忘記了要打屁屁了哦~~~ 事實上我們在第一章的“網路設定”那裡就設定過了﹐也就是修改 /etc/resolv.conf 這個檔案﹐將您剛設定好的 DNS 主機 IP 放在檔案的前排位置﹐如﹕

    nameserver192.168.100.23
    nameserver168.95.1.1
    nameserver139.175.10.20
    domainsiyongc.domain
    searchsiyongc.domain dmz.domain test.com


    假如您的 client 和 server 在同一台機器上﹐那可以將第一個 name server 設定為 0.0.0.0 或 127.0.0.1 。

    要是您使用 Windows ﹐但不是透過 DHCP 來指定 DNS 的話﹐那您或許需要手工設定了﹕控制台 --> 網路 --> TCP/IP (-> 網路卡) --> 內容 --> DNS 組態 ﹕


    請注意﹕如果您修改了這裡的設定﹐就算您的 Windows 是透過 DHCP 取得 IP 設定的話﹐也會以這裡的設定為準。如果您想使用 DHCP 的設定﹐那就選擇“關閉 DNS”吧。

     

    測試 DNS

    要測試我們的設定是否生效﹐我們可以使用的方法有很多﹐其中最簡單的莫過於 ping 命令了。直接 ping 一下您所預期的 dns 名稱就知道結果了。

    不過﹐ping 畢竟很有限﹐例如﹕您不能查詢 MX 和 NS 等記錄。實作上﹐我們最最常使用的 DNS 查詢工具是 nslookup 命令。關於 nslookup ﹐在“學習網路”的“DNS 協定”文章中有很詳細的例子﹐這裡不再重複。如果我們在測試中失敗﹐例如 nslookup 回應說﹕

    *** rh71.siyongc.domain can't find XXX.XXXX.XXXX:
    Non-existent host/domain


    這通常是反解記錄沒設定好的緣故﹐請確定 DNS 主機本身的反解有設定起來﹐而且可以被 DNS 追查得到。如果反解沒有授權下來﹐那就請上游 ISP 幫忙設定。不過﹐我發現這個錯誤信息似乎在新版的 nslookup 中不會出現﹐anyway ﹐請您自己留意吧。

    有時候 nslookup 會停在某處一動也不動﹐其實它不是當掉了﹐而是在查詢沒結果之後等 time out 而已。您可以按 Ctrl + C 終止查詢﹐再打 exit 跳出來。不過﹐如果您在按了 Ctrl + C 之後接著再輸入一個無結果的查詢﹐那就好可能將 nslookup 當掉。這樣您可能要登錄進另外一個 terminal ﹐然後用 kill 將 PID 殺掉。同上﹐新版的 nslookup 沒有這個困繞﹐但如果按 Ctrl + C 的話﹐則會直接跳離 nslookup 程式。

    然而﹐nslookup 似乎在以後的版本中不再維護了﹐取而代之的﹐就是 dig 命令﹐所以﹐當您在 Redhat 7.1 上輸入 nslookup﹐您會看到如下這樣的信息﹕

    Note: nslookup is deprecated and may be removed from future releases.
    Consider using the `dig' or `host' programs instead. Run nslookup with
    the `-sil[ent]' option to prevent this message from appearing.


    這段文字不用解釋了吧﹖真的不知道說什麼就查字典吧~~ 這裡﹐我們不妨學習一下如何用 dig 來查詢和測試 DNS 服務。

    基本上﹐dig 命令的語法如下﹕


    dig [@server] domain [<query-type>] [<query-class>] [+<query-option>]
    [-<dig-option>] [%comment]

    看起來蠻複雜的﹐恐怕要 man dig 才知道怎麼使用。不過﹐我們平時只用它來查詢 dns 資料的話﹐要使用到的選項也不會太多啦﹐如果您會得在 nslookup 中設定 type=XXX 的話﹐那您也可以用 dig 來查詢不同的記錄類別資料。例如﹕

    # dig siyongc.domain mx

    ; <<>> DiG 9.1.0 <<>> siyongc.domain mx
    ;; global options: printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8198
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2

    ;; QUESTION SECTION:
    ;siyongc.domain. IN MX

    ;; ANSWER SECTION:
    siyongc.domain. 86400 IN MX 20 lp64.dmz.domain.
    siyongc.domain. 86400 IN MX 10 rh71.siyongc.domain.

    ;; AUTHORITY SECTION:
    siyongc.domain. 86400 IN NS lp64.dmz.domain.
    siyongc.domain. 86400 IN NS rh71.siyongc.domain.

    ;; ADDITIONAL SECTION:
    rh71.siyongc.domain. 86400 IN A 192.168.100.23
    lp64.dmz.domain. 86400 IN A 10.0.1.130

    ;; Query time: 8 msec
    ;; SERVER: 192.168.100.23#53(192.168.100.23)
    ;; WHEN: Fri Nov 16 21:13:18 2001
    ;; MSG SIZE rcvd: 138


    上面是的命令是使用預設的 name server 來查詢 siyongc.domain 的 mx 記錄。當然﹐您也可以用 @ 來指定用某一台 name server 來查詢其它的資訊。例如﹐我要用 hinet 的 dns 來查詢負責 com.tw 的 NS 有哪些﹕

    # dig @168.95.1.1 com.tw ns

    ; <<>> DiG 9.1.0 <<>> @168.95.1.1 com.tw ns
    ;; global options: printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33339
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 4

    ;; QUESTION SECTION:
    ;com.tw. IN NS

    ;; ANSWER SECTION:
    com.tw. 518400 IN NS b.twnic.net.tw.
    com.tw. 518400 IN NS c.twnic.net.tw.
    com.tw. 518400 IN NS a.twnic.net.tw.

    ;; ADDITIONAL SECTION:
    b.twnic.net.tw. 159497 IN A 192.72.81.200
    c.twnic.net.tw. 159497 IN A 168.95.192.10
    a.twnic.net.tw. 159497 IN A 163.28.1.2
    a.twnic.net.tw. 159497 IN A 140.111.1.2

    ;; Query time: 167 msec
    ;; SERVER: 168.95.1.1#53(168.95.1.1)
    ;; WHEN: Fri Nov 16 21:17:46 2001
    ;; MSG SIZE rcvd: 146


    除了用 nslookup 和 dig 之外﹐如果您只想簡單的查詢 dns 資訊的話﹐那您可以用 host 命令。例如﹕

    # host -t any siyongc.domain 0.0.0.0
    Using domain server:
    Name: 0.0.0.0
    Address: 0.0.0.0#53
    Aliases:

    siyongc.domain. SOA rh71.siyongc.domain. root.rh71.siyongc.domain. 2001111601 28
    800 14400 3600000 86400
    siyongc.domain. name server lp64.dmz.domain.
    siyongc.domain. name server rh71.siyongc.domain.
    siyongc.domain. mail is handled by 10 rh71.siyongc.domain.
    siyongc.domain. mail is handled by 20 lp64.dmz.domain.
    siyongc.domain. has address 192.168.100.23


    上面的命令就是用本機 name server 來查詢 siyongc.domain 的 any 資訊。至於 host 命令的格式如下﹕


    host [-aCdlnrTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait]
    name [server]

    老話啦﹐看 man host 以了解那些參數和選項的用法吧。

    您可以發現﹕透過 nslookup ﹑ dig ﹑與 host 命令﹐事實上可以查詢到許多 dns 上面的設定資訊。所以﹐如果您的 DNS 是對外提供服務的話﹐請儘量儘量控制 DNS 資訊量﹐如果您覺得沒必要對外提供的﹐那就拿掉它。無論如何﹐關於內部網路的 DNS 資訊﹐是絕對不能對外散佈的。如果查詢的結果未如您所預期的﹐您就要進行 debug 工作了。

     

    註冊 domain

    Okay﹐相信到此為止﹐您已經能夠在單一的 dns 上面設定一個或多個 domain 的正解和反解服務了。這時候﹐您或許早已迫不及待想註冊一個屬於自己的 domain 來玩玩看吧﹖

    呵呵~~ 有此衝動絕對正常﹐尤其現在的 domain 註冊那麼方便和便宜﹐前幾天在‘討論園地’得知原來現在註冊一個 .com 或 .org 的網站﹐一年都不用 $10 塊美金﹗實在是便宜得令人

  • 2005-12-24

    DNS 介紹

    DNS 介紹

    DNS 由來

    DNS 全名是 Domain Name System, 透過 DNS 系統, 我們可以由一部機器的 domain name 查其 IP, 也可以由機器的 IP 反查它的 domain name, 除此之外 DNS  還與 Mail System 結合, 提供 Mail routing 的功能.

    早期這個 domain name 與 IP 的對應表是記在每部機器的 /etc/host 這個檔案, 當電腦個數不多還好, 但是電腦數目一多就會發生問題了, 主要有下列問題

    1. Traffic & Load
    2. Conflict
    3. Consistency

    因為用 hosts 記錄 domain name <-> ip mapping 有上述問題, 所以後來發展出 DNS.
     

    Domain Name Space

    整個 INTERNET 上的電腦如此眾多, 如何保證兩部電腦不會有相同的 domain name/IP 是一個很重要的問題. 幾個重要的觀念如下

    1. Domain (網域)
    將整個 internet 分成許多 domain, 每個 domain 下又細分為許多 domain, 然後這些細分的 domain 視實際需求又再細分成許多 domain, 一直循環下去.
    基本上每個 domain 內的 mapping 由一部主機負責管理.

    top level domain - com, edu, gov, mil, net, org, int (現在又多出許多 top domain 了如 isp, art 等)


     

    2. Delegation (授權)
    剛才提到每個 domain 都可因實際需求再細分成許多 sub domain. 上層的 domain 可以將其分出的某個 sub domain 的 domain name 與 IP mapping 交由另一部機器管理, 這個動作我們稱之為 delegation

    3.Forward/Reverse(正解/反解)
    在講到 domain name <-> IP mapping, 其實應該看成兩個命名空間:

    一個是 domain name -> IP, 稱之為 forward mapping,  在這個命名空間中就是先分成前面提到的那些 top domain, 再細分 sub domain, 再細分...
    比如說 winnie.corp.hp.com -> 15.16.192.152 代表在負責  corp.hp.com 這個 sub domain 的機器上, 可以查到其 mapping table 上有一筆記錄是 winnie -> 15.16.192.152.

    一個是 IP -> domain name 稱為 reverse mapping. 在這個命名空間中, 所有的 IP 組成一個叫作  arpa.in-addr 的 top domain, 然後再依 IP 層層細分...
    比如說 15.16.192.152 -> winnie.corp.hp.com 代表在負責 192.16.15.in-addr.arpa(注意是反過來寫, 因為 top domain 要在最後面) 這個 sub domain 的機器上,  可以查到其 mapping table 上有一筆記錄是 152 -> winnie.cop.hp.com

    值得注意的是:
    a. 負責 forward mapping 和 reverse mapping 的機器不一定是同一部
    負責 corp.hp.com domain 與負責 192.16.15.in-addr.arpa 的機器不一定是同一部機器, 即使在同一部機器, 如果不注意的話, 兩邊的內容可能也會有不 match 的情形.
    b. domain 與 ip subnet 並沒有一對一關係
    舉例而言成大電機的 domain 是 ee.ncku.edu.tw, 但是因為成大電機內部機器數多的關係, 所用到的 IP subnet 有 140.116.72, 140.1***9, 140.116.163, 140.116.156, 140.116.227 共 5 組
     

    Name Server

    負責記錄 forward/reverse mapping 的機器會執行一個叫 name server 的軟體, 透過這個軟體回應來自其它機器對 domain name 或 IP 的查詢

    1. zone & domain
    上面提到基本上每個 domain交由一個機器來負責, 其實更精確地說應該是每個 zone 交由一個 name server 來負責, 所謂 zone 就是把一個 domain 扣掉分給下層負責的部份, 剩下來的就是 zone

    2. Primary/Secondary
    每個 zone 交由一部 name server負責的作法會有一個問題, 萬一這個 name server 當掉, 可能造成 INTERNET 上其它機器無法取得屬於這個  zone 的資料(就是 domain name 和 ip mapping). 為了避免這種情形, 我們可以把這個 zone 的資料同時交給多部 name server 負責.原本的這部稱為 primary name server, 其它的稱為 secondary name server. Secondary name server 會定期將 primary name server 上 zone 的資料拷貝一份下來備用.

    對於上層的 name server 而言, 它只是設定某個 zone 同時 delegate 給一部以上的下層 dns server, 但是它並不去分辨誰是真正的 primary, 誰是 secondary. 它只是依據順序尋問, 當第一部負責某個 zone 的 dns server 當掉時, 它會依序找下一個負責的 dns server.

    ps: primary/secondary 在新版 name server 程式中改稱為 master/slave
     

    Name Resolution (名稱解析, 名稱查詢)

    接下來我們介紹名稱查詢運作時一些重要名詞或觀念

    1. Resolver
    相當於是 DNS server 的 client 端, 通常是以函式庫的方式被放在整套作業系統中, 各類的應用程式經由呼叫這個 resolver 函式庫可以很容易地向 DNS server 進行查詢, 得到所要的資料.

    2. Root Name Server
    在查詢資料時, 總是要有一個起點, 當一個 local DNS server 收到來自 client 端關於一個 domain name 的查詢, 這個 local DNS server 怎麼知道這個 domain name 的相關資料是記錄在 INTERNET 中的哪一個 DNS 上呢?
    答案是向 root name server 尋問. root name server 記錄了各 top domain 分別是由哪些 DNS server 負責. 比如說要找 www.yohoo.com 時, root name server 會告訴 local DNS server 哪部 name server 負責 .com 這個 domain, 然後 local dns 再向負責 .com 的 name server 詢問關於 yohoo.com 是哪部 name server 在負責. 最後 local DNS 就可以向負責 yohoo.com 的 name server 問到有關 www.yohoo.com 的資料.

    註: 考量 root name server 會被全世界的 DNS sever 詢問, 負擔很大, 在世界各地共有十多個root name server. 而每個 name server 軟體都附有一個文字檔, 其中記錄了這十多個世界知名的 root name server 的 IP 位址

    3.Recursive Query
    在上面介紹的過程中, DNS client 端只丟出一個詢問給 local DNS server, 然後 local DNS 就會不斷地查到答案出來為止, 最後把結果傳回來給 client, 這種查詢稱為 recursive query

    上圖中 DNS client 端(resolver) 向 local DNS server 進行 recursive query, 查 girigri.gbrmpa.gov.au 的 IP. local DNS server 會由 root name server 開始問起, 依序找到負責 .au domain 的 DNS server, 負責 .gov.au domain 的 DNS server, 負責 gbrmpa.gov.au domain 的 DNS server, 最後在負責 gbrmpa.gov.au 的 DNS server 問到 girigri.gbrmpa.gov.au 的資料, 然後傳回給 DNS client (resolver).

    4. Iterative Query
    前面的介紹中, local DNS 對其它 DNS 發出的詢問, 都只是知道一個更進一步的線索, 然後發問者(local DNS)根據線索再去進一步找答案, 這種詢問方式稱為 iterative query

    ps:
    a.一般說來, resolver 對 local DNS server 都是 recursive query, 而 DNS server 之間的 query 多是iterative.
    b.大部份的 DNS server 都可以接受 recursive 和 iterative 兩種 query 方式, 但是考量負載問題,  root name server 只接受 iterative query.

    5. DNS Caching
    由前面的敘述我們可以了解由 resolver 發出一個 query 給 local DNS, 到最後 local DNS 把答案傳回來, 中間需要許多次的查詢, 為了節省這些反覆查尋的時間, DNS server 會把查到的結果偷偷暫存一陣子, 這麼一來當有其它機器發出相同詢問時, 就可以省下不少的時間.
    舉例而言, 在一次詢問 www.ncku.edu.tw 的過程中, local DNS 上可以得知
    a. 負責 .tw 的 name server IP
    b. 負責 .edu.tw 的 name server IP
    c. 負責 .ncku.edu.tw 的 name server IP
    d. www.ncku.edu.tw 的 IP
    除了有機器再次查詢 www.ncku.edu.tw 會變快外, 查詢和 a, b, c 相關 domain 的資料也會變快, 因為 local DNS 不必再從 root name server 一層層問下來.

    ps: 當 local DNS 偷偷記下一些資料以便加速時, 萬一真正的資料有修改時怎麼辦呢? DNS server 針對它負責的 domain 資料有一個 TTL(time to leave)參數, 用來告訴其它 DNS 在 cache 其資料時, 資料只應該 cache 多久. 超過 TTL, 那個 cache 就要視為過期無效.