酷!學園
2010-09-03 13:15 *
歡迎光臨, 訪客. 請先 登入註冊一個帳號.
您忘了 啟用您的帳號嗎?

請輸入帳號, 密碼以及預計登入時間
新聞:
 
   首頁 | Study-Area | 鳥園 | 鳥哥的Linux私房菜   說明 搜尋 日曆 登入 註冊  
頁: [1]
  列印  
作者 主題: [分享] 一隻建立簡單 dns 的 script  (閱讀 7268 次)
0 會員 以及 1 訪客 正在閱讀本篇主題.
netman
管理員
俺是博士!
*****
文章: 15246



檢視個人資料 個人網站
« 於: 2003-12-06 00:26 »

在補習班及網路上常碰到一些朋友抱怨說 linux 的  dns 很難設。
但經我觀察,90% 都是打錯字而已~~~~  ^_^

於是我寫了隻 shell script ,可以幫助你建立簡單的正解及反解檔,
然後將剩下的"簡單"的部份,則由你自己來修改了...

download:
http://www.study-area.org/linux/src/sample_dns.sh.tgz

初版原始碼:
程式碼:
#!/bin/bash
set -u

# purpose: make a sample dns for RedHat like system
# author: netman<netman@study-area.org>
# date: 2003-12-05
# version: v.0.1

#-- CAVEATE --#
# 1) script has been tested only on RedHat 8.x/9.0 platform.
# 2) needs root privilege to run.
# 3) only one forward zone and one reverse zone will be created.
#       if no specified zone names are given, script will assume to
#       use the current DNS domain(using text.cxm instead if not found) for
#       forward zone's name, and the Class-C ipv4 subnet of current IP for
#       reverse zone's name.
# 4) the script can NOT determine whether you have the proper delegation,
#       you should manually delete ANY non-authorized zone settings.
# 5) only followint Resource Record will be create by this script:
#       * SOA (both forward & reverse)
#       * NS (both forward & reverse)
#       * MX (forward only)
#       * A (forward only)
#       * CNAME (www & ftp, forward only)
#       * PTR (reverse only)
# 6) a backup for named.conf and db directory will be made to /root/backup.
#       backup will be performed once during the first running only,
#       unless -b options is given.
# 7) absolutely NO WARRANTY while running this script.

#-- CHANGE LOG --#
# 1) 2003-12-05 v0.01 by netman
#       * first version.

options=hrstbf

named_conf=/etc/named.conf
db_dir=/var/named
bak_dir=/root/backup
wtty=$(ps | grep $$ | tail -n 1 | awk '{print $2}')
to_file=
backup=
update=

#-- get zone info --#
fwd_zone=$(hostname -d)
fwd_zone=${fwd_zone:-test.cxm}
host_if=eth0
host_ip=$(ifconfig | grep -A1 $host_if | awk '/inet/{print $2}' | sed 's/^.*://')
host_ip=${host_ip:-192.168.1.1}
rev_zone="$(echo ${host_ip%.*} | awk -F. '{print $3"."$2"."$1}').in-addr.arpa"
ns_ptr=${host_ip##*.}
serial_nu=$(date +%Y%m%d)01
opt_ttl=86400

function print_usage {
        echo "-------------------------------------------------------------"
        echo "Script Name:"
        echo -e "\t${0##*/}"
        echo "Options:"
        echo -e "\t-h\tprint this help"
        echo -e "\t-r\trun the script with default values"
        echo -e "\t-s\tspecify your own zone names"
        echo -e "\t-t\ttest only"
        echo -e "\t-b\tforce backup"
        echo -e "\t-f\tforce update db(s)"
        echo "Example:"
        echo -e "\troot_shell# $0 -tu"
        echo "-------------------------------------------------------------"
        exit 0
}

function print_choice {
        echo
        echo "Please select one:"
        echo "h): to print HELP."
        echo "t): to TEST the script only."
        echo "q): to QUIT."
        echo -n 'Your choice? '
        read action
        case $action in
                h|H) print_usage ;;
                t|T) exec $0 -t ;;
                q|Q) echo; exit 0 ;;
                *) print_choice ;;
        esac
}

echo $@ | grep -q "[^$options-]" || [ $# -eq 0 ] && {
        echo
        echo "${0##*/}: missing argument or invalid options."
        print_choice
}

function get_zone {
        echo
        echo "Which name you would like to assign to the $1 zone? "
        echo "(or press Enter for none): "
        read z_name
        echo $z_name | grep -q ' ' && {
                echo "Error: no space allowed in zone name."
                echo "  Press ctrl-c to abort or type again:"
                get_zone $1
        }
}

function run_spec {
        get_zone forward
        fwd_zone=${z_name%.}
        get_zone reverse
        rev_zone=${z_name%.}
        echo
        echo "Give the FQDN of your name-server"
        echo "(or press Enter for system defaults): "
        read ns_host
}

