架設動態 DNS 服務器: 讓你成爲 ISP 啦

http://vbird.dic.ksu.edu.tw/linux_server/0350dns_6.php#ddnsphp


http://www.study-area.org/tips/ddns.htmhtml


這本來是Leo 兄的來信指教﹐由於實在太有參考價值了﹐因而公諸同好。linux

全部對dynamic dns 技術有興趣的朋友﹐都應該看的。shell



--windows

----- Original Message -----安全

From: LeoLioubash

To: netman併發

Sent: Monday, February 11, 2002 6:59 AMless

Subject: about dnsdom



Hi, kenny:


       我是Leo,很久不見囉~~ 在此跟您拜個年,新年快樂喔~ :-)


       放假回來翻了您的DNS 教學,嗯,太棒囉,補充了許多許多的新東西,

       昨天我回了一篇有關"動態IP 架站" 的討論文章,裏面是提到動態更新

       DNS 的,自行架設Dynamic DNS 與client 端的script 更新,不過我在

       DNS 中,不是使用allow-update,而是使用update-policy,update-policy

       比起allow-update 更有彈性,比方,能夠限定什麼key 能夠作什麼事。


       舉例來講,個人named.conf 長得像是這樣..


       // --------------- 宣告Key 的部分---------------

       // P.S: 底下的 leo, mail key 是不正確的

       key "leo" {

               algorithm hmac-md5;

               secret "hB/XM2eFTyxA5r/scautOZ==";

       };


       key "mail" {

               algorithm hmac-md5;

               secret "ht5TkKKFP5l8u9ZTcDbStw==";

       };



       // --------------- 宣告ZONE 的部分---------------

       zone "sayya.org" {

           type master;

           file "named.sayya";


           notify yes;


           also-notify {

                 140.128.78.250;

                 211.23.99.147;

                 61.218.164.83;

           };


           allow-transfer {

                 140.128.78.250;

                 211.23.99.147;

                 61.218.164.83;

           };


           allow-query {

                 0.0.0.0/0;

           };


           update-policy {

                 // 使用mail HOST 的key,僅有權限變動mail.sayya.org 與rsync.sayya.org 的A record

                   grant mail name mail.sayya.org. A;

                 grant mail name rsync.sayya.org. A;

                 // 使用leo USER 的key,能夠徹底控制sayya.org,比方新增一subdomain,指定DNS

                 // 或是增長一 A, CNAME,TXT.. record 等等

                 grant leo subdomain sayya.org. ANY;

           };


       };


       大概就是這個樣子,另外附上以前回覆的那篇..


--------


做者: leoliou (暖冬) 看板: Linux

標題: Re: 動態 IP 架站 @_@

時間: Sun Feb 10 14:49:30 2002


※ 引述《skchen.bbs@bbs.nsysu.edu.tw (ㄚ凱)》之銘言:

> 小弟在以前就有提過相關的問題

> 你們用的動態IP對映的系統都不同

> 我是用 DynDNS 的系統

> 也不知道爲何跑了一段時間就會產生一大堆殭屍程序@_@

> 更神的是找不到程序在哪裏(仍是我比較遜腳????) @_@

> 這好像是DynDNS 給的ddClient 程式有BUG 吧

> 我利用了perl 和bash shell script 寫了一些小程式

> 能夠用來偵測PPP 介面是否存在

