歡迎您光臨本站 註冊首頁

[原創] 用 BIND 架設 DDNS Server 提供 DDNS 服務

←手機掃碼閱讀     火星人 @ 2014-03-05 , reply:0

用 BIND 架設 DDNS Server 提供 DDNS 服務

 1.前言
 目前動態 DNS 兩大主流,一個是 BIND (ISC),另一個就是套接 DB 的 DNS 如 PowerDNS (或 mydns)
  等,兩種方式各有好壞,主要是因為 BIND 會有一些複雜性,但效果非常好,而 PowerDNS 則是很簡單,
 但相對的它不能承受大量查詢,主要原因在於資料庫上先天的限制. 本文主要為介紹 BIND 之動態
 DNS 做法,而這個做法之最重要重點則在於nsupdate 這個指令及 IXFR (incremental zone transfer
 request),是不同於傳統的 AXFR (full zone transfer),IXFR 在做 Zone Transfer (DNS 的同步機制)
  時,會以差異化的部份進行同步, 而 AXFR 則是以整個 Zone 進行同步.DDNS 主要由 RFC 2136 構成,
 建議若您要對 DDNS 有一定深入的了解,可以閱讀這篇 RFC 以了解更多重要的資訊
 (1034 1035 1995 是 2136 的基礎)
 
 本文適用於對 DNS 巳有一定了解的朋友,若是不甚清楚建議您可先參考 TWNIC 所做的講義:
 http://dns-learning.twnic.net.tw/DNS94/
 
 
 如果你想對 nsupdate + key 的方法有更深入的了解可以參考
 http://www.study-area.org/tips/tipsfr1.htm
 或參考 isc bind 的文件有最詳細的解說
 http://www.isc.org/sw/bind/arm93/Bv9ARM.pdf
 本文不討論 view 的情形,若是 view 情形您必需從 view 的 match-client 去更新或是使用不同
 的 key,所以建議您多參考 isb bind 的文件,雖然辛苦些,但資料絕對是最官方最正確的
 
 
 2. 必要的資訊及知識
 本文的範例以 Shell Script 做成,重點在於原理,採用什麼工具或做法完全視您個人的能力.以下
 就一些重點進行說明.
 
 2.1 BIND 動態更新
 基本上在 BIND8,BIND9 都是支援 nsupdate 的,但這裡面要注意的是 BIND8 在8.3.X 後才支援
 IXFR,而 BIND9 則都支援,所以若您的 Server 在 8.3.0 前的版本,那就不建議了,更何況這個以
 前的版本多多少少都有許多安全性的問題.
 
 2.1.1 nsupdate:
 bind 要開 allow-update 選項,讓你的程式可以來執行更新指令,allow-update 選項可以是 IP 或
 key,而本文僅就 IP進行介紹,若用 Key 對有些朋友來說可能會變得稍複雜些了
 
 # named.conf
 # 其他略
 zone "dyndns.twnic.tw" {
         type master;
         file "dyndns.twnic.tw";
         allow-update {127.0.0.1;};    # 開放 127.0.0.1 進行動態更新       
         allow-transfer { slave_ip;127.0.0.1;};  # slave 主機,可能一部或多部,若無請寫 none
 };
 
 以上是開放讓 127.0.0.1 進行動態更新,動態更新有其指令,詳細您可看看 nsupdate man page
 (man nsupdate),以下僅以最常用的進行說明:
 
 #nsupdate
 # nsupdate
 > server 127.0.0.1
 > zone dyndns.twnic.tw
 > update delete user1.dyndns.twnic.tw A 211.72.210.249
 > update add user1.dyndns.twnic.tw A 211.72.210.251
 ttl 'A': not a valid number  # 這個例子是錯誤示範,加一筆記錄要有 TTL 值
 > update add user1.dyndns.twnic.tw 60 A 211.72.210.251
 > show
 Outgoing update query:
 ;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
 ;; flags: ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
 ;; UPDATE SECTION:
 user1.dyndns.twnic.tw.  0       NONE    A       211.72.210.249
 user1.dyndns.twnic.tw.  60      IN      A       211.72.210.251
 
 > send
 > quit
  
 server  指向某一台 NameServer 進行 update 操作
 zone    修改某個 zone file
 update delete  進行 update 的 delete 動作,這個指令格式是
         update delete FQDN TYPE RDATA,如果有多筆相同的 A
         記錄或不同的 MX 記錄要刪除某一筆需將 RDATA 補上,
         若沒有 RDATA 則表示這個 FQDN 的這個 TYPE 都要刪除
         (TYPE 即是 A,MX,PTR,SOA,NS..等,RDATA 就是 TYPE 後
         接的東西,如 A 的 RDATA 是 IP 而 MX 的 RDATA 是 優
         先權 FQDN)
 update add     進行記錄的增加,操作如同 delete, 但是一定要有
         TTL 值,且必需明確寫出 RDATA
 show    這只是操作後要顯示進行了那些 update 指令
 send    這個代表要把整個 update 指令送給 server,操作 update
         時資料不是馬上送出的,所以 update 可以很多行,最後
         nsupdate 看到 send 時,才會將整個所有 update 送出,
         而 update 使用 port 53/udp 若送出的資料量 (DNS packet)
         大於 512 bytes,則會 truncate 而改使用 53/tcp,這是您
         需要注意的地方,而只要您有 send, 則 SOA 記錄的 serial
         會自動加1,以期讓 slave 來進行同步,所以過多的 send 可
         能造成過多的 traffic
 
 
 2.1.2 zone file 及日誌檔
 如果您進行了 nsupdate 的操作,則原來 directory 所指的目錄將會產生一些日誌檔,這個日誌檔即為
 zone_name.jnl (directory 習慣上都設在 /var/named , 您自己必要注意 named 程式要有寫入的權限,
 chroot 狀況等)
 
 # 顯示 dyndns.twnic.tw zone file 內容
 # cat /var/named/dyndns.twnic.tw
 $TTL 86400      ; 1 day
 @         IN SOA  twnic.net.tw. snw.twnic.net.tw. (
                                 2006073267 ; serial
                                 7200       ; refresh (2 hours)
                                 1800       ; retry (30 minutes)
                                 2419000    ; expire (3 weeks 6 days 23 hours 56 minutes 40 seconds)
                                 300        ; minimum (5 minutes)
                                 )
                         NS      ns2.dyndns.twnic.tw.
                         NS      eai1.twnic.tw.
 ns2                     A       203.73.24.204
 ; 如果別人在查詢時,我們有這個記錄則回應這個記錄的 IP,若沒有這個記錄代表
 ; 這個網站沒有上線,所以此時我們可以建立一筆 wildcard 記錄,指向自己的說
 ; 明網站,以供 user 識別這個網站沒有上線,而這筆 wildcard 的記錄 TTL 時間
 ; 不能太長,以免別的 DNS Cache 了這資料
 *                 0    A       211.72.210.251
 
 
 
 # 目錄裏的東西
 # ls -la /var/named/
 總計 128
 drwxr-xr-x    2 named    named        4096  7月 27 09:25 .
 drwxr-xr-x   20 root     root         4096  3月 13 16:50 ..
 -rw-r--r--    1 named    named         451  7月 27 09:25 dyndns.twnic.tw
 -rw-r--r--    1 named    named      104177  7月 27 10:01 dyndns.twnic.tw.jnl
 -rw-r--r--    1 named    named         195  7月  4  2001 localhost.zone
 -rw-r--r--    1 named    named        2851 10月 17  2003 named.ca
 
 
 我們可以看到這個 .jnl 的產生,這個 .jnl 檔是不能隨便刪除,因為它等於是 dyndns.twnic.tw 的補
 充資料,而這些補充資料在 DNS reload/restart 時, named 還會在把它讀進來,所以動態更新後的資料,
 並不會隨著 dns 重啟後而消失,如果你想讓現在整個 zone 檔出現所有的記錄,那可以 rndc stop 來停止
 dns, 此時 named 會把 .jnl資料寫入原來的 zone file,不過這種方式一般來說較不建議,因為我們的 zone
  file 只要存一個樣版 (template),其他的東西都是臨時性的. 而若你想知道現在整個 zone 的內容,在可
 以做 zone transfer 的主機上(如上例為 slave_ip及 127.0.0.1), 以 dig 指令來執行 axfr:
 
 # dig @127.0.0.1 dyndns.twnic.tw axfr
 
 ; <<>> DiG 9.3.0 <<>> @127.0.0.1 dyndns.twnic.tw axfr
 ;; global options:  printcmd
 dyndns.twnic.tw.        86400   IN      SOA     twnic.net.tw. snw.twnic.net.tw. 2006073528 7200 1800 2419000 300
 dyndns.twnic.tw.        86400   IN      NS      ns2.dyndns.twnic.tw.
 dyndns.twnic.tw.        86400   IN      NS      eai1.twnic.tw.
 *.dyndns.twnic.tw.      0      IN      A       211.72.210.251
 ns2.dyndns.twnic.tw.    86400   IN      A       203.73.24.204
 user1.dyndns.twnic.tw.  60      IN      A       211.72.210.248
 user1.dyndns.twnic.tw.  60      IN      MX      10 user1.dyndns.twnic.tw.
 # 以下略
 ...
 
 
 2.設定 NameServer 僅進行差異化的同步
 Master/Slave 要進行 zone file 的同步,而 ddns server 若只有一部是可以不用考慮這些問題的,但是若有兩
 部以上的 DNS Server, 就需要考慮到同步的進行方式,若 zone file 的總資料量小,採用什麼同步方式是無所
 謂的,但若資料量多,或是經常處在變動狀況,那差異化的同步就會顯得很重要,因為它可以讓所有的 DNS 在短時
 間內全部同步完成,BIND 支援 IXFR 後,其預設即是採用 IXFR, 若沒有 IXFR (update) 時,則採用 AXFR,所以不
 需要對 IXFR 進行額外設定,但為使大家了解其參數,本處還是舉例來進行說明,好讓大家能夠更了解
 
 
 # master DNS's named.conf
 key "rndc-key" {
         algorithm hmac-md5;
         secret "HpXtFRFdLaRPFjpZokIwusyezyyRNjxhcafCfmktWNyGkDFzHAXlpTZQtVLc";
 };
 
 controls {
         inet 127.0.0.1 port 953
                 allow { 127.0.0.1; } keys { "rndc-key"; };
 };
 
 options {
         directory "/var/named";
         pid-file "/var/run/named/named.pid";
         allow-transfer { none; };
         provide-ixfr yes;   # 提供 slave 主機以 IXFR 同步,default yes
         request-ixfr yes;   # slave 以 IXFR 向 master 進行同步,default yes
         recursion no;       # 不允許遞迴查詢
 };
 zone "0.0.127.in-addr.arpa" {
         type master;
         file "named.local";
 };
 zone "." {
         type hint;
         file "named.ca";
 };
 zone "dyndns.twnic.tw" {
         type master;
         file "dyndns.twnic.tw";
         max-journal-size 500k;                      # 設定日誌檔大小
         allow-transfer { 203.73.24.204;127.0.0.1;}; # 可做 ixfr/axfr 的來源 IP,必需寫上 slave,
                                                     # 127.0.0.1 是方使我們自己查看 zone file 現況
         also-notify {203.73.24.205;211.72.210.251}; # 額外的同步主機,這可能是 hot site 備份主機
         allow-update { 127.0.0.1;};                 # 允許動態更新的來源
 };
 
 
 
 上述的東西相信只要對 BIND DNS 有一定了解的朋友應該都是沒有問題的,較不常出現的項目我都加上了的註解以利
 大家了解,而 slave 的設法都同於 master, 只有在 zone 的部份稍有不同:
 
 # slave DNS's named.conf
 # 其他設定皆同上,只有 zone ...稍有不同,同於一般的 slave zone,不需要再開 allow-update (default none)
 zone "dyndns.twnic.tw" {
         type slave;
         masters {211.72.210.249;};
         file "dyndns.twnic.tw";
         allow-transfer { none;};
 };
 
 
 
 所以從上述我們可以知道 DDNS for Master/Slave 您只要對 master 進行 update,每次的 update 送出 (send)
 會使該zone 的序號加一,只要 zone 有更新 , dns 會送出 notify 訊息給所有的 NS 主機(NS 記錄上所列的名稱
 伺服器),及可能的 also-notify 對象,使 slave 主機知道要進行同步,同步時優先採用 IXFR,若 master 不支援
 IXFR 則改使用 AXFR,以達到即使更新,及時同步的效果
 
 
 此外,有些做 DDNS 的公司可能對 IXFR 不了解,而是把所有的 zone type 都設成了 MASTER,然後對這些 NameServer
 進行 nsupdate , 這種做法也是可以的,不過中間若漏了一步或那一台少做了一件事,那兩邊的資料就會不一致,導致
 可能同一個名稱會有不同的解析結果 (例如 gnway.net 做法)