#-- prepare backup dir --#
test -d $bak_dir || {
        mkdir $bak_dir || {
                echo "${0##*/}: Error: Can't create backup dir: $bak_dir "
                exit 1
        }
}

#-- test permission --#
for target in $named_conf $db_dir $bak_dir; do
        [ -e $target ] || continue
        [ -w $target ] || {
                echo "${0##*/}: Error: you have no write perssion to $target"
                exit 2
        }
done

#-- make backup --#
function run_bak {
        cp -a $source $bak_dir || {
                echo "${0##*/}: Error:can't make backup for $source "
                exit 3
        }
}
function do_backup {
  for source in $named_conf $db_dir; do
        [ "$backup" = true ] && op=';' || op='||'
        eval test -e $bak_dir/${source##*/} $op run_bak
  done
}

#-- create default settings if missing --#
function create_raw {

  test -e $named_conf || {
        echo "${0##*/}: WARNING: $named_conf seems missing!"
        echo -n "Do you want me to create it for you? (y/N): "
        read YN
        echo $YN | grep -Eq 'Y|y' || return 0

  cat > $named_conf <<END
// generated by ${0##*/} on $(date)

options {
        directory "$db_dir";
};
zone "." IN {
        type hint;
        file "named.ca";
};

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; };
};

END


test -e $db_dir/named.ca || {
  cat > $db_dir/named.ca <<END
;       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  .  <file>"
;       configuration file of BIND domain name servers).
;
;       This file is made available by InterNIC
;       under anonymous FTP as
;           file                /domain/named.cache
;           on server           FTP.INTERNIC.NET
;
;       last update:    Nov 5, 2002
;       related version of root zone:   2002110501
;
;
.                        3600000  IN  NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     128.9.0.107
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
.                        3600000      NS    F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
.                        3600000      NS    G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
.                        3600000      NS    H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.      3600000      A     128.63.2.53
.                        3600000      NS    I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
.                        3600000      NS    J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30
.                        3600000      NS    K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129
.                        3600000      NS    L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET.      3600000      A     198.32.64.12
.                        3600000      NS    M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33
; End of File
END
}

test -e $db_dir/localhost.zone || {
  cat > $db_dir/localhost.zone <<END
\$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

END
}
test -e $db_dir/named.local || {
  cat > $db_dir/named.local <<END
\$TTL   86400
@       IN      SOA     localhost. root.localhost.  (
                                      1997022700 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
              IN      NS      localhost.

1       IN      PTR     localhost.

END
}

} # end of first test
} # end of function

#-- check named.conf --#
function check_conf {
  for zone in $@; do
        war_msg="${0##*/}: WARNING: \n\t$named_conf seems up-to-date. Nothing will be done. "
        adv_msg="If you really want to continue, you can:"
        [ -e $named_conf ] && grep -Eq "$zone" $named_conf && {
                echo -e "$war_msg"
                echo "$adv_msg"
                echo "1) delete '$zone' sections from $named_conf."
                echo "   OR:"
                echo "2) run '${0##*/} -f' to override db files in $db_dir."
                echo -e "   Note: this option will not modify $named_conf."
                exit 4
        }
  done
}

#-- modify named.conf --#
function mod_conf {
  for zone in $@; do
        [ "$to_file" ] && {
                echo "----> Content will be written to $named_conf :"
        }
        cat >> ${to_file:-$named_conf} <<END
zone "$zone" IN {
        type master;
        file "$zone";
};

END
  done
}

#-- modify rr db --#
function mod_rr {
  ns_host=${ns_host:-$(hostname -s).$fwd_zone}
  ns_host=${ns_host%.}
  [ "$fwd_zone" ] && {
        [ "$to_file" ] && {
                echo "----> Content will be written to $db_dir/$fwd_zone :"
        }
        cat > ${to_file:-$db_dir/$fwd_zone} <<END
\$TTL    $opt_ttl
@  IN  SOA $ns_host. root.$ns_host. (
                                      $serial_nu ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      604800     ; Expire
                                      86400 )    ; Minimum
@   IN  NS  $ns_host.

${ns_host%%.*}  IN A            $host_ip
www     IN CNAME        $ns_host.
ftp     IN CNAME        $ns_host.

END
  }

  [ "$rev_zone" ] && {
        [ "$to_file" ] && {
                echo "----> Content will be written to $db_dir/$rev_zone :"
        }
        cat > ${to_file:-$db_dir/$rev_zone} <<END
\$TTL    $opt_ttl
@  IN  SOA $ns_host. root.$ns_host. (
                                      $serial_nu ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      604800     ; Expire
                                      86400 )    ; Minimum
@   IN  NS  $ns_host.

$ns_ptr  IN  PTR $ns_host.

END
  } # end of test
} # end of function

#-- main script --#

