在Windows 7上架設自己的 DNS 服務(使用BIND 9)


這是因應自己需要架設 DNS 伺服器紀錄的
在沒有Windows Server和Linux作業環境中,利用PC版的Windows開設DNS服務的方式

BIND的官方網站: https://www.isc.org
BIND下載位置(如果不存在請到官方網站尋找):https://www.isc.org/downloads/

找到下面位置,然後點開BIND項目產生下拉選單,選擇下載版本點選Download,依照作業系統類型選擇下載。
我下載的版本是9.10.6穩定版,作業系統是64位元



下載後是一個壓縮檔,把它解壓縮,會看到一個安裝檔案 BINDinstall.exe
注意,你必須以系統管理員身份執行,否則安裝後會有很多問題



雙擊後進行安裝,下面如下:
     注意中間紅框,這個是 BIND啟動用的帳號 [named],一般而言電腦不會有這個帳號,所以它會在安裝時幫你建立這個帳號,當然這個建立過程是有問題的,所以我們事後要去調整這個帳號的權限。


還有一些需要注意(檢查)的:

  1. 安裝完畢後,程式正常的安裝位置會在 C:\Program Files\ISC BIND 9,如果你的路徑跑到 C:\Program Files (x86)\ISC BIND 9,代表你的作業系統是64位元,而你下載到的BIND版本是 32位元的。
     
  2. 某些版本BIND的組態設定檔會在 C:\Windows\System32\dns\etc,但是這個版本的組態預設是在 C:\Program Files\ISC BIND 9\etc,而程式與工具路徑會放在 C:\Program Files\ISC BIND 9\bin,要注意的是 C:\Program Files\ISC BIND 9\etc 基本上是空的,接下來所有組態檔都必須自己建立,這點對新手真的不是很友善。
     
  3. 某些套裝電腦會把作業系統的administrator帳號鎖起來,讓使用者以別的帳號執行,雖然這個使用者帳號是可能編屬於administrators權組的,但是對於C:\Program Files和C:\Windows的權限還是有一些限制的,對於接下來要建立BIND的組態與設定會有很多不便(通常是無法儲存設定檔到C:\Program Files\ISC BIND 9\etc)。

    所以建議執行BIND任何設定或是開啟編輯器編輯組態檔案前,記得使用右鍵『以系統管理員身份執行』,或是直接使用administrators帳號登入進行編輯。

修改[named]帳號權限(成員隸屬):
     原則上是不需要修改的,除非你的日誌(寫入)路徑是放在 C:\Program Files\ISC BIND 9\etc 底下,或是你的BIND需要抄寫其他DNS清單(會修改C:\Program Files\ISC BIND 9\etc裡面檔案)就會需要把權限調高。



組態檔案:
      先了解BIND9需要自行建立底下一些檔案:

  • rndc.key
  • name.conf
  • named.root
  • named.local
  • localhost.zone
  • mysite1.com.tw.dns
  • mysite2.idv.tw.dns


除了rndc.key、named.conf 之外,其他檔案名稱其實可以自己訂沒有硬性規定,但基於日久怕忘,所以我是以常見公版的命名方式處理。

檔尾名稱.dns的檔案是我的網域裡面主機名稱 正解 清單(玩過windows server的DNS的人大概就瞭解)

在這裡我沒有設定反解清單,大部分的情況下,只有公司內部比較有機會使用反解,一般架設在外部的主機通常是租用或是資安的理由不會設定。




  • rndc.key
    加密序號檔案,由系統指令產生。
     
  • name.conf
    主要組態檔案。
     
  • named.root
    根(root)主機清單,可以到 ftp://rs.internic.net/domain 直接下載最新的 named.root,不定期更新(基本上很少會異動)。
     
  • named.local
    本機形式 正解 清單
     
  • localhost.zone
    本機形式 反解 清單
     
  • mysite1.com.tw.dns
    我的第一個網站 正解 清單,.dns前面的檔案名稱通常會以你申請的域名為主(當然也可以完全不相關,只是這樣比較好記)。
     
  • mysite2.idv.tw.dns
    我的第二個網站 正解 清單
     