《解決方案》

    3. DDNS 的前端及後台控制範例
 說是範例主要是讓大家參考原理,並沒有必要一定都用我的方式,只要前面講的東西您可以了解,程式控制的部份
 僅是末節,以下僅列出我所用的方式供大家參考
 
 3.1 MYSQL table
 主要由三個表構成,分別為 RR (Resource Record), RR_LOG (舊資料,建議您依狀況適當保存),USER (user 認證)
 
 CREATE TABLE RR (
   SN int(20) NOT NULL auto_increment,
   USERNAME varchar(64) NOT NULL default '',
   FQDN varchar(64) NOT NULL default '',
   TTL int(5) NOT NULL default '60',
   TYPE varchar(10) NOT NULL default '',
   RDATA varchar(64) NOT NULL default '',
   CREATE_TIME timestamp(14) NOT NULL,
   PRIMARY KEY  (SN),
   KEY USERNAME (USERNAME),
   KEY FQDN (FQDN),
   KEY TTL (TTL),
   KEY TYPE (TYPE),
   KEY CREATE_TIME (CREATE_TIME)
 ) TYPE=MyISAM;
 
 --
 -- Table structure for table 'RR_LOG'
 --
 
 CREATE TABLE RR_LOG (
   SN int(20) NOT NULL default '0',
   USERNAME varchar(64) NOT NULL default '',
   FQDN varchar(64) NOT NULL default '',
   TTL int(5) NOT NULL default '60',
   TYPE varchar(10) NOT NULL default '',
   RDATA varchar(64) NOT NULL default '',
   CREATE_TIME varchar(14) default NULL,
   PRIMARY KEY  (SN),
   KEY USERNAME (USERNAME),
   KEY FQDN (FQDN),
   KEY CREATE_TIME (CREATE_TIME)
 ) TYPE=MyISAM;
 
 --
 -- Table structure for table 'USER'
 --
 
 CREATE TABLE USER (
   SN int(20) NOT NULL auto_increment,
   USERNAME varchar(64) NOT NULL default '',
   PASSWD varchar(64) NOT NULL default '',
   EMAIL varchar(64) NOT NULL default '',
   MEMO varchar(255) NOT NULL default '',
   PRIMARY KEY  (SN),
   UNIQUE KEY USERNAME (USERNAME)
 ) TYPE=MyISAM;
 
 3.2 dyndns.cfg 設定檔
 這個設定檔主要為了給 CGI 程式及產生 nsupdate 的程式 (dyndns-cron.sh) 所使用,透過 eval 方式來執行,
 以取得共同的變數
 
 # mysql host/db/user/password
 DBHOST=localhost
 DBNAME=dyndns
 DBUSER=UserName
 DBPASS=Your_Passwd
 MYSQL="mysql $DBNAME -h $DBHOST -u $DBUSER -p$DBPASS"
 
 # dyndns domain
 DOMAIN=dyndns.twnic.tw
 
 # Master IP
 DYNDNS_MASTER=127.0.0.1
 
 # nsupdate command file
 CMD_FILE=/tmp/nsupdate.cmd
 
 # update freqency
 UPD_FREQ=15
 
 # RR valid time (seconds),default 20 mins
 RR_ALIVE=1200
 
 
 
 3.3 dyndns.cgi CGI 程式
 這個 CGI 主要用於接收 USER 端來的資訊,驗證通過後即為把 USERNAME.DOMAIN 資料,A/MX 及對應 IP 存入
  Table RR 中,此外這個 CGI 以 shell script 做成,可以於多數人的環境執行 (chmod 755 及目錄的 CGI 執
 行權限 ExecCGI 莫忘)
 
 #!/bin/sh
 echo -ne "Content-Type: text/html\n\n"
 
 if [ -n "$QUERY_STRING" ];then
 # 取得 QUERY_STRING,以下這個作法是危險的,因為沒有檢查資料的正確性就 eval
 # 我的用意只在於說明作法
         eval `echo "$QUERY_STRING" | sed "s/&/;/g"`
 # 讀取設定檔,這個路徑您需要自行調整
         eval `cat /home/abelyang/dyndns/dyndns.cfg `
         sql0="select 1 from USER where USERNAME='$LOGIN' and PASSWD='$PASSWD'"
         res=`echo $sql0 | $MYSQL `
 # 如果 USER 密碼正確, ${#res} 應為2,不對則為 0
         if [ ${#res} -lt 1 ];then
                 echo "Login Failure"
         else
 # 取得 IP, 需判斷有 Proxy 存在,但是不考慮 Proxy 後是 NAT 情形
                 IP=${HTTP_X_FORWARDED_FOR:-$REMOTE_ADDR}
                 FQDN="$LOGIN.$DOMAIN"
 # 刪除上一次的登入
                 sql1="delete from RR where USERNAME='$LOGIN'"
 # 預設的動態更新項目為 A/MX
                 sql2="insert into RR(USERNAME,FQDN,TYPE,RDATA) values('$LOGIN','$FQDN','A','$IP')"
                 sql3="insert into RR(USERNAME,FQDN,TYPE,RDATA) values('$LOGIN','$FQDN','MX','10 $FQDN')"
                 echo $sql1 | $MYSQL
                 echo $sql2 | $MYSQL
                 echo $sql3 | $MYSQL
                 echo $LOGIN login success @$IP
         fi
 else
 # 以下只是網頁的部份,我沒有做 DDNS 申請,這個部份我想只要懂網頁的朋友應該都會才是
         cat <<EOF

 
 
 
 
 
 


 

 

Abel Dyndns Demo


 Login:

 Passwd:

 
 

 

 
 
 
 EOF
 
 
 fi
 
 
 3.4 dyndns-cron.sh 定時產生 nsupdate
 這隻程式主要進行讀取 Table RR , 並產生 nsupdate 所需要的指令格式後執行 nsupdate, 程式預設
 每15秒執行一次(參數如上 dyndns.cfg 中的 UPD_FREQ 更新頻率),您可以拿掉 while [ 1 ] 的迴圈,
 改用 crontab 方式來跑,不過這樣就較不容易控制一分鐘以內的更新頻率了,最後,這個程式會把 SOA
 的序號改成更新時間,這個時間是 UTC 的秒數(意即 1970/1/1 至今秒數, date +%s 可得),由 SOA 的
 序號就可以知道最後的 update 時間,這個原理和 .com 的verisign 或是 dyndns 中的 dyndns.org/
 noip.com 是相同的.
 
 另外,根據 RR_VALID 參數,若 USER 的登錄時間 小於 現在時間-RR_VALID (秒數),則該 Record 視同
 離線,所以我們需要進行 delete 動作
 
 
 #!/bin/sh
 
 while [ 1 ]
 do
 # 您必需調整路徑,放在 while loop 裏是要讓修改了設定檔即可生效,若不要可放在 while 之外
         eval `cat /home/abelyang/dyndns/dyndns.cfg`
         cat <$CMD_FILE
 server $DYNDNS_MASTER
 zone $DOMAIN
 EOF
 
 # 取得最後一次的更新時間, 多減一秒是為了預防程式的 delay
         last=`date -d "-$UPD_FREQ seconds -3 seconds" "+%Y%m%d%H%M%S"`
         now=`date "+%Y%m%d%H%M%S"`
 
 # 取得這段時間內有上來更新的 USER,這個部份不檢查 IP 不變動情形
 # 主要因為 nsupdate 巳執行很快,而且 named 它自己會檢查重覆更新的東西
         echo "select FQDN,TTL,TYPE,RDATA from RR where CREATE_TIME between $last and $now" | $MYSQL| grep -v 'RDATA' | while read FQDN TTL TYPE RDATA RDATA2
         do
 
 # 組出更新指令,主要為一個刪除,一個增加
                 echo "update delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
                 echo "update add $FQDN $TTL $TYPE $RDATA $RDATA2" >>$CMD_FILE
         done
 
 # 超過 RR_ALIVE (20分鐘) 未有 login 資料則清除 DNS 記錄
         last=`date -d "-$RR_ALIVE seconds" "+%Y%m%d%H%M%S"`
 # 備份舊的資料,並清除過時資料 (看你自己要不要備份了)
 #       echo "insert into RR_LOG select * from RR where CREATE_TIME<$last"|$MYSQL
 #       echo "delete from RR where CREATE_TIME < $last" |$MYSQL
 
 # 取得過期 (RR_ALIVE) 而未登錄的列表進行刪除動作,因為我們用了 wildcard (*),所以若別人連時
 # 將會被指到 wildcard 所指的 IP 上,而您可這個 Web Server 上做一些文章,例如 Offline 說明等
         echo "select USERNAME,FQDN,TYPE,RDATA from RR  where CREATE_TIME - $last < 0 order by USERNAME" | $MYSQL | grep -v 'USERNAME' | while read USERNAME FQDN TYPE RDATA RDATA2
         do
                 echo "; delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
                 echo "update delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
         done
 
 # 自定更新 SOA, 主要是為了讓序號欄位為現在時間 (UTC)
         echo "update delete $DOMAIN SOA" >>$CMD_FILE
         echo "update add $DOMAIN 600 SOA ns1.dyndns.twnic.tw abelyang.eai1.twnic.tw $(date +%s) 900 60 604800 60" >>$CMD_FILE
         echo "send" >>$CMD_FILE
 # 執行 nsupdate 指令
         nsupdate $CMD_FILE
 #       echo "process ok"
         sleep $UPD_FREQ
 done
 
 
 
 
 3.5 登入及更新方法
 所有的東西都準備好了後,我們就可以測試:
 
 wget "http://eai1.twnic.tw/dyndns.cgi?LOGIN=abelyang&PASSWD=abelyang-dyndns" -O /tmp/dyndns-login-status 2>/dev/null
 
 在最多等待15秒(我的預設值)的情況下,就可以更新到 DNS 中了
 
 3.6 其他資料
 其他資料如 named.conf , dyndns.twnic.tw zone file 您都可以在前面的說明裏找到,我於下面 link
 放了一份所有的資料供大家參考,較不用費事 copy & paste ,但不保證下面 link 永遠有效 (其中的
 .tgz 即有所有檔案的 tarball)
 http://eai1.twnic.tw/example/
 
 
 4. DDNS 再探討
 如前言所言, DDNS 可以使用資料庫來用 (意即我的範例中可以少掉 dyndns-cron.sh 那隻),不過資料庫
 因其先天的狀況,更據我的測試(PowerDNS),在 5 萬資 Record 的情況下,只能到達每秒 1000 次的查詢,
 而且此時尚不考量同時有 update/delete/insert 等情形,主要因為受限於先天 DB 的 select 速度所致
 ,當然您可以透過微調或細部處理讓這個數字變成1500 或 2000, 但都永不如 BIND 隨便都可以透過每秒
 6000 次查詢,當然用 DB 直接來做一定是可以且更簡單的,不過安全性及抗壓性 PowerDNS 是隨時都會有
 當掉的風險,至於用 BIND 倒是沒有看過,主要是因為這種 Server 肯定是不遞迴(recursion no). 所以
 著名的 DDNS 廠商都是用 BIND 而不用 DB 方式,因其抗壓性不足而致風險過高.
 
 此外,若我們看 dyndns.org/noip.com 的做法,可以知道他們也是用 BIND 來做,你可以查詢其 SOA 的序
 號即可以知道他每60秒更新一次,若是使用 DB 來做是沒有必要顧慮序號問題的 (DB 有 DB 同步方法,用
 SOA 序號無關),此外您更可以查看 .com 的 Verisign,他們的做法也是像 BIND 一樣,而其以每15秒更新
 頻率在進行,所以若您使用 .com 的域名,變更DNS 大概只要15秒就可以同步到所有的 .com NameServer,
 而不是過去的2天 (因為過去是 AXFR,現在是 IXFR),雖然Verigisn 仍不降低 NS 記錄的 TTL 值 (二天),
 但至少不會發生像過去最多會4天 .com 的 DNS 資料 Cache 才會過期的情況 (二天的更新頻率+二天的
 快取時間)
 
 
 # 檢查 .com 的 NameServer (d.gtld-servers.net) SOA 資訊來驗證
 # for i in `seq 1 1000`;do dig +short @d.gtld-servers.net com soa;sleep 1;done
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990708 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990708 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990708 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900 # 這裡變更了, serial 即時間
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990738 1800 900 604800 900 # 變更序號
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990738 1800 900 604800 900
 a.gtld-servers.net. nstld.verisign-grs.com. 1153990738 1800 900 604800 900
 
 
 
 
 5. 結語
 我所寫的 script 都是以簡單的角度來出發,以供大家參考,至於用戶及域名管理這個有待想要用的人自行
 開發,用 shell script 有利於多數人閱讀及了解原理,細節的東西唯有您自己做了後才更能體會.
 對多數的公司來說使用 DDNS 是沒有意義的,除了 Registy (.com/cn/tw/jp/hk...),或是以 DDNS 做為營
 運的公司,而 DDNS其實是不難的,但是網路上較缺乏這方面的介紹文章,所以在此為大家介紹一下這些東西
 的細節, 以利想要研究的朋友能初窺門徑. 有任何意見都非常歡迎大家多多交流
 
 
 
 
 
 
 註:
 此外,有些做 DDNS 的公司可能對 IXFR 不了解,而是把所有的 zone type 都設成了 MASTER,然後對這些
 NameServer進行 nsupdate , 這種做法也是可以的,不過中間若漏了一步或那一台少做了一件事,那兩邊
 的資料就會不一致,導致可能同一個名稱會有不同的解析結果 (例如 gnway.net 做法,我猜測),而像 dyndns.org
 /noip.com 和花生殼(vicp.net,oray.net) 等的做法是一樣的(也就是和本文所提的做法一樣). 而有些
 公司則使用 PowerDNS/Mydnl..等套接 DB 的 DNS ,雖然可用,而且方式更簡單,但是這些 DDNS 服務肯定
 無法負荷大量的查詢,因為每次的 dns 查詢會在其內產生 N 次的 Select 指令,資料庫處理 select 的
 速度肯定是比不上 dns flooding 的速度
 
 
 
 ==== 每帖不得超過 20000 字,每次發帖不能小於30秒,這不是叫人不寫文章嗎 ======

[ 本帖最後由 abel 於 2006-7-28 14:56 編輯 ]

《解決方案》

   
 request-ixfr yes;   # slave 以 IXFR 向 master 進行同步,default yes
 
 
 這一句是否應該放在 slave 中,而不是 master ?

《解決方案》

    好!
 
 請問這個和花生殼,科邁等的有何區別?

《解決方案》

    好!

《解決方案》

   
 這一句是否應該放在 slave 中,而不是 master ?
 
 ailms 說的沒有錯,不過是無所謂,因為 master 資料是不會有 request-ixfr 的需求,
 而 slave 有時候兩個都要設
 
 
 請問這個和花生殼,科邁等的有何區別?
 
 這是教大家 花生殼,科邁 是怎麼做的,沒有什麼區別,不過跟據我實測的結果,
 花生殼是和本文的用法一樣,而科邁 SOA 序號中總不一致,我認為科邁在 DDNS
 上的實現或許可能有問題

《解決方案》

    支持. 沒做過, 要試試.

《解決方案》

    不錯,做成PDF文檔供下載就更好了。

《解決方案》

    簡單的說就是通過下載一個網頁實現ddns域名,我就不明白花生殼搞那麼大一個客戶端幹什麼,乾脆告訴別人用myie自動刷新或者用wget建立定時任務就可以了。其實就用系統預設的bind,cgi用perl就可以了,cgi裡面讀出客戶端的ip,然後寫到一個臨時文件/tmp/ddnstmp 然後調用系統自帶的軟體nsupdate < /tmp/ddnstmp就可以更新域的地址,nsupdate命令只要
 update delete xxx.omain.com.
 update add xxx.omain.com. 120 A 123.123.123.123
 send
 quit
 4 行就搞定了,120是120秒。123.123.123.123 是xxx.omain.com的新的ip地址
 不需要配置mysql bind和搞那麼複雜的命令,簡單的可以用手工
 nsupdate < file 然後nslookup把server設為自己的dns server看域名ip改了沒有。
 當然named.conf中allowupdate要設好。

[火星人 ] [原創] 用 BIND 架設 DDNS Server 提供 DDNS 服務已經有323次圍觀

http://coctec.com/docs/service/show-post-39191.html