while getopts ":$options" opt; do
        case "$opt" in
                h) print_usage ;;
                r) : ;;
                s) run_spec ;;
                t) to_file=/dev/$wtty ;;
                b) backup=true ;;
                f) update=true ;;
                \?) print_usage ;;
        esac
done

do_backup
create_raw

test "$update" = true || { check_conf $fwd_zone $rev_zone; mod_conf $fwd_zone $rev_zone; }
mod_rr
test "$to_file" || {
        echo "${0##*/}: Okay, all done!"
        echo "Don't forget to restart your named daemon and check log messages."
        echo "Enjoy!"
}

exit 0
已記錄
Tim
活潑的大學生
***
會員性別: 男
文章: 450



檢視個人資料 個人網站
« 回覆文章 #1 於: 2003-12-06 07:53 »

如果是做正反解的DATA,野人獻曝一下:
http://freebsd.lab.mlc.edu.tw/faq/dns_data.xls
這是使用 Excel 來建立資料,看看沒問題後再貼上去。
已記錄
netman
管理員
俺是博士!
*****
文章: 15246



檢視個人資料 個人網站
« 回覆文章 #2 於: 2003-12-06 19:50 »

更新:

# 2) 2003-12-06 v0.2 by netman
#       * improve options selection
# 3) 2003-12-06 v0.3 by netman
#       * improve name server hostname determination

http://www.study-area.org/linux/src/sample_dns.sh.tgz
已記錄
netman
管理員
俺是博士!
*****
文章: 15246



檢視個人資料 個人網站
« 回覆文章 #3 於: 2003-12-08 02:27 »

更新:

# 4) 2003-12-07 v0.4 by netman
#       * re-organize options dtermination, and add:
#               -c, -d, -e
已記錄
netman
管理員
俺是博士!
*****
文章: 15246



檢視個人資料 個人網站
« 回覆文章 #4 於: 2003-12-10 03:01 »

更新:

# 5) 2003-12-10 v0.5 by netman
#       * bug-fixed to solve:
#               - ip alias address: have primary only
#               - no dns domain: set to test.cxm
#               - no hostname: set to ns1
已記錄
被騎上班的老
酷!學園 學長們
活潑的大學生
***
文章: 345


檢視個人資料
« 回覆文章 #5 於: 2003-12-10 09:29 »

如果有 xwindow , RH 有一個小工具 bindconf ,不過中文化的時候翻的不太好,有空的人不妨看看怎麼翻會比較好。
已記錄
audiman
活潑的大學生
***
文章: 249


檢視個人資料
« 回覆文章 #6 於: 2003-12-10 09:43 »

哇....感謝netman的分享.....
以往要產生正反解的檔案都是偷懶法,用x-window下面的bindconf來產生這兩各檔案...再來改成自己的..
現在也有文字模式下產生檔案的方法了......讚
已記錄
francisyap
憂鬱的高中生
***
文章: 186


檢視個人資料
« 回覆文章 #7 於: 2003-12-10 12:25 »

netmant太偉大了..感謝您!!
已記錄
netman
管理員
俺是博士!
*****
文章: 15246



檢視個人資料 個人網站
« 回覆文章 #8 於: 2003-12-10 13:12 »

哦,過讚過讚、、、 ^_^

我的 script 只完成一半設定而已,還是免不了自己動手去改啦...
誠如前面所言:我只是將打錯字的機會降低一些而已~~~   ^_^
已記錄
netman
管理員
俺是博士!
*****
文章: 15246



檢視個人資料 個人網站
« 回覆文章 #9 於: 2003-12-12 21:25 »

# 6) 2003-12-12 v0.6 by netman
#       * bug-fixed to solve:
#               - backup dir detection
已記錄
harrier
榮譽博士
俺是博士!
*****
會員性別: 男
文章: 1746



檢視個人資料 個人網站
« 回覆文章 #10 於: 2003-12-15 14:42 »

引用自: "被騎上班的老鼠"
如果有 xwindow , RH 有一個小工具 bindconf ,不過中文化的時候翻的不太好,有空的人不妨看看怎麼翻會比較好。


RH 不少 GUI config 程式都有 bug,包括這個 bindconf...   X(

上回想試試,結果搞了半天還不如自己看著範例來設定快些...

按:所有必須在 /etc/alchemist 裡寫設定的程式,或多或少都會有
神經錯亂的時候,一旦錯亂,你怎麼手動改都會被程式『自作聰明』
的改回來,改對還好,偏偏有時會改錯...   @.@b
已記錄

...90Net(90:1200/1203),GameNET(99:700/707),ALLNet(92:9200/3111),InfoNet(30:100/103)..MaximusCBCS(浮懷),AirNet,TenderNet,StormNet,FidoNet...
<<- www.nas.vg ->>
頁: [1]
  列印  
 
前往:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC Valid XHTML 1.0! Valid CSS!
本頁花了 0.078 秒,以及 16 次的資料庫查詢。