設定方式/步驟:

  1. 檢視C:\Program Files\ISC BIND 9\bin\readme1st.txt,內容主要是說,請先建立一個 named.conf 純文字檔案,儲存位置在 C:\Program Files\ISC BIND 9\etc ,然後先建立一個內容然後儲存:
    options {
            directory "C:\Program Files\ISC BIND 9\etc";
    };
     
  2. 產生 rndc.key ,開啟命令列模式,進入 C:\Program Files\ISC BIND 9\bin,執行
    rndc-confgen -a
    便會自動產生這個檔案,而預設產生路徑就在 C:\Program Files\ISC BIND 9\etc 。
     
  3. 然後把rndc.key內容複製到 named.conf  內:
    key "rndc-key" {
            algorithm hmac-md5;
            secret "lJNu1IPdgmnej+ZzGYAbVA==";
    };
    注意 secret "lJNu1IPdgmnej+ZzGYAbVA==";  這序號每次產生都會不一樣。

    ,然後再加上 controls 文字:
    controls {
            inet 127.0.0.1 port 953 allow { localhost; } keys { "rndc-key"; };
    };
     
  4. 依照需要繼續加上 named.conf 設定項目:
    • options : 操作設定說明(不想看直接跳範例)
      • directory "設定檔操作路徑"
        告訴 BIND 設定檔的位置
      • version "自訂的版本訊息"
      • zone-statistics yes | no ;
        是否開啟 ZONE 狀態記錄
      • statistics-file "檔案位置"
        配合 zone-statistics yes; 告訴 BIND 儲存 ZONE 狀態的檔案位置
      • allow-query { IP條件 };
        允許來查詢的IP/網段/單機
      • allow-recursion { IP條件 } ;
        允許來遞迴查詢的IP/網段/單機
      • allow-transfer { IP條件 };
        允許來讀取本機清單的IP/網段/單機
      • recursion yes | no ;
        遞迴查詢全開/全關,這個和 allow-recursion 只使用其中一種設定
      • transfer yes | no ;
        讀取本機清單 全開/全關,這個和 allow-transfer 只使用其中一種設定
      • forwarders { 其他 DNS IP };
        當本機查無資訊時,將查詢條件送往其他 DNS 主機查詢
        例如:forwarders { 168.95.1.1; 8.8.8.8; }; 意思是當本DNS查無資料時送往中華電信DNS或Google的DNS進行查詢,此種查詢稱為遞迴查詢,可以配合 recursion 設定來限制特定使用者使用,以免被人利用。
    • zone : 轄區(網域)宣告設定說明
      • 語法和指令
        • zone "正反解轄區名稱" IN {}; : 架構樣式
        • type master|slave|stub|forward|hint : 類型
        • file "紀錄檔案" :實際內容檔案
        • allow-update {IP;|範圍;|none;} :允許更新內容(此處為轄區獨立設定,如若 options 有定義則會以 options 為主)
        • allow-transfer {IP;|範圍;|none;} :允許轉送內容
        • 其他指令眾多有興趣可以Google研究
      • 根目錄資訊(必要) zone "." {
                type hint;
                file "named.root";
        };
      • 本機正解清單資訊 zone "localhost" IN {
                type master;
                file "localhost.zone";
                allow-update {none;};
        };
      • 本機反解清單資訊 zone "0.0.127.in-addr.arpa" {
                type master;
                file "named.local";
                allow-update {none;};
        };
      • 自訂網域正解清單資訊(至少一個,我的範例是二
        個網站) zone "mysite1.com.tw" {
                type master;
                file "mysite1.com.tw.dns"; //第一網站
                allow-update {none;};
        };

        zone "mysite2.idv.tw" {
                type master;
                file "mysite2.idv.tw.dns"; //第二網站
                allow-update {none;};
        };
    • logging : 日誌產生設定說明
      • 語法和指令 logging {
                channel 種類-log{
                        file "儲存檔案名稱" versions 保留檔案數 size 每個檔案大小;
                        severity critical|error|warning|notice|info|debug|dynamic; 要紀錄的告警等級
                        print-time yes|no; 列印時間
                        print-severity yes|no; 列印告警等級名
                        print-category yes|no; 列印類別名
                };
                category client|config|database|default|delegation-only|dispatch|dnssec|general|lame-servers|network|notify|queries|resolver|rpz|rate-limit|security|unmatched|update|update-security|xfer-in|xfer-out; 要輸出的類別
        };
      • 用法 logging{
                channel default-log {
                        file "D:\ISC_BIND_log\named_default.log" versions 5 size 200m;
                        severity info;
                        print-time yes;
                };
                category default { default-log; };
        };
    • 其他
      在 named.conf 裡面 options 和 logging 段落只會有一個,zone 則可以有好幾個。
    • 範例 options {
          directory "C:\Program Files\ISC BIND 9\etc";
          zone-statistics yes;
          statistics-file "C:\Program Files\ISC BIND 9\etc\data\named_stats.txt";
          version "none of your business";
          //限制遞迴查詢
          allow-recursion {192.0.0.0/8; 127.0.0.1/32;};
          //限制轉送清單
          allow-transfer {192.168.2.0/24; };
          forwarders {
              168.95.1.1;
              139.175.10.20;
              8.8.8.8;
          };
      };
      key "rndc-key" {
          algorithm hmac-md5;
          secret "lJNu1IKdgmnej+ZzUYAbVA==";
      };
      controls {
          inet 127.0.0.1 port 953 allow { localhost; } keys { "rndc-key"; };
      };
      zone "." {
          type hint;
          file "named.root";
      };
      zone "localhost" IN {
          type master;
          file "localhost.zone";
          allow-update {none;};
      };
      zone "0.0.127.in-addr.arpa" {
          type master;
          file "named.local";
          allow-update {none;};
      };

      zone "mysite1.com.tw" {
          type master;
          file "mysite1.com.tw.dns";
          allow-update {none;};
      };
      zone "mysite2.idv.tw" {
          type master;
          file "mysite2.idv.tw.dns";
          allow-update {none;};
      };
      logging{
          channel default-log {
              file "D:\ISC_BIND_log\named_default.log" versions 5 size 200m;
              severity info;
              print-time yes;
          };
          channel security-log {
              file "D:\ISC_BIND_log\named_security.log" versions 3 size 100m;
              severity info;
              print-severity yes;
              print-time yes;
              print-category yes;
          };
          channel query-log {
              file "D:\ISC_BIND_log\named_query.log" versions 10 size 200m;
              severity info;
              print-time yes;
          };
          channel lamer-log {
              file "D:\ISC_BIND_log\named_lamer.log" versions 3 size 100m;
              severity info;
              print-severity yes;
              print-time yes;
              print-category yes;
          };
          category default { default-log; };
          category security { security-log; };
          category queries { query-log; };
          category lame-servers { lamer-log; };
      };

     
  5. 建立named.root(zone file)
    這個就直接從 ftp://rs.internic.net/domain 直接下載最新的 named.root 就好。
     
  6. 建立localhost.zone(zone file)正解資訊檔
    ※藍色字在實際使用時要拿掉以免有問題
    $TTL 86400    (資訊有效期)
    $ORIGIN localhost.    (宣告全區域屬性)
    @ 1d IN SOA @ root (
            42;      Serial (序號:Slave判斷是否需更新檔案)
            3H;     Resresh (Slave自動來取得檔案的時間)
            15M;  Retry (若refresh失敗,再度取得檔案的時間)
            1W;    Expire (若refresh失敗,保留該網域的時間)
            1D) ;   Minimum TTL 別台DNS 伺服器保留cache的時間)
        1D IN NS @
        1D IN A 127.0.0.1

    1D IN NS @  為第一筆NS記錄指出本地網域名稱為localhost.
    1D IN A 127.0.0.1 指出第一筆A記錄對應為本機網用名稱伺服器IP 127.0.0.1
  7. 建立named.local(zone file)反解資訊檔
    $TTL 86400
    @ IN SOA localhost. root.localhost. (
            2017 ;      Serial
            28800 ;      Resresh
            14400 ;      Retry
            3600000 ;      Expire
            86400 ) ;      Minimum TTL
        IN NS localhost.
    1 IN PTR localhost.

    那個紅色1是本機(DNS)的IP最後一碼(本機IP是 127.0.0.1)
     
  8. 建立主機清單(zone file) mysite1.com.tw.dns 和 mysite2.idv.tw.dns檔案
    這裡只做一個範例 mysite1.com.tw.dns

    $TTL 86400
    @ IN SOA dns.mysite1.com.tw. hostmaster.mysite1.com.tw. (
            001 ;Serial
            10800 ;Resresh
            600 ;Retry
            86400 ;Expire
            3600 ) ;Minimum TTL
        IN NS dns.mysite1.com.tw.
        IN MX 10 sp4.mail.com.
        IN MX 20 sp3.mail.com.
        IN MX 30 spam.mysite1.com.tw.

    webmail IN CNAME mail.mysite1.com.tw.
    dns IN A 61.233.159.103
    ftp IN A 61.233.159.102
    mail IN A 61.233.159.99
    service IN A 61.233.159.102
    spam IN A 61.233.159.89
    sydb IN A 61.233.159.101
    webserv1 IN A 61.233.159.110
    www IN A 61.233.159.76


     
  9. 清單檔案注意事項:
    每個檔案結尾必須是 NewLine (換行) 字元符號。
    每個條件後面必須以 ; (分號) 作為結束。
啟動 BIND:
    請到 『控制台』→『系統管理工具』→『服務』裡面找到『ISC BIND』,這個項目預設是沒有啟動的,然後啟動它

    如果無法啟動,請到『事件檢視器』→『Windows紀錄』→『應用程式』查看來源是『named』,通常第一個錯誤是主要的訊息來源。

    錯誤員因常見像是:

    檔案找不到
zone 0.0.127.in-addr.arpa/IN: loading from master file named.local failed: file not found
    紀錄重覆
dns_master_load: mysite1.com.tw.dns:33: webmail.mysite1.com.tw: multiple RRs of singleton type
    註解放錯位置
dns_rdata_fromtext: named.local:9: near '//本機的IP': extra input text
    打錯關鍵字
C:\Program Files\ISC BIND 9\etc\named.conf:78: unknown option '3'
    結尾漏掉分號
C:\Program Files\ISC BIND 9\etc\named.conf:73: missing ';' before '10'
    檔案結尾不是換行(NewLine)字元
localhost.zone: file does not end with newline

    修正問題後,重新啟動,只要沒有重大錯誤,一般而言都可以運作的。

這時候就要恭喜你,完成DNS伺服器的架設了。


參考文章:




留言

Unknown寫道…
Hi,
請問一下,我重新啟動 bind 時,一直會出現 localhost.zone: file does not end with newline,但是我確實也空行了,仍然有這行訊息出現,請問您是如何解決這個問題?

謝謝您的解答
WILDOX寫道…
Re: Unknown <1041202736047544320>

我是空了兩行空白解決了,檔案參考 https://drive.google.com/file/d/1f-KpxjMvyMSiGh5016gvsiYDU5g2ygnA/view?usp=sharing
Unknown寫道…
謝謝您的解答。

我嘗試用您的方法,或是多空幾格,仍有這個問題出現。
比對兩個檔案,唯一不同處只有 Serial 這一個。(目前我的是14,但覺得應該和這個也沒關系)

但是有這行,實際上仍可以運作。
不知道這個會不會影響到其他的作業。

我仍再查看是什麼問題中。

Unknown寫道…
Hi

我剛又試了一次,把您給的連結裡的檔案,直接貼在localhost.zone裡,結果
這個錯訊息就沒有了。

在重新讀取這個檔案時,原序號 42 自動改了 43,
所以好像和Serial有關系。

雖然還是似懂非懂狀態,不過還是謝謝您的解答及詳細的教學。
我使用您的方法,確定有架設成功。

作業系統 win 7 pro 32bits

謝謝。

這個網誌中的熱門文章

【研究】列印的條碼為什麼很難刷(掃描)

統一發票列印小程式

C# 使用 Process.Start 執行外部程式