歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網

動態域名

日期:2017/2/27 9:48:07   编辑:更多Linux
  這是一篇在台灣網站轉貼的文章,我覺得很有參考性,特別是像做動態DNS 的,所有對動態 DNS 有興趣的朋友都應該看的。由於時間關系,我沒有做過整理。 name.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 ※ 引述《[email protected] (ㄚ凱)》之銘言: > 小弟在之前就有提過相關的問題 > 大家用的動態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 ([email protected]) 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 也能輕松的進行更新﹐ 不過﹐這部份就需要其它朋友幫忙設定了



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 也能輕松的進行更新﹐ 不過﹐這部份就需要其它朋友幫忙設定了



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 也能輕松的進行更新﹐ 不過﹐這部份就需要其它朋友幫忙設定了



Copyright © Linux教程網 All Rights Reserved