一、DNS基礎 [DNS系統(伺服器)的工作原理及攻擊防護方法論]
DNS:Domain Name System,網域名稱解析伺服器,它在互連網的作用是把網域名稱轉換成為網路可以識別的ip地址。
BIND:Berkeley Internet Name Domain,是unix中DNS協議用的最多的一個實現。
如blog.sina.com.cn,blog是一四級網域名稱,sina是第三層網域名,com是次層網域,cn是頂級網域名稱。一完整網域名稱最多可以是256個字元,各層級網域名稱最多63個字元。
DNS使用in.named進程,如果/etc/named.conf存在,系統啟動時會開啟in.named進程並讀取/etc/named.conf檔案,in.named其實就是/usr/sbin/named的一個連結。
名字到地址的尋找稱為正向映射;地址到名字的尋找稱為反向映射。
二、DNS伺服器安裝配置
以下都為Solaris平台下用root使用者操作,不論你使用哪個發行版本的unix,DNS的設定與unix的關係並沒有太大的關係。
1、安裝BIND,當前Release版本是bind-9.4.2.tar.gz
為了方便用於其他動作系統,我們還是從原始碼包方式安裝。首先從ISC公司的首頁( http://www.isc.org/index.pl?/sw/bind/index.php )下軟體包。
解壓:
# pwd
/opt/wacos/encle
# gunzip bind-9.4.2.tar.gz
# tar -xvf bind-9.4.2.tar
配置編譯並安裝,BIND正常安裝在/usr/local目錄下,但可以調整通過--prefix參數設定,本例不用IPv6,開機檔案最後會安裝在/usr/local/sbin裡:
# cd bind-9.4.2
# ./configure --prefix=/usr/local --sysconfdir=/etc --disable-ipv6
# make
# make install
安裝的時間會比較久,安裝完後看一看現版本是多少:
# /usr/local/sbin/named -v
到此Bind已經安裝完成了。
2、產生RNDC(用於控制DNS伺服器,Bind9有)設定檔/etc/rndc.conf
Bind9規定,如果要使用rndc來控制dns,必須先產生驗證檔案 rndc.conf 和密鎖。rndc.conf檔案的內容,可用rndc-confgen命令產生所需內容。
# /usr/local/sbin/rndc-confgen > /etc/rndc.conf
如果機器上沒有random產生器,這種情況下系統應該讓你輸入一些無關字母來替代/dev/random的功能。
------------------------------------------
You must use the keyboard to create entropy, since your system is lacking
/dev/random (or equivalent)
start typing:
...............................
...........................
...........................
...........................
...........................
...........................
...........................
...........................
stop typing.
# Start of rndc.conf
...
# End of named.conf
------------------------------------------
產生的rndc.conf大致如下:
# cat /etc/rndc.conf
------------------------------------------
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "ZdAFUwS0QMr95427P7Xq+w==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# algorithm hmac-md5;
# secret "ZdAFUwS0QMr95427P7Xq+w==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
#
------------------------------------------
後面配置/etc/named.conf的時候要把“# Use with the following in named.conf, adjusting the allow list as needed:”這行下的所有複製到named.conf 檔案裡。
3、配置DNS伺服器的引導檔案/etc/named.conf
named.conf檔案包含的內容:
指出包含根伺服器的檔案位置;
建立首要伺服器、次要伺服器、僅快取服務器;
指出伺服器的權威地區;
指出伺服器的資料檔案的位置;
為特定地區應用安全選項;
定義日誌規範;
可為一組地區應用選項。
named.conf編寫規範:
陳述語句以;號結束;
每個陳述語句還可以包括一段{}括起來的陳述;
多行注釋為/* */;單行注釋#或//開始。
陳述語句可定義:
acl:定義一命名的IP地址匹配列表
options:控制全域伺服器配置選項
zone:定義地區
先建立地區檔案目錄/etc/named:
# mkdir /etc/named
配置named.conf樣本:
# vi /etc/named.conf
------------------------------------------
options {
//定義地區檔案目錄,表示以下各項配置中的檔案預設在此目錄中
directory "/etc/named";
};
//指定根DNS伺服器的設定檔/etc/named/named.root,此檔案可從網路下載
zone "." in {
type hint;
file "named.root";
};
//指定正向解析設定檔/etc/named/encle.zone
zone "encle.com" in {
type master;
file "encle.zone";
};
//指定反向解析設定檔/etc/named/encle.rzone,“111.19.172.”這裡是根據網路IP分配情況而定,是反向IP前三段
zone "111.19.172.in-addr.arpa" in {
type master;
file "encle.rzone";
};
//指定環回反向解析設定檔/etc/named/named.local
zone "0.0.127.in-addr.arpa" in {
type master;
file "named.local";
};
// 把上面產生的/etc/rndc.conf的Key和Controls段內容拷到這裡
key "rndc-key" {
algorithm hmac-md5;
secret "ZdAFUwS0QMr95427P7Xq+w==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
------------------------------------------
4、配置地區檔案
區資料檔案的大部分條目被稱為DNS資源記錄(resource record)。
資料檔案中資源記錄的順序如下:
SOA記錄
指示該區的權威
NS記錄
該區的一個名字伺服器
其他記錄
有關該區中主機的資料
A 名字到地址的映射
PTR 地址到名字的映射
CNAME 別名
注釋:
使用分號(;)開頭的到行尾處結束。
設定區預設的TTL值:
名字伺服器在查詢響應中提供這個TTL值,允許其他伺服器將資料在緩衝中存放TTL所指定的時間。
允許的單位是: w=星期 d=天 h=小時 m=分鐘 s=秒
資源記錄格式:
[name] [ttl] [class] [type] [data]
name:網域名稱
ttl:緩衝存留時間,通常是86400(1天),也可表示成1d
class:網路類別,通常IN表示互連網
type:該網域名稱的資源記錄類型
data:資料,如主機名稱、ip、郵件地址等
資源記錄類型介紹:
; 注釋開頭
$TTL:Time To Live,緩衝存留時間
SOA:Start of Authority,標誌主名城伺服器、聯絡資訊等
NS:Name Server,名稱伺服器
A:Address,指定一主機的IP
PTR:Pointer,指定一IP的主機名稱,用來反向解析(即把IP解析成主機名稱)
CNAME:Canonical Name,主機別名(如www可代替一主機名稱)
AAAA:quad-A,指定一主機的IPv6地址
a) /etc/named/named.root
This file is used when you are connected to internet.
可從 http://www.internic.net/zones/named.root 獲得該檔案的最新版本。
c) /etc/named/encle.zone
# vi /etc/named/encle.zone
------------------------------------------
; This file resolves hostnames to IP addresses in the encle.com. domain.
$ORIGIN encle.com.
$TTL 1d
encle.com. IN SOA dns.encle.com. wangnc.gmail.com. (
20080201 ; serial number
1h ; refresh
15m ; retry
1w ; expire
1d ) ; ttl
encle.com. IN NS dns.encle.com.
dns IN A 172.19.111.37
www IN A 172.19.111.40
test IN A 172.19.111.42
------------------------------------------
c) /etc/named/encle.rzone
# vi /etc/named/encle.rzone
------------------------------------------
; This file resolves IP addresses to hostnames in the encle.com. domain.
$ORIGIN 1.168.192.IN-ADDR.ARPA.
$TTL 1d
111.19.172.IN-ADDR.ARPA. IN SOA dns.encle.com. wangnc.gmail.com. (
20080201 ; serial number
3h ; refresh
1h ; retry
1w ; expire
1d ) ; ttl
111.19.172.IN-ADDR.ARPA. IN NS dns.encle.com.
37 IN PTR dns.encle.com.
40 IN PTR www.encle.com.
42 IN PTR test.encle.com.
------------------------------------------
d) /etc/named/named.local
# vi /etc/named/named.local
------------------------------------------
$ORIGIN 0.0.127.IN-ADDR.ARPA.
$TTL 1d
0.0.127.IN-ADDR.ARPA. IN SOA dns.encle.com. wangnc.gmail.com. (
20080201 ; version number
3h ; refresh
1h ; retry
1w ; expire
1d ) ; ttl
0.0.127.IN-ADDR.ARPA. IN NS dns.encle.com.
1 IN PTR localhost.encle.com.
------------------------------------------
5、檢查設定檔
# /usr/local/sbin/named-checkconf /etc/named.conf
# /usr/local/sbin/named-checkzone encle.com /etc/named/encle.zone
6、在主DNS伺服器上開啟in.named服務進程
# /usr/local/sbin/named 或 # /usr/local/sbin/named -c /etc/named.conf (針對named.conf沒放在預設位置/etc下的情況)
查看開啟的進程:
# ps -ef | grep named | grep -v grep
測試rndc是否成功:
# /usr/local/sbin/rndc status
number of zones: 14
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running
表示rndc已經成功控制Bind9。如果沒有顯示上面的資訊,請檢查你的/usr/local/etc/named.conf檔案裡面是否配置了/usr/local/etc/rndc.conf裡面的key。
查看是否有錯誤記錄檔資訊:
# tail -f /var/adm/messages
Jan 30 14:26:54 fsdb37 named[15667]: [ID 873579 daemon.notice] starting BIND 9.4.2
Jan 30 14:26:54 fsdb37 named[15667]: [ID 873579 daemon.error] binding TCP socket: address in use
Jan 30 14:26:54 fsdb37 last message repeated 1 time
Jan 30 14:26:54 fsdb37 named[15667]: [ID 873579 daemon.notice] command channel listening on 127.0.0.1#953
Jan 30 14:26:54 fsdb37 named[15667]: [ID 873579 daemon.notice] running
注意:
solaris8&9版本中預裝的有bind,目錄在/usr/sbin,程式為in.named,也有自己的nslookup等程式,可以看它的版本:
# /usr/sbin/in.named -v
in.named BIND 8.2.4 Fri May 19 04:41:53 PDT 2006
Generic Patch-5.8-May 2006
而且在/etc/rc2.d/S72inetsvc中有in.named的啟動定義:只有/etc下有named.conf檔案,系統啟動時就會將in.named啟動起來。
------------------------------------------
...
if [ -f /usr/sbin/in.named -a -f /etc/named.conf ]; then
echo 'starting internet domain name server.'
/usr/sbin/in.named &
fi
...
------------------------------------------
而我們安裝自己的bind時,往往(預設是這樣的)會將named.conf檔案放到/etc下的!這就造成了我們配置好我們的bind,一啟動server,solaris預裝的bind就啟動了,我們再去啟動我們的bind就會報錯:53連接埠已經被佔用了。解決的辦法是修改/etc/rc2.d/S72inetsvc,將相關in.named的全部注釋掉,將我們的named增加進去。這樣,我們的dns就會在系統啟動時自動運行了。
另外,系統內建了一個nslookup是在 /usr/sbin/ 下,安裝Bind9後帶的nslookup是在 /usr/local/bin 下的。這樣,我們系統裡就有了兩個nslookup了。而環境變數裡的PATH變數中,/usr/sbin一般是在排名比較靠前,肯定是在/usr/local/bin之前的。這樣造成了我們鍵入nslookup時,啟動並執行是老版本的nslookup。這樣我們可能會得到報錯資訊。解決的辦法是將新的nslookup覆蓋掉老的檔案,或者是將環境變數調整一下,將 /usr/local/bin 放到最前面。