> 若是不存在就連線 ^o^


 嗯,看到這封信感受是真的有討論的氣氛,超喜歡這種感受~ :)


 記得之前還用ADSL 撥接制的時候,是使用rp-pppoe 連線的,會在斷線後自動

 從新連線,這個能夠解決斷線的問題。


 再來是重點了,Dynamic IP 怎麼辦呢?我目前的環境是雙向 Cable,IP 也是由

 DHCP Server 取得 Dynamic IP 的。固然,若是您去申請dns2go 相似的程式,

 是能夠解決您動態IP 的問題,可是缺點是您不可使用本身的網址,必定要是

 某一些已經律定好的網址,或者是有可能要求您把Primary DNS 指向該公司代

 管,另外,就是您可能還要在Server 中執行該公司所提供的動態IP 更新程式..

 不管如何,就會讓我聯想到系統安全性的問題.. 對我來講,很是不方便。


 因而,我找了一臺固定IP 的Server,架上了Bind,這臺就是我本身網域的

 Primary DNS,也就是Dynamic DNS,如何設定,晚點提到。而這臺 DNS 的

 固定IP 假設爲61.22.33.20,Domain 爲example.com,註冊名稱爲

 ns.example.com :)


 再來,比方個人mail server 架在家裏,就是我如今雙向Cable 的線路上,

 這臺mail server 的Domain name 假設爲: mail.example.com

 我只要定時向個人Primary DNS 更新個人mail server 的IP 就能夠囉,


 Primary DNS 怎麼判斷容許哪些電腦作更新呢?有兩種方式,第一種方式爲

 在Primary DNS 中設定allow-update,設定某些固定IP 能夠向Primary

 DNS 更新資料,可是比較沒有彈性。另一種就是待會要介紹的

 update-policy。


 allow-update 能夠容許特定的IP 或key 來作動態更新,預設是不容許任何

               IP 更新。


 update-policy 在BIND 9 才提供,不用指定某特定的IP 才能夠作動態更新,

               而是要憑 key 來決定更新權限。 Primary DNS 有這個 key,

               mail server 日後只要憑這個key 就能夠動態更新IP 了。

               固然了,mail server 與Primary DNS 的key 得同樣才行。


 key 就是用dnssec-keygen 工具產生出來的簽證,如今於Primary DNS

 上,產生 key,併發給 mail server。


 首先,感生 mail server 用的 key:


   # dnssec-keygen -a HMAC-MD5 -b 128 -n HOST mail

   Kmail.+157+44587

   #


 查看一下,結果會產生了檔名相似Kmail.+157+44587.key 與

 Kmail.+157+44587.private 兩個檔案。


 其中Kmail.+157+44587.key 檔案內容長得相似這樣:


   # less Kmail.+157+44587.key

   mail. IN KEY 512 3 157 BJ7y6dzxchy3u0B4hRLksQ==

   #


 檔案內容BJ7y6dzxchy3u0B4hRLksQ== 這是編碼過的,就是所謂的key。


 首先,您得將這兩個key 複製到mail server 上面,建議使用sftp 傳輸,

 避免被竊。


 如今,開始 Primary DNS 上的設定了。


 ----- /etc/named.conf ----------


 key "mail" {

         algorithm hmac-md5;

         secret "BJ7y6dzxchy3u0B4hRLksQ==";

 };


 zone "example.com" {

         type master;

         file "named.example";


         update-policy {

           grant mail name mail.example.com. A;

           // mail key 僅容許更新mail.example.com 的A record.

         };

 };


 ----- End of File ----------


 Primary DNS 上面的設定完成後,請記得重跑bind。


 接下來,在mail server 方面,要如何更新呢?


 固然,最重要的,首先要取得mail server 的key。剛剛已經有提到,

 在Primary DNS 產生後,用ftp 傳輸到mail server 來。


 使用nsupdate 工具向Primary DNS 作更新動做:


   $ nsupdate -k Kmail.+157+44587.key

   > server ns.example.com // 指定Primary DNS

   > update delete mail.example.com A // 先刪除舊資料

   > update add mail.example.com 0 A 210.64.233.10 // 再新增資料

   > send // 送出到Primary DNS

   $ // Ctrl-C or Ctrl-D 離開


 驗證一下,是否是更新成功:


   $ host mail.example.com ns.example.com

   mail.example.com has address 210.64.233.10

   $


 恭喜您更新成功了,若是您沒有成功,請到Primary DNS 上看messages 紀錄檔。

 注意, key 檔案的權限,應該只有owner 能夠讀寫,應爲-rw------- 請注意。

 執行nsupdate 的user,應爲key 的owner,不然會發生Permission denied

 的情形。


 若是您要讓您的電腦自動更新,這裏有我本身寫的script 供參考:


 創建一個 tmp.txt 內容以下:


 ----- tmp.txt ----------

 server ns.example.com

 update delete mail.example.com A

 update add mail.example.com 0 A SERVER_NEW_IP

 send

 ----- End of File ----------


 創建更新的 script: newip.sh


 ----- newip.sh ----------

 #!/bin/sh

 #

 # Written by LeoLiou.

 #


 # config the update dir.

 exe_path=/root/nsupdate


 new_IP=`/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f 2 \

 | cut -d' ' -f1`


 /bin/cat $exe_path/tmp.txt | sed s/SERVER_NEW_IP/$new_IP/g \

 > $exe_path/update.txt


 # update now IP to name server.

 /usr/bin/nsupdate -k $exe_path/Kmail.+157+44587.key -v $exe_path/update.txt

 ----- End of File ----------


 請將您的key, tmp.txt, newip.sh 放置於同一目錄,並給予newip.sh 執行權限。

 請執行一次newip.sh 肯定沒有問題以後,再利用crontab 執行newip.sh 便可。


 0 * * * * /root/nsupdate/newip.sh


 這樣就完成整個動態 IP 更新機制了。


 關於update-policy,請看BIND 9 Administrator Reference Manual:


 http://www.isc.org/products/BIND/bind9.html


 dnssec-keygen 與nsupdate 的使用方法,相信man page 寫得已經很清楚了。

 :-)


--

 Leo Liou (leo@i18n.linux.org.tw)


 Join i18n project: http://i18n.linux.org.tw/



* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~


---------------

補充 by netman on October 30, 2002﹕

---------------


我略爲修改了Leo兄的script ﹐並置於/root/nsupdate 目錄下面。

我這裏將界面改成ppp0 ﹐同時也減小沒必要要的傳送動做。

(注﹕本來的tmp.txt 我也更名爲nsupdate.scr 了﹐請留意。)


內容以下﹕


#!/bin/bash

#

# Written by LeoLiou.

# Modified by netman on 2002/09/26

#


# set variables

if echo $0 | grep '^/' ; then

   w_dir=${0%/*}

else

   w_dir=$PWD/${0%/*}

fi

KEY_FILE=$w_dir/Kmail.+157+44587.key

UPDATE_SCR=$w_dir/nsupdate.scr

UPDATE_DATA=$w_dir/nsupdate.data

HOST_NAME=mail.example.com

NS_SERVER=ns.example.com

IF="ppp0"


# ensure key files

for file in $KEY_FILE ${KEY_FILE%key}private

do

   if [ ! -r $file ]; then

       echo "$(basename $0): ERROR: $file is not readable."

       exit 1

   fi

done


# prepare initial script

test -f $UPDATE_SCR || {

   cat >| $UPDATE_SCR <<-ENDSCR

           server NS_SERVER

           update delete HOST_NAME A

           update add HOST_NAME 0 A NEW_IP

           send

ENDSCR # <----- 請將ENDSCR 前面的空白換成tab !

   test "$?" = "0" || {

       echo "$(basename $0): ERROR: could not create $UPDATE_SCR."

       exit 2

   }

}


# ensure the server is connectable

host $NS_SERVER $NS_SERVER | grep "$NS_SERVER" &>/dev/null || {

   echo "$(basename $0): ERROR: could not contact nameserver $NS_SERVER."

   exit 3

}


# get current ip

NEW_IP=$(ifconfig | grep "$IF " -A 1 \

   | awk '/inet/ {print $2}' | sed -e 's/.*://')


# do a test then update

host $HOST_NAME $NS_SERVER | grep "$NEW_IP" &>/dev/null || {

   /bin/cat $UPDATE_SCR | sed s/NEW_IP/$NEW_IP/ \

       | sed s/NS_SERVER/$NS_SERVER/ \

       | sed s/HOST_NAME/$HOST_NAME/ \

       >| $UPDATE_DATA

   /usr/bin/nsupdate -k $KEY_FILE -v $UPDATE_DATA || rm -rf $UPDATE_DATA

}


#-- end of script --#


上面的 script 可於這裏下載:

http://study-area.ks.edu.tw/linux/src/newip.sh.tgz


目前這個script 只能在linux client 上執行﹐

但我想﹐透過簡單的cgi 功能﹐那麼任何的windows client 也能輕鬆的進行更新﹐

不過﹐這部份就須要其餘朋友幫忙設定了。

假如您已經成功完成了﹐歡迎通知leo 或netman ﹐以便和你們做更進一步的分享。


謝謝﹗

相關文章
相關標籤/搜索