天天看點

總結之:CentOS6.5 DNS服務BIND配置、正反向解析、主從及壓力測試(1)

前言:

了解named

   如果說我們安裝的rpm包不符合我們的要求怎麼辦、比如說我們想起用named的線程模式、比如說我想讓他禁用IPv6、比如說我們想啟用某種特性、而rpm在編譯時沒有提供、那這時我們隻能去手動編譯安裝了,那如何去編譯安裝named:

   編譯安裝named有一個麻煩之處、所有的配置檔案你都得自己去建立、像/var/named/這個目錄、編譯安裝時連這個目錄都不會存在、得自己去建立這個目錄、裡面的各種配置檔案、區域檔案、像根的、localhost的、以及localhost的反向的、都得手動去做、連我們service啟動腳本都沒、是以不到萬不得以最好别去編譯他、因為很麻煩、但對于我們學習來講、我們應該是變得法的去折騰自己、活着就是折騰嘛、那我們各種方法都去摸索一遍、将來我們真要用得着了也好應對。

   首先上來就同步一下我們的時間:

   # hwclock -s

   然後檢查一下安裝環境所需要的開發包組、確定所依賴的開發包組都裝有了、我這裡沒有裝、那我就用yum來裝一下吧:

   # yum -y groupinstall "Development Tools"

   # yum -y groupinstall "Server Platform Development"

   # yum grouplist

   裝好後檢視一下、最主要兩項:Development tools和Server Platform Development

   然後我們就去下載下傳源碼包了、這裡我就去www.isc.org/donloads/官方網站下載下傳了、支援使用的版本是9.9.5、目前使用的穩定版、這個版本中已經自帶dlz了、以前的版本沒有自帶的、安裝時要裝這個dlz的、如果我們将來人希望指資源記錄基于資料庫的方式存放的話、而且要能夠現場檢索、現場響應的話、則自定義啟用dlz功能即可、下載下傳好我們就去解壓縮:

   # tar xf bind-9.9.5.tar.gz

   這裡注意一下:我們要去編譯安裝一個服務、首先要去看他的README、然後看他的INSTALL、大體了解一下有沒有我們所需要的資訊、當然我們這裡就不多說了、直接往下走:

   # ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --disable-chroot

   --prefix=/usr/local/bind9:指定編譯存放的路徑

   --sysconfdir=/etc/named:指定配置檔案存放路徑

   --enable-threads:啟用了多線程的功能

   然後make和make install就OK了、安裝完成就可以去配置了

   # make && make install

   我們前面說過、編譯安裝named什麼都得自己建立、使用者也沒有的、是以我們得給他建立一個使用者先、而且使用者是系統使用者、要加-r、系統使用者不會給他建立家目錄的:

   先建立使用者組:

   # groupadd -g 53 -r named

   # useradd -g named -r named

   這裡我們先去建立named的工作目錄、然後建立named.ca這個檔案:

   # mkdir /var/named

   這裡@後面的IP是能通路網際網路的伺服器、生成的資料存在到/var/named/named.ca中去

   # dig -t NS . @172.16.0.1 > /var/named/named.ca

   然後再去編輯/etc/named/named.conf的配置檔案、這個檔案也沒有、需要自己去編寫的:

   # vim /etc/named/named.conf           

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<code>#定義全局的</code>

<code>        </code><code>options {</code>

<code>                </code><code>#定義named的固定工作路徑</code>

<code>                </code><code>directory </code><code>"/var/named"</code><code>;</code>

<code>        </code><code>};</code>

<code>        </code><code>#定義根的區域</code>

<code>        </code><code>zone </code><code>"."</code> <code>IN {</code>

<code>                </code><code>type</code> <code>hint;        </code><code>#類型、hint表示為根的</code>

<code>                </code><code>file</code> <code>"named.ca"</code><code>;  </code><code>#指定的檔案</code>

<code>        </code><code>#定義本本地的區域</code>

<code>        </code><code>zone </code><code>"localhost"</code> <code>IN {</code>

<code>                </code><code>type</code> <code>master;           </code><code>#類型屬于master、屬于自己的</code>

<code>                </code><code>file</code> <code>"named.localhost"</code><code>; </code><code>#指定的檔案</code>

<code>                </code><code>allow-transfer { none; }; </code><code>#不允許任何人傳送的</code>

<code>        </code><code>#定義反向解析的</code>

<code>        </code><code>zone </code><code>"0.0.127.in-addr.arpa"</code> <code>IN {</code>

<code>                </code><code>type</code> <code>master;            </code><code>#類型屬于master、屬于自己的</code>

<code>                </code><code>file</code> <code>"named.loopback"</code><code>;    </code><code>#指定的檔案</code>

<code>                </code><code>allow-transfer { none; };</code><code>#不允許任何人傳送的</code>

   配置檔案中的三個檔案named.ca、named.localhost、named.loopback上面已經提供有一個了named.ca了、還有這兩個named.localhost、named.loopback、同樣我們也得提供、也是在/var/named目錄下建立:

   # vim /var/named/named.localhost

<code>$TTL 86400    ;定義宏</code>

<code>@       IN      SOA     localhost       admin.localhost. (</code>

<code>                        </code><code>2014031101    ;序列号</code>

<code>                         </code><code>2H            ;重新整理時間</code>

<code>                         </code><code>10M            ;失敗時重試間隔時間</code>

<code>                         </code><code>7D            ;過期時間</code>

<code>                         </code><code>1D)            ;否定答案的時間</code>

<code>                 </code><code>IN      NS      localhost.</code>

<code>localhost.       IN      A       172.0.0.1</code>

   然後複制一份改寫named.loopback的檔案:

   # cp /var/named/named.localhost /var/named/named.loopback

   # vim named.loopback

<code>$TTL 86400</code>

<code>                         </code><code>2014031101</code>

<code>                         </code><code>2H</code>

<code>                         </code><code>10M</code>

<code>                         </code><code>7D</code>

<code>                         </code><code>1D )</code>

<code>1                IN      PTR     localhost.</code>

   如果想用rndc遠端登入可以生成一個/etc/named/rndc.conf的配置檔案:

   # /usr/local/bind9/sbin/rndc-confgen -r /dev/urandom &gt; /etc/named/rndc.conf 

   到這裡我們别忘了給named.conf和rndc.conf修改屬主屬組和權限:

   # chown root:named /etc/named/named.conf

   # chown root:named /etc/named/rndc.conf

   # chown root:named /var/named/*

   # chmod 640 /etc/named/named.conf

   # chmod 640 /etc/named/rndc.conf

   # chmod 640 /var/named/*

   為了友善、我們在PATH下加個的路徑、/etc/profile.d/named.sh:

   # vim /etc/profile.d/named.sh

   export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH

   在我們的終端重新登入一下就可以生效了

   好的、檢查一下我們的區域檔案有沒有文法錯誤、然後就可以啟動了:

   # named-checkzone "localhost" /var/named/named.localhost 

   # named-checkzone "0.0.127.in-addr.arpa" /var/named/named.loopback

   # named -u named    #這個表示以named使用者啟動named

   # ss -tunl | grep "\&lt;53\&gt;"  然後再檢視一下有沒有監聽53号端口

   最後、因為他是一個服務、是以我們要為他提供一個服務腳本、以後可以利用腳本啟動、編輯/etc/rc.d/init.d/named:

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

<code># vim /etc/rc.d/init.d/named</code>

<code>    </code><code>#!/bin/bash</code>

<code>    </code><code>#</code>

<code>    </code><code># description: named daemon  描述資訊</code>

<code>    </code><code># chkconfig: - 25 88    啟動和關閉級别</code>

<code>    </code><code># 啟動named的pid檔案、其實檔案路徑我們都可以自己指定的</code>

<code>    </code><code>pidFile=</code><code>/usr/local/bind9/var/run/named</code><code>.pid</code>

<code>    </code><code># 啟動服務時的鎖檔案、判斷一個服務是不是啟動是靠這個鎖檔案的</code>

<code>    </code><code>lockFile=</code><code>/var/lock/subsys/named</code>

<code>    </code><code># named的配置檔案路徑</code>

<code>    </code><code>confFile=</code><code>/etc/named/named</code><code>.conf</code>

<code>        </code><code># 判斷/etc/rc.d/init.d/functions路徑下的functios是否存在這個檔案、存在就sources進來</code>

<code>        </code><code>[ -r </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code> <code>] &amp;&amp; . </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>

<code>    </code><code># 定義啟動方法</code>

<code>    </code><code>start() {</code>

<code>            </code><code># 判斷鎖檔案是否存在、如果存在就說服務已經啟動并退出</code>

<code>            </code><code>if</code> <code>[ -e $lockFile ]; </code><code>then</code>

<code>                    </code><code>echo</code> <code>"named is already running..."</code>

<code>                    </code><code>exit</code> <code>0</code>

<code>            </code><code>fi</code>

<code>            </code><code># 列印服務已經啟動的資訊</code>

<code>            </code><code>echo</code> <code>-n </code><code>"Starting named:"</code>

<code>            </code><code># 調用functions中的daemon方法、并用--pidfile指定pid檔案在什麼地方、還指定使用者和配置檔案、我們本來是直接啟用named的、現在利用daemon這個函數來啟用這個服務、他會獲得很多額外的屬性、如果成功了會幫我們列印什麼[ OK ]的、還可以做判斷</code>

<code>            </code><code>daemon --pidfile </code><code>"$pidFile"</code> <code>/usr/local/bind9/sbin/named</code> <code>-u named -c </code><code>"$confFile"</code>

<code>            </code><code>RETVAL=$?</code>

<code>            </code><code>echo</code>

<code>            </code><code># 判斷上面的指令是否執行成功、說明啟動成功</code>

<code>            </code><code>if</code> <code>[ $RETVAL -</code><code>eq</code> <code>0 ]; </code><code>then</code>

<code>                    </code><code># 如果判斷成功、就建立鎖檔案</code>

<code>                    </code><code>touch</code> <code>$lockFile</code>

<code>                    </code><code>return</code> <code>$RETVAL</code>

<code>            </code><code>else</code>

<code>                    </code><code># 否則、就是失敗了、那就删除鎖檔案和pid檔案</code>

<code>                    </code><code>rm</code> <code>-f $lockFile $pidFile</code>

<code>                    </code><code>return</code> <code>1</code>

<code>    </code><code>}</code>

<code>    </code><code># 定義停止方法</code>

<code>    </code><code>stop() {</code>

<code>            </code><code># 如果鎖檔案不存在</code>

<code>            </code><code>if</code> <code>[ ! -e $lockFile ]; </code><code>then</code>

<code>                    </code><code># 說明服務還沒有啟動</code>

<code>                    </code><code>echo</code> <code>"named is stopped."</code>

<code>            </code><code>echo</code> <code>-n </code><code>"Stopping named:"</code>

<code>            </code><code>killproc named</code>

<code>            </code><code># 判斷以上的指令是否執行停止成功、如果成功</code>

<code>            </code><code>if</code> <code>[ $RETVAL -</code><code>eq</code> <code>0 ];</code><code>then</code>

<code>                    </code><code># 删除鎖檔案和pid檔案</code>

<code>                    </code><code>return</code> <code>0</code>

<code>                    </code><code># 否則列印說沒能正常停止</code>

<code>                    </code><code>echo</code> <code>"Cannot stop named."</code>

<code>                    </code><code># 調用functions中的函數、會列印失敗</code>

<code>                    </code><code>failure</code>

<code>    </code><code># 定義重新開機服務</code>

<code>    </code><code>restart() {</code>

<code>            </code><code># 調用停止方法</code>

<code>            </code><code>stop</code>

<code>            </code><code># 睡眠2秒</code>

<code>            </code><code>sleep</code> <code>2</code>

<code>            </code><code># 調用啟動方法</code>

<code>            </code><code>start</code>

<code>    </code><code># 定義重新加載服務方法</code>

<code>    </code><code>reload() {</code>

<code>            </code><code>echo</code> <code>-n </code><code>"Reloading named: "</code>

<code>            </code><code># killprco HUP信号、named程序的信号</code>

<code>            </code><code>killproc named -HUP</code>

<code>            </code><code>return</code> <code>$RETVAL</code>

<code>    </code><code># 定義服務狀态</code>

<code>    </code><code>status() {</code>

<code>            </code><code>if</code> <code>pidof named &amp;&gt; </code><code>/dev/null</code><code>; </code><code>then</code>

<code>                    </code><code>echo</code> <code>-n </code><code>"named is running..."</code>

<code>                    </code><code>success</code>

<code>                    </code><code>echo</code>

<code>                    </code><code>echo</code> <code>-n </code><code>"named is stopped..."</code>

<code>    </code><code># 定義錯誤提示資訊</code>

<code>    </code><code>usage() {</code>

<code>            </code><code>echo</code> <code>"Usage: named {start|stop|restart|status|reload}"</code>

<code>    </code><code>case</code> <code>$1 </code><code>in</code>

<code>    </code><code>start)</code>

<code>            </code><code>start ;;</code>

<code>    </code><code>stop)</code>

<code>            </code><code>stop ;;</code>

<code>    </code><code>restart)</code>

<code>            </code><code>restart ;;</code>

<code>    </code><code>status)</code>

<code>            </code><code>status ;;</code>

<code>    </code><code>reload)</code>

<code>            </code><code>reload ;;</code>

<code>    </code><code>*)</code>

<code>            </code><code>usage</code>

<code>            </code><code>exit</code> <code>4 ;;</code>

<code>    </code><code>esac</code>

   OK、到這裡儲存退出,給他個執行權限

   # chmod +x /etc/rc.d/init.d/named

   再加到chkconfig裡面去:

   # chkconfig --add named

   # chkconfig --list named

=============================我是分隔線==========================================  

本文轉自 wei0164 51CTO部落格,原文連結:http://blog.51cto.com/tanxw/1376088,如需轉載請自行聯系原作者