歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

構建 Linux 下的 DNS 系統

作者:王劍       DNS (Domain Name System,DNS) 可以實現主機域名和 IP 地址之間的相互轉換,因此在 Linux 環境下構建一個安全可靠、高效的 DNS 系統是非常有用的。     域名原理簡介     在 DNS 中,各個域分別由不同的組織管理。每個組織都可將它的域再分成一定數量的子域,並將這些子域委托給其他組織管理。域名被用做 DNS 數據庫中的索引,子域中任何域名都被認為是域的一部分。判斷一個域是否為另一域的子域,簡單方法是比較它們的域名,一般子域名以其父域名結尾。     設計域名系統的一個主要目的是讓管理分散化。管理域的組織將該域劃分成子域,每一個子域可以由其他組織管理意味著那些下級組織負責維護自己子域的所有數據。他們可以改變數據,甚至可以將自己管理的子域再劃分成更多的子域並重新分配,而父域中僅包含指向這些子域的指針。     實現域名查詢和提供域名信息的程序被稱為域名服務器。通常域名服務器擁有部分域名空間 (稱之為區 Zone) 的完整信息,一個域名服務器可以擁有對多個區的授權。域既包括了該層主機,又包括了子域的所有信息;而區僅包含了一個域中除了分配出去讓其它組織管理的子域以外的域名數據信息。如果一個域沒有分配任何子域,則該區包含該域的所有域名數據信息。     DNS 定義了 PM (Primary Master) 和 SM (Secondary Master) 兩類域名服務器。PM 從配置文件中讀取區域數據,這些數據對整個區域來說都是具有權威性的。SM 域名服務器是從其它具有該區授權的 PM 域名服務器上獲得區數據,並定期查詢PM域名服務器以保證區數據為最新版本。一般情況下,最好設立一台PM域名服務器和若干台 SM 域名服務器。這樣可以分擔負載,以確保區中所有主機都有比較靠近的域名服務器方便訪問。     對域名系統的訪問是按照客戶/服務器模式進行的,采用緩存 (Caching) 技術在保證數據可靠真實性的同時,又保證了較高的效率。應用程序一般是利用解析器來實現域名解析的。解析器是一組庫函數,任何需要解析域名的應用程序都會調用這組函數來完成域名解析工作。解析器是應用程序實現域名查詢的接口。     域名服務器在接收到客戶的查詢請求時,一般是按照遞歸的方式來進行的。下面用一個例子來說明什麼叫遞歸方式查詢。一個域名服務器 MyDM 接收到查詢 www.linuxaid.com.cn 的查詢請求。它首先詢問本地存儲的根域名服務器列表中的任何一個根域名服務器,負責 cn 域的名字服務器有哪些。前面曾經說過,上級域名服務器有指向下級子域名服務器的指針。所以根名字服務器就會返回負責 cn 域數據信息的名字服務器的列表。     MyDM 會緩沖這些數據繼續查詢其中的一個,詢問負責 linuxaid 子域的域名服務器有哪些。得到信息後再遞歸查詢,直到找到 www.linuxaid.com.cn 的 IP 信息。查詢中得到的所有域名服務器信息都會被緩存起來,以加速以後的查詢。     域名服務器有生存期 (TTL) 的概念,一旦生存期到了,名字服務器必須丟棄緩存數據並從權威的名字服務器中重新獲取新的數據。這樣可以確保域數據在整個網絡上的一致性。     從 TCP/IP 協議棧的角度來看, DNS 屬於應用層協議,運行在傳輸層之上,但是它並不使用 TCP 提供的服務,而是使用 UDP 服務。     配置文件     下面主要對和域名相關的一些配置文件進行說明,以便進行下一步配置。     /etc/hosts 定義了主機名和 IP 地址匹配信息,供本地解析器使用。本地解析器從該文件中得到主機名匹配信息。例如,zhangsan 和 lisi 的機器沒有正式域名,為了使用方便管理員可以在文件中添加內容:     192.168.2.200 zhangshan   192.168.2.201 lisi     這樣,就可以使用 zhangsan 和 lisi 來實現對其機器的引用了。     /etc/nsswitch.conf 指定了從哪個文件或數據庫可得到不同的數據。在它的頭部有該文件詳細的說明,其中應該包含域名相關的內容行:     hosts: files dns     如果沒有這樣一行內容,則需要管理員手工加入。該行指示域名解析時首先應該查詢文件內容 (/etc/hosts),然後查詢 DNS 數據庫。     /etc/host.conf 是解析器的配置文件,指示解析器以什麼方式來解析主機名。一般可能包含如下內容:     # Lookup names via DNS first then fall back to /etc/hosts.   order bind,hosts   # We have machines with multiple IP addresses.   multi on   # Check for IP address spoofing.   nospoof on     Order 選項指明的是選擇服務的順序。上面“order bind,hosts”說的是解析器庫解析文件名的時候先查詢域名服務器,然後再查看“/etc/hosts”文件。因為性能和安全上的原因,最好將解析器庫的查找順序設成先查域名服務器 (Bind)。     有多個 IP 網絡接口的主機被稱為多穴主機 (Multihomed)。例如:網關服務器就有多個 IP 地址,必須把這個選項設成 on。     Nospoof 選項指明不允許 IP 偽裝。IP 偽裝是把自己偽裝成別的計算機去欺騙其它的計算機,獲得它的信任。不管對任何類型的服務器,這個選項都要設成 on。     /etc/resolv.conf 是解析器使用的配置文件。它指示了本地默認域名 (在進行域名解析時,如果提交的域名是相對域名如 www,則在解析時解析器會自動添加默認域名然後進行解析如:www.linuxaid.com.cn),並且包含應用程序進行域名解析時需要使用的域名服務器的IP地址信息。例如:     search linuxaid.com.cn   nameserver 208.164.186.1   nameserver 208.164.186.2     以上表明進行域名解析時按照名字服務器出現的順序進行。     /etc/named.conf 是域名服務器守護進程 named 的配置文件。named 每次啟動後,都要從該文件中讀取域名配置數據。所以修改該文件及引用的數據,都需要重新啟動 named 以刷新配置。新安裝的機器該文件默認內容一般為:     options {   Directory "/var/named";   };   zone "." {   type hint;   file "root.ca";   };   zone "0.0.127.in-addr.arpa" {   type master;   file "127.0.0";   };     該文件各部分的具體含義及詳細設置在後面加以說明。     編譯和安裝     Bind 的安裝有兩種方式。一種是以 RPM 包的方式安裝,另一種是使用源程序進行編譯。RPM 包安裝方式非常簡單,只要使用命令:     rpm -Uhv bind-8.2.2-p5-9.i386.rpm   rpm -Uhv bind-devel-8.2.2-p5-9.i386.rpm   rpm -Uhv cache-nameserver-6.2-2.noarch.rpm     就可以安裝成功。在此不再詳述。下面主要說明使用源程序進行編譯這種方式。     1.軟件的下載     下面的示例在 Red Hat Linux 7.1 下測試通過,需要安裝者具有 root 權限。這裡使用的 Bind 的版本號是 8.2.2-patchlevel5。注意在真正的網絡應用中 (非測試學習環境) 使用 Bind 時一定要下載最新版本,因為以前的版本中有一些安全漏洞。Bind 主頁為 http://www.isc.org/,下載 bind-contrib.tar.gz, bind-doc.tar.gz, bind-src.tar.gz。     最好在編譯前和編譯後都做一張系統中所有文件的列表,然後用diff命令比較它們找出其中的差別,並知道到底把軟件安裝在哪裡。只要在編譯之前運行 find /* >dns1 命令,在編譯和安裝完軟件之後運行 find/*>dns2 命令,最後用 d i ff dns1 dns2 >dns 命令找出變化。顯示如下:     [root@Aid /]# mkdir /var/tmp/bind   [root@Aid /]# cp bind-contrib.tar.gz /var/tmp/bind/   [root@Aid /]# cp bind-doc.tar.gz /var/tmp/bind/   [root@Aid /]# cp bind-src.tar.gz /var/tmp/bind/     我們創建了一個名為“bind”的目錄,用它來處理tar文檔,並轉到新的“bind”目錄 (cd/ var/ tmp/bind),解壓tar文件:     [root@Aid bind]# tar xzpf bind-contrib.tar.gz   [root@Aid bind]# tar xzpf bind-doc.tar.gz   [root@Aid bind]# tar xzpf bind-src.tar.gz     2.編譯配置和優化     編輯 Makefile.set 文件 (vi /src/port/linux/Makefile.set),並加入:     'CC=egcs -D_GNU_SOURCE'   'CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro   -march=pentiumpro -fomitframe-   pointer -fno-exceptions'   'DESTBIN=/usr/bin'   'DESTSBIN=/usr/sbin'   'DESTEXEC=/usr/sbin'   'DESTMAN=/usr/man'   'DESTHELP=/usr/lib'   'DESTETC=/etc'   'DESTRUN=/var/run'   'DESTLIB=/usr/lib/bind/lib'   'DESTINC=/usr/lib/bind/include'   'LEX=flex -8 -I'   'YACC=yacc -d'   'SYSLIBS=-lfl'   'INSTALL=install'   'MANDIR=man'   'MANROFF=cat'   'CATEXT=$$N'   'PS=ps -p'   'AR=ar crus'   'RANLIB=:'     第一行說明使用的 GCC 編譯器的名字是 egcs。第二行是優化參數。“DESTLIB =”這一行說明 Bind 所需的庫函數目錄,“DESTING =”說明 Bind 的 include 目錄在哪裡。輸入下面的命令:     [root@Aid bind]# make -C src   [root@Aid bind]# make clean all -C src SUBDIRS=../doc/man   [root@Aid bind]# make install -C src   [root@Aid bind]# make install -C src SUBDIRS=../doc/man     make 命令把所有的源文件都編譯成二進制文件,接著“make install”把二進制文件和相關的配置文件安裝到相應的目錄中。     [root@Aid bind]# strip /usr/bin/addr   [root@Aid bind]# strip /usr/bin/dig   [root@Aid bind]# strip /usr/bin/dnsquery   [root@Aid bind]# strip /usr/bin/host   [root@Aid bind]# strip /usr/bin/nslookup   [root@Aid bind]# strip /usr/bin/nsupdate   [root@Aid bind]# strip /usr/bin/mkservdb   [root@Aid bind]# strip /usr/sbin/named   [root@Aid bind]# strip /usr/sbin/named-xfer   [root@Aid bind]# strip /usr/sbin/ndc   [root@Aid bind]# strip /usr/sbin/dnskeygen   [root@Aid bind]# strip /usr/sbin/irpd   [root@Aid bind]# mkdir /var/named     strip 命令去掉目標文件中的所有符號信息。這樣二進制程序就會縮小一些,可以提高程序的性能。mkdir 命令創建一個“/var/named”目錄。     3.清除不必要的文件     [root@Aid /]# cd /var/tmp   [root@Aid tmp]# rm -rf bind/     這些命令刪除用來編譯和安裝 BIND/DNS 的源文件。




 



Copyright © Linux教程網 All Rights Reserved