亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 10517 | 回復(fù): 16
打印 上一主題 下一主題

[DNS] [原創(chuàng)] 用 BIND 架設(shè) DDNS Server 提供 DDNS 服務(wù) [復(fù)制鏈接]

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-07-28 14:50 |只看該作者 |倒序?yàn)g覽
[分享] 用 BIND 架設(shè) DDNS Server 提供 DDNS 服務(wù)

版權(quán)宣告
歡迎轉(zhuǎn)載 ,但有任何修改請(qǐng)來信告知,不得作為商業(yè)用途
作者: abelyang <abelyang{at}twnic{dot}net{dot}tw>
version: 1.0
最後修正時(shí)間: 2007/07/28 00:10
轉(zhuǎn)載時(shí)請(qǐng)保持此一宣告

1.前言
目前動(dòng)態(tài) DNS 兩大主流,一個(gè)是 BIND (ISC),另一個(gè)就是套接 DB 的 DNS 如 PowerDNS (或 mydns)
等,兩種方式各有好壞,主要是因?yàn)?BIND 會(huì)有一些複雜性,但效果非常好,而 PowerDNS 則是很簡單,
但相對(duì)的它不能承受大量查詢,主要原因在於資料庫上先天的限制. 本文主要為介紹 BIND 之動(dòng)態(tài)
DNS 做法,而這個(gè)做法之最重要重點(diǎn)則在於nsupdate 這個(gè)指令及 IXFR (incremental zone transfer
request),是不同於傳統(tǒng)的 AXFR (full zone transfer),IXFR 在做 Zone Transfer (DNS 的同步機(jī)制)
時(shí),會(huì)以差異化的部份進(jìn)行同步, 而 AXFR 則是以整個(gè) Zone 進(jìn)行同步.DDNS 主要由 RFC 2136 構(gòu)成,
建議若您要對(duì) DDNS 有一定深入的了解,可以閱讀這篇 RFC 以了解更多重要的資訊
(1034 1035 1995 是 2136 的基礎(chǔ))

本文適用於對(duì) DNS 巳有一定了解的朋友,若是不甚清楚建議您可先參考 TWNIC 所做的講義:
http://dns-learning.twnic.net.tw/DNS94/



如果你想對(duì) nsupdate + key 的方法有更深入的了解可以參考
http://www.study-area.org/tips/tipsfr1.htm
或參考 isc bind 的文件有最詳細(xì)的解說
http://www.isc.org/sw/bind/arm93/Bv9ARM.pdf
本文不討論 view 的情形,若是 view 情形您必需從 view 的 match-client 去更新或是使用不同
的 key,所以建議您多參考 isb bind 的文件,雖然辛苦些,但資料絕對(duì)是最官方最正確的


2. 必要的資訊及知識(shí)
本文的範(fàn)例以 Shell Script 做成,重點(diǎn)在於原理,採用什麼工具或做法完全視您個(gè)人的能力.以下
就一些重點(diǎn)進(jìn)行說明.

2.1 BIND 動(dòng)態(tài)更新
基本上在 BIND8,BIND9 都是支援 nsupdate 的,但這裏面要注意的是 BIND8 在8.3.X 後才支援
IXFR,而 BIND9 則都支援,所以若您的 Server 在 8.3.0 前的版本,那就不建議了,更何況這個(gè)以
前的版本多多少少都有許多安全性的問題.

2.1.1 nsupdate:
bind 要開 allow-update 選項(xiàng),讓你的程式可以來執(zhí)行更新指令,allow-update 選項(xiàng)可以是 IP 或
key,而本文僅就 IP進(jìn)行介紹,若用 Key 對(duì)有些朋友來說可能會(huì)變得稍複雜些了

  1. # named.conf
  2. # 其他略
  3. zone "dyndns.twnic.tw" {
  4.         type master;
  5.         file "dyndns.twnic.tw";
  6.         allow-update {127.0.0.1;};    # 開放 127.0.0.1 進(jìn)行動(dòng)態(tài)更新       
  7.         allow-transfer { slave_ip;127.0.0.1;};  # slave 主機(jī),可能一部或多部,若無請(qǐng)寫 none
  8. };
復(fù)制代碼

以上是開放讓 127.0.0.1 進(jìn)行動(dòng)態(tài)更新,動(dòng)態(tài)更新有其指令,詳細(xì)您可看看 nsupdate man page
(man nsupdate),以下僅以最常用的進(jìn)行說明:

  1. #nsupdate
  2. [root@eai1 dyndns]# nsupdate
  3. > server 127.0.0.1
  4. > zone dyndns.twnic.tw
  5. > update delete user1.dyndns.twnic.tw A 211.72.210.249
  6. > update add user1.dyndns.twnic.tw A 211.72.210.251
  7. ttl 'A': not a valid number  # 這個(gè)例子是錯(cuò)誤示範(fàn),加一筆記錄要有 TTL 值
  8. > update add user1.dyndns.twnic.tw 60 A 211.72.210.251
  9. > show
  10. Outgoing update query:
  11. ;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
  12. ;; flags: ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
  13. ;; UPDATE SECTION:
  14. user1.dyndns.twnic.tw.  0       NONE    A       211.72.210.249
  15. user1.dyndns.twnic.tw.  60      IN      A       211.72.210.251

  16. > send
  17. > quit
復(fù)制代碼



  1. server  指向某一臺(tái) NameServer 進(jìn)行 update 操作
  2. zone    修改某個(gè) zone file
  3. update delete  進(jìn)行 update 的 delete 動(dòng)作,這個(gè)指令格式是
  4.         update delete FQDN TYPE RDATA,如果有多筆相同的 A
  5.         記錄或不同的 MX 記錄要?jiǎng)h除某一筆需將 RDATA 補(bǔ)上,
  6.         若沒有 RDATA 則表示這個(gè) FQDN 的這個(gè) TYPE 都要?jiǎng)h除
  7.         (TYPE 即是 A,MX,PTR,SOA,NS..等,RDATA 就是 TYPE 後
  8.         接的東西,如 A 的 RDATA 是 IP 而 MX 的 RDATA 是 優(yōu)
  9.         先權(quán) FQDN)
  10. update add     進(jìn)行記錄的增加,操作如同 delete, 但是一定要有
  11.         TTL 值,且必需明確寫出 RDATA
  12. show    這只是操作後要顯示進(jìn)行了那些 update 指令
  13. send    這個(gè)代表要把整個(gè) update 指令送給 server,操作 update
  14.         時(shí)資料不是馬上送出的,所以 update 可以很多行,最後
  15.         nsupdate 看到 send 時(shí),才會(huì)將整個(gè)所有 update 送出,
  16.         而 update 使用 port 53/udp 若送出的資料量 (DNS packet)
  17.         大於 512 bytes,則會(huì) truncate 而改使用 53/tcp,這是您
  18.         需要注意的地方,而只要您有 send, 則 SOA 記錄的 serial
  19.         會(huì)自動(dòng)加1,以期讓 slave 來進(jìn)行同步,所以過多的 send 可
  20.         能造成過多的 traffic
復(fù)制代碼


2.1.2 zone file 及日誌檔
如果您進(jìn)行了 nsupdate 的操作,則原來 directory 所指的目錄將會(huì)產(chǎn)生一些日誌檔,這個(gè)日誌檔即為
zone_name.jnl (directory 習(xí)慣上都設(shè)在 /var/named , 您自己必要注意 named 程式要有寫入的權(quán)限,
chroot 狀況等)

  1. # 顯示 dyndns.twnic.tw zone file 內(nèi)容
  2. [root@eai1 named]# cat /var/named/dyndns.twnic.tw
  3. $TTL 86400      ; 1 day
  4. @         IN SOA  twnic.net.tw. snw.twnic.net.tw. (
  5.                                 2006073267 ; serial
  6.                                 7200       ; refresh (2 hours)
  7.                                 1800       ; retry (30 minutes)
  8.                                 2419000    ; expire (3 weeks 6 days 23 hours 56 minutes 40 seconds)
  9.                                 300        ; minimum (5 minutes)
  10.                                 )
  11.                         NS      ns2.dyndns.twnic.tw.
  12.                         NS      eai1.twnic.tw.
  13. ns2                     A       203.73.24.204
  14. ; 如果別人在查詢時(shí),我們有這個(gè)記錄則回應(yīng)這個(gè)記錄的 IP,若沒有這個(gè)記錄代表
  15. ; 這個(gè)網(wǎng)站沒有上線,所以此時(shí)我們可以建立一筆 wildcard 記錄,指向自己的說
  16. ; 明網(wǎng)站,以供 user 識(shí)別這個(gè)網(wǎng)站沒有上線,而這筆 wildcard 的記錄 TTL 時(shí)間
  17. ; 不能太長,以免別的 DNS Cache 了這資料
  18. *                 0    A       211.72.210.251



  19. # 目錄裏的東西
  20. [root@eai1 named]# ls -la /var/named/
  21. 總計(jì) 128
  22. drwxr-xr-x    2 named    named        4096  7月 27 09:25 .
  23. drwxr-xr-x   20 root     root         4096  3月 13 16:50 ..
  24. -rw-r--r--    1 named    named         451  7月 27 09:25 dyndns.twnic.tw
  25. -rw-r--r--    1 named    named      104177  7月 27 10:01 dyndns.twnic.tw.jnl
  26. -rw-r--r--    1 named    named         195  7月  4  2001 localhost.zone
  27. -rw-r--r--    1 named    named        2851 10月 17  2003 named.ca
復(fù)制代碼


我們可以看到這個(gè) .jnl 的產(chǎn)生,這個(gè) .jnl 檔是不能隨便刪除,因?yàn)樗褥妒?dyndns.twnic.tw 的補(bǔ)
充資料
,而這些補(bǔ)充資料在 DNS reload/restart 時(shí), named 還會(huì)在把它讀進(jìn)來,所以動(dòng)態(tài)更新後的資料,
並不會(huì)隨著 dns 重啟後而消失,如果你想讓現(xiàn)在整個(gè) zone 檔出現(xiàn)所有的記錄,那可以 rndc stop 來停止
dns, 此時(shí) named 會(huì)把 .jnl資料寫入原來的 zone file,不過這種方式一般來說較不建議,因?yàn)槲覀兊?zone
file 只要存一個(gè)樣版 (template),其他的東西都是臨時(shí)性的. 而若你想知道現(xiàn)在整個(gè) zone 的內(nèi)容,在可
以做 zone transfer 的主機(jī)上(如上例為 slave_ip及 127.0.0.1), 以 dig 指令來執(zhí)行 axfr:

  1. [root@eai1 dyndns]# dig @127.0.0.1 dyndns.twnic.tw axfr

  2. ; <<>> DiG 9.3.0 <<>> @127.0.0.1 dyndns.twnic.tw axfr
  3. ;; global options:  printcmd
  4. dyndns.twnic.tw.        86400   IN      SOA     twnic.net.tw. snw.twnic.net.tw. 2006073528 7200 1800 2419000 300
  5. dyndns.twnic.tw.        86400   IN      NS      ns2.dyndns.twnic.tw.
  6. dyndns.twnic.tw.        86400   IN      NS      eai1.twnic.tw.
  7. *.dyndns.twnic.tw.      0      IN      A       211.72.210.251
  8. ns2.dyndns.twnic.tw.    86400   IN      A       203.73.24.204
  9. user1.dyndns.twnic.tw.  60      IN      A       211.72.210.248
  10. user1.dyndns.twnic.tw.  60      IN      MX      10 user1.dyndns.twnic.tw.
  11. # 以下略
  12. ...
復(fù)制代碼


2.設(shè)定 NameServer 僅進(jìn)行差異化的同步
Master/Slave 要進(jìn)行 zone file 的同步,而 ddns server 若只有一部是可以不用考慮這些問題的,但是若有兩
部以上的 DNS Server, 就需要考慮到同步的進(jìn)行方式,若 zone file 的總資料量小,採用什麼同步方式是無所
謂的,但若資料量多,或是經(jīng)常處在變動(dòng)狀況,那差異化的同步就會(huì)顯得很重要,因?yàn)樗梢宰屗械?DNS 在短時(shí)
間內(nèi)全部同步完成,BIND 支援 IXFR 後,其預(yù)設(shè)即是採用 IXFR, 若沒有 IXFR (update) 時(shí),則採用 AXFR,所以不
需要對(duì) IXFR 進(jìn)行額外設(shè)定,但為使大家了解其參數(shù),本處還是舉例來進(jìn)行說明,好讓大家能夠更了解


  1. # master DNS's named.conf
  2. key "rndc-key" {
  3.         algorithm hmac-md5;
  4.         secret "HpXtFRFdLaRPFjpZokIwusyezyyRNjxhcafCfmktWNyGkDFzHAXlpTZQtVLc";
  5. };

  6. controls {
  7.         inet 127.0.0.1 port 953
  8.                 allow { 127.0.0.1; } keys { "rndc-key"; };
  9. };

  10. options {
  11.         directory "/var/named";
  12.         pid-file "/var/run/named/named.pid";
  13.         allow-transfer { none; };
  14.         provide-ixfr yes;   # 提供 slave 主機(jī)以 IXFR 同步,default yes
  15.         request-ixfr yes;   # slave 以 IXFR 向 master 進(jìn)行同步,default yes
  16.         recursion no;       # 不允許遞迴查詢
  17. };
  18. zone "0.0.127.in-addr.arpa" {
  19.         type master;
  20.         file "named.local";
  21. };
  22. zone "." {
  23.         type hint;
  24.         file "named.ca";
  25. };
  26. zone "dyndns.twnic.tw" {
  27.         type master;
  28.         file "dyndns.twnic.tw";
  29.         max-journal-size 500k;                      # 設(shè)定日誌檔大小
  30.         allow-transfer { 203.73.24.204;127.0.0.1;}; # 可做 ixfr/axfr 的來源 IP,必需寫上 slave,
  31.                                                     # 127.0.0.1 是方使我們自己查看 zone file 現(xiàn)況
  32.         also-notify {203.73.24.205;211.72.210.251}; # 額外的同步主機(jī),這可能是 hot site 備份主機(jī)
  33.         allow-update { 127.0.0.1;};                 # 允許動(dòng)態(tài)更新的來源
  34. };

復(fù)制代碼


上述的東西相信只要對(duì) BIND DNS 有一定了解的朋友應(yīng)該都是沒有問題的,較不常出現(xiàn)的項(xiàng)目我都加上了的註解以利
大家了解,而 slave 的設(shè)法都同於 master, 只有在 zone 的部份稍有不同:

  1. # slave DNS's named.conf
  2. # 其他設(shè)定皆同上,只有 zone ...稍有不同,同於一般的 slave zone,不需要再開 allow-update (default none)
  3. zone "dyndns.twnic.tw" {
  4.         type slave;
  5.         masters {211.72.210.249;};
  6.         file "dyndns.twnic.tw";
  7.         allow-transfer { none;};
  8. };

復(fù)制代碼


所以從上述我們可以知道 DDNS for Master/Slave 您只要對(duì) master 進(jìn)行 update,每次的 update 送出 (send)
會(huì)使該zone 的序號(hào)加一,只要 zone 有更新 , dns 會(huì)送出 notify 訊息給所有的 NS 主機(jī)(NS 記錄上所列的名稱
伺服器),及可能的 also-notify 對(duì)象,使 slave 主機(jī)知道要進(jìn)行同步,同步時(shí)優(yōu)先採用 IXFR,若 master 不支援
IXFR 則改使用 AXFR,以達(dá)到即使更新,及時(shí)同步的效果


此外,有些做 DDNS 的公司可能對(duì) IXFR 不了解,而是把所有的 zone type 都設(shè)成了 MASTER,然後對(duì)這些 NameServer
進(jìn)行 nsupdate , 這種做法也是可以的,不過中間若漏了一步或那一臺(tái)少做了一件事,那兩邊的資料就會(huì)不一致,導(dǎo)致
可能同一個(gè)名稱會(huì)有不同的解析結(jié)果 (例如 gnway.net 做法)

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
2 [報(bào)告]
發(fā)表于 2006-07-28 14:52 |只看該作者
3. DDNS 的前端及後臺(tái)控制範(fàn)例
說是範(fàn)例主要是讓大家參考原理,並沒有必要一定都用我的方式,只要前面講的東西您可以了解,程式控制的部份
僅是末節(jié),以下僅列出我所用的方式供大家參考

3.1 MYSQL table
主要由三個(gè)表構(gòu)成,分別為 RR (Resource Record), RR_LOG (舊資料,建議您依狀況適當(dāng)保存),USER (user 認(rèn)證)

  1. CREATE TABLE RR (
  2.   SN int(20) NOT NULL auto_increment,
  3.   USERNAME varchar(64) NOT NULL default '',
  4.   FQDN varchar(64) NOT NULL default '',
  5.   TTL int(5) NOT NULL default '60',
  6.   TYPE varchar(10) NOT NULL default '',
  7.   RDATA varchar(64) NOT NULL default '',
  8.   CREATE_TIME timestamp(14) NOT NULL,
  9.   PRIMARY KEY  (SN),
  10.   KEY USERNAME (USERNAME),
  11.   KEY FQDN (FQDN),
  12.   KEY TTL (TTL),
  13.   KEY TYPE (TYPE),
  14.   KEY CREATE_TIME (CREATE_TIME)
  15. ) TYPE=MyISAM;

  16. --
  17. -- Table structure for table 'RR_LOG'
  18. --

  19. CREATE TABLE RR_LOG (
  20.   SN int(20) NOT NULL default '0',
  21.   USERNAME varchar(64) NOT NULL default '',
  22.   FQDN varchar(64) NOT NULL default '',
  23.   TTL int(5) NOT NULL default '60',
  24.   TYPE varchar(10) NOT NULL default '',
  25.   RDATA varchar(64) NOT NULL default '',
  26.   CREATE_TIME varchar(14) default NULL,
  27.   PRIMARY KEY  (SN),
  28.   KEY USERNAME (USERNAME),
  29.   KEY FQDN (FQDN),
  30.   KEY CREATE_TIME (CREATE_TIME)
  31. ) TYPE=MyISAM;

  32. --
  33. -- Table structure for table 'USER'
  34. --

  35. CREATE TABLE USER (
  36.   SN int(20) NOT NULL auto_increment,
  37.   USERNAME varchar(64) NOT NULL default '',
  38.   PASSWD varchar(64) NOT NULL default '',
  39.   EMAIL varchar(64) NOT NULL default '',
  40.   MEMO varchar(255) NOT NULL default '',
  41.   PRIMARY KEY  (SN),
  42.   UNIQUE KEY USERNAME (USERNAME)
  43. ) TYPE=MyISAM;
復(fù)制代碼

3.2 dyndns.cfg 設(shè)定檔
這個(gè)設(shè)定檔主要為了給 CGI 程式及產(chǎn)生 nsupdate 的程式 (dyndns-cron.sh) 所使用,透過 eval 方式來執(zhí)行,
以取得共同的變數(shù)

  1. # mysql host/db/user/password
  2. DBHOST=localhost
  3. DBNAME=dyndns
  4. DBUSER=UserName
  5. DBPASS=Your_Passwd
  6. MYSQL="mysql $DBNAME -h $DBHOST -u $DBUSER -p$DBPASS"

  7. # dyndns domain
  8. DOMAIN=dyndns.twnic.tw

  9. # Master IP
  10. DYNDNS_MASTER=127.0.0.1

  11. # nsupdate command file
  12. CMD_FILE=/tmp/nsupdate.cmd

  13. # update freqency
  14. UPD_FREQ=15

  15. # RR valid time (seconds),default 20 mins
  16. RR_ALIVE=1200

復(fù)制代碼


3.3 dyndns.cgi CGI 程式
這個(gè) CGI 主要用於接收 USER 端來的資訊,驗(yàn)證通過後即為把 USERNAME.DOMAIN 資料,A/MX 及對(duì)應(yīng) IP 存入
Table RR 中,此外這個(gè) CGI 以 shell script 做成,可以於多數(shù)人的環(huán)境執(zhí)行 (chmod 755 及目錄的 CGI 執(zhí)
行權(quán)限 ExecCGI 莫忘)

  1. #!/bin/sh
  2. echo -ne "Content-Type: text/html\n\n"

  3. if [ -n "$QUERY_STRING" ];then
  4. # 取得 QUERY_STRING,以下這個(gè)作法是危險(xiǎn)的,因?yàn)闆]有檢查資料的正確性就 eval
  5. # 我的用意只在於說明作法
  6.         eval `echo "$QUERY_STRING" | sed "s/&/;/g"`
  7. # 讀取設(shè)定檔,這個(gè)路徑您需要自行調(diào)整
  8.         eval `cat /home/abelyang/dyndns/dyndns.cfg `
  9.         sql0="select 1 from USER where USERNAME='$LOGIN' and PASSWD='$PASSWD'"
  10.         res=`echo $sql0 | $MYSQL `
  11. # 如果 USER 密碼正確, ${#res} 應(yīng)為2,不對(duì)則為 0
  12.         if [ ${#res} -lt 1 ];then
  13.                 echo "Login Failure"
  14.         else
  15. # 取得 IP, 需判斷有 Proxy 存在,但是不考慮 Proxy 後是 NAT 情形
  16.                 IP=${HTTP_X_FORWARDED_FOR:-$REMOTE_ADDR}
  17.                 FQDN="$LOGIN.$DOMAIN"
  18. # 刪除上一次的登入
  19.                 sql1="delete from RR where USERNAME='$LOGIN'"
  20. # 預(yù)設(shè)的動(dòng)態(tài)更新項(xiàng)目為 A/MX
  21.                 sql2="insert into RR(USERNAME,FQDN,TYPE,RDATA) values('$LOGIN','$FQDN','A','$IP')"
  22.                 sql3="insert into RR(USERNAME,FQDN,TYPE,RDATA) values('$LOGIN','$FQDN','MX','10 $FQDN')"
  23.                 echo $sql1 | $MYSQL
  24.                 echo $sql2 | $MYSQL
  25.                 echo $sql3 | $MYSQL
  26.                 echo $LOGIN login success @$IP
  27.         fi
  28. else
  29. # 以下只是網(wǎng)頁的部份,我沒有做 DDNS 申請(qǐng),這個(gè)部份我想只要懂網(wǎng)頁的朋友應(yīng)該都會(huì)才是
  30.         cat <<EOF
  31. <html>
  32. <head>
  33. <meta http-equiv="Content-Type" content="text/html; charset=big5" />
  34. <link rel="stylesheet" href="./style1.css">
  35. </head>
  36. <body>
  37. <BR><BR><center>
  38. <form>
  39. <h3>Abel Dyndns Demo </h3>
  40. Login:<input type=text name=LOGIN ><BR>
  41. Passwd:<input type=password name=PASSWD><BR>
  42. <input type=submit values="Start DynDNS">
  43. </form>
  44. <BR></center>
  45. </body>
  46. </html>

  47. EOF


  48. fi
復(fù)制代碼


3.4 dyndns-cron.sh 定時(shí)產(chǎn)生 nsupdate
這隻程式主要進(jìn)行讀取 Table RR , 並產(chǎn)生 nsupdate 所需要的指令格式後執(zhí)行 nsupdate, 程式預(yù)設(shè)
每15秒執(zhí)行一次(參數(shù)如上 dyndns.cfg 中的 UPD_FREQ 更新頻率),您可以拿掉 while [ 1 ] 的迴圈,
改用 crontab 方式來跑,不過這樣就較不容易控制一分鐘以內(nèi)的更新頻率了,最後,這個(gè)程式會(huì)把 SOA
的序號(hào)改成更新時(shí)間,這個(gè)時(shí)間是 UTC 的秒數(shù)(意即 1970/1/1 至今秒數(shù), date +%s 可得),由 SOA 的
序號(hào)就可以知道最後的 update 時(shí)間,這個(gè)原理和 .com 的verisign 或是 dyndns 中的 dyndns.org/
noip.com 是相同的.

另外,根據(jù) RR_VALID 參數(shù),若 USER 的登錄時(shí)間 小於 現(xiàn)在時(shí)間-RR_VALID (秒數(shù)),則該 Record 視同
離線,所以我們需要進(jìn)行 delete 動(dòng)作


  1. #!/bin/sh

  2. while [ 1 ]
  3. do
  4. # 您必需調(diào)整路徑,放在 while loop 裏是要讓修改了設(shè)定檔即可生效,若不要可放在 while 之外
  5.         eval `cat /home/abelyang/dyndns/dyndns.cfg`
  6.         cat <<EOF > $CMD_FILE
  7. server $DYNDNS_MASTER
  8. zone $DOMAIN
  9. EOF

  10. # 取得最後一次的更新時(shí)間, 多減一秒是為了預(yù)防程式的 delay
  11.         last=`date -d "-$UPD_FREQ seconds -3 seconds" "+%Y%m%d%H%M%S"`
  12.         now=`date "+%Y%m%d%H%M%S"`

  13. # 取得這段時(shí)間內(nèi)有上來更新的 USER,這個(gè)部份不檢查 IP 不變動(dòng)情形
  14. # 主要因?yàn)?nsupdate 巳執(zhí)行很快,而且 named 它自己會(huì)檢查重覆更新的東西
  15.         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
  16.         do

  17. # 組出更新指令,主要為一個(gè)刪除,一個(gè)增加
  18.                 echo "update delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
  19.                 echo "update add $FQDN $TTL $TYPE $RDATA $RDATA2" >>$CMD_FILE
  20.         done

  21. # 超過 RR_ALIVE (20分鐘) 未有 login 資料則清除 DNS 記錄
  22.         last=`date -d "-$RR_ALIVE seconds" "+%Y%m%d%H%M%S"`
  23. # 備份舊的資料,並清除過時(shí)資料 (看你自己要不要備份了)
  24. #       echo "insert into RR_LOG select * from RR where CREATE_TIME<$last"|$MYSQL
  25. #       echo "delete from RR where CREATE_TIME < $last" |$MYSQL

  26. # 取得過期 (RR_ALIVE) 而未登錄的列表進(jìn)行刪除動(dòng)作,因?yàn)槲覀冇昧?wildcard (*),所以若別人連時(shí)
  27. # 將會(huì)被指到 wildcard 所指的 IP 上,而您可這個(gè) Web Server 上做一些文章,例如 Offline 說明等
  28.         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
  29.         do
  30.                 echo "; delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
  31.                 echo "update delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
  32.         done

  33. # 自定更新 SOA, 主要是為了讓序號(hào)欄位為現(xiàn)在時(shí)間 (UTC)
  34.         echo "update delete $DOMAIN SOA" >>$CMD_FILE
  35.         echo "update add $DOMAIN 600 SOA ns1.dyndns.twnic.tw abelyang.eai1.twnic.tw $(date +%s) 900 60 604800 60" >>$CMD_FILE
  36.         echo "send" >>$CMD_FILE
  37. # 執(zhí)行 nsupdate 指令
  38.         nsupdate $CMD_FILE
  39. #       echo "process ok"
  40.         sleep $UPD_FREQ
  41. done


復(fù)制代碼


3.5 登入及更新方法
所有的東西都準(zhǔn)備好了後,我們就可以測試:

  1. wget "http://eai1.twnic.tw/dyndns.cgi?LOGIN=abelyang&PASSWD=abelyang-dyndns" -O /tmp/dyndns-login-status 2>/dev/null
復(fù)制代碼

在最多等待15秒(我的預(yù)設(shè)值)的情況下,就可以更新到 DNS 中了

3.6 其他資料
其他資料如 named.conf , dyndns.twnic.tw zone file 您都可以在前面的說明裏找到,我於下面 link
放了一份所有的資料供大家參考,較不用費(fèi)事 copy & paste ,但不保證下面 link 永遠(yuǎn)有效 (其中的
.tgz 即有所有檔案的 tarball)
http://eai1.twnic.tw/example/


4. DDNS 再探討
如前言所言, DDNS 可以使用資料庫來用 (意即我的範(fàn)例中可以少掉 dyndns-cron.sh 那隻),不過資料庫
因其先天的狀況,更據(jù)我的測試(PowerDNS),在 5 萬資 Record 的情況下,只能到達(dá)每秒 1000 次的查詢,
而且此時(shí)尚不考量同時(shí)有 update/delete/insert 等情形,主要因?yàn)槭芟揿断忍?DB 的 select 速度所致
,當(dāng)然您可以透過微調(diào)或細(xì)部處理讓這個(gè)數(shù)字變成1500 或 2000, 但都永不如 BIND 隨便都可以透過每秒
6000 次查詢,當(dāng)然用 DB 直接來做一定是可以且更簡單的,不過安全性及抗壓性 PowerDNS 是隨時(shí)都會(huì)有
當(dāng)?shù)舻娘L(fēng)險(xiǎn),至於用 BIND 倒是沒有看過,主要是因?yàn)檫@種 Server 肯定是不遞迴(recursion no). 所以
著名的 DDNS 廠商都是用 BIND 而不用 DB 方式,因其抗壓性不足而致風(fēng)險(xiǎn)過高.

此外,若我們看 dyndns.org/noip.com 的做法,可以知道他們也是用 BIND 來做,你可以查詢其 SOA 的序
號(hào)即可以知道他每60秒更新一次,若是使用 DB 來做是沒有必要顧慮序號(hào)問題的 (DB 有 DB 同步方法,用
SOA 序號(hào)無關(guān)),此外您更可以查看 .com 的 Verisign,他們的做法也是像 BIND 一樣,而其以每15秒更新
頻率在進(jìn)行,所以若您使用 .com 的域名,變更DNS 大概只要15秒就可以同步到所有的 .com NameServer,
而不是過去的2天 (因?yàn)檫^去是 AXFR,現(xiàn)在是 IXFR),雖然Verigisn 仍不降低 NS 記錄的 TTL 值 (二天),
但至少不會(huì)發(fā)生像過去最多會(huì)4天 .com 的 DNS 資料 Cache 才會(huì)過期的情況 (二天的更新頻率+二天的
快取時(shí)間)


  1. # 檢查 .com 的 NameServer (d.gtld-servers.net) SOA 資訊來驗(yàn)證
  2. [root@eai1 example]# for i in `seq 1 1000`;do dig +short @d.gtld-servers.net com soa;sleep 1;done
  3. a.gtld-servers.net. nstld.verisign-grs.com. 1153990708 1800 900 604800 900
  4. a.gtld-servers.net. nstld.verisign-grs.com. 1153990708 1800 900 604800 900
  5. a.gtld-servers.net. nstld.verisign-grs.com. 1153990708 1800 900 604800 900
  6. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900 # 這裏變更了, serial 即時(shí)間
  7. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  8. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  9. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  10. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  11. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  12. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  13. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  14. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  15. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  16. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  17. a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
  18. a.gtld-servers.net. nstld.verisign-grs.com. 1153990738 1800 900 604800 900 # 變更序號(hào)
  19. a.gtld-servers.net. nstld.verisign-grs.com. 1153990738 1800 900 604800 900
  20. a.gtld-servers.net. nstld.verisign-grs.com. 1153990738 1800 900 604800 900

復(fù)制代碼



5. 結(jié)語
我所寫的 script 都是以簡單的角度來出發(fā),以供大家參考,至於用戶及域名管理這個(gè)有待想要用的人自行
開發(fā),用 shell script 有利於多數(shù)人閱讀及了解原理,細(xì)節(jié)的東西唯有您自己做了後才更能體會(huì).
對(duì)多數(shù)的公司來說使用 DDNS 是沒有意義的,除了 Registy (.com/cn/tw/jp/hk...),或是以 DDNS 做為營
運(yùn)的公司,而 DDNS其實(shí)是不難的,但是網(wǎng)路上較缺乏這方面的介紹文章,所以在此為大家介紹一下這些東西
的細(xì)節(jié), 以利想要研究的朋友能初窺門徑. 有任何意見都非常歡迎大家多多交流






註:
此外,有些做 DDNS 的公司可能對(duì) IXFR 不了解,而是把所有的 zone type 都設(shè)成了 MASTER,然後對(duì)這些
NameServer進(jìn)行 nsupdate , 這種做法也是可以的,不過中間若漏了一步或那一臺(tái)少做了一件事,那兩邊
的資料就會(huì)不一致,導(dǎo)致可能同一個(gè)名稱會(huì)有不同的解析結(jié)果 (例如 gnway.net 做法,我猜測),而像 dyndns.org
/noip.com 和花生殼(vicp.net,oray.net) 等的做法是一樣的(也就是和本文所提的做法一樣). 而有些
公司則使用 PowerDNS/Mydnl..等套接 DB 的 DNS ,雖然可用,而且方式更簡單,但是這些 DDNS 服務(wù)肯定
無法負(fù)荷大量的查詢,因?yàn)槊看蔚?dns 查詢會(huì)在其內(nèi)產(chǎn)生 N 次的 Select 指令,資料庫處理 select 的
速度肯定是比不上 dns flooding 的速度



==== 每帖不得超過 20000 字,每次發(fā)帖不能小於30秒,這不是叫人不寫文章嗎 ======

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

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2006-07-28 18:16 |只看該作者
request-ixfr yes;   # slave 以 IXFR 向 master 進(jìn)行同步,default yes


這一句是否應(yīng)該放在 slave 中,而不是 master ?

論壇徽章:
1
白銀圣斗士
日期:2015-11-23 08:33:04
4 [報(bào)告]
發(fā)表于 2006-07-28 18:33 |只看該作者
好!

請(qǐng)問這個(gè)和花生殼,科邁等的有何區(qū)別?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2006-07-28 18:44 |只看該作者
好!

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
6 [報(bào)告]
發(fā)表于 2006-07-31 09:51 |只看該作者
這一句是否應(yīng)該放在 slave 中,而不是 master ?

ailms 說的沒有錯(cuò),不過是無所謂,因?yàn)?master 資料是不會(huì)有 request-ixfr 的需求,
而 slave 有時(shí)候兩個(gè)都要設(shè)

請(qǐng)問這個(gè)和花生殼,科邁等的有何區(qū)別?

這是教大家 花生殼,科邁 是怎麼做的,沒有什麼區(qū)別,不過跟據(jù)我實(shí)測的結(jié)果,
花生殼是和本文的用法一樣,而科邁 SOA 序號(hào)中總不一致,我認(rèn)為科邁在 DDNS
上的實(shí)現(xiàn)或許可能有問題

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2006-07-31 13:44 |只看該作者
支持. 沒做過, 要試試.

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2006-08-01 10:11 |只看該作者
不錯(cuò),做成PDF文檔供下載就更好了。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2006-08-01 20:06 |只看該作者
簡單的說就是通過下載一個(gè)網(wǎng)頁實(shí)現(xiàn)ddns域名,我就不明白花生殼搞那么大一個(gè)客戶端干什么,干脆告訴別人用myie自動(dòng)刷新或者用wget建立定時(shí)任務(wù)就可以了。其實(shí)就用系統(tǒng)缺省的bind,cgi用perl就可以了,cgi里面讀出客戶端的ip,然后寫到一個(gè)臨時(shí)文件/tmp/ddnstmp 然后調(diào)用系統(tǒng)自帶的軟件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和搞那么復(fù)雜的命令,簡單的可以用手工
nsupdate < file 然后nslookup把server設(shè)為自己的dns server看域名ip改了沒有。
當(dāng)然named.conf中allowupdate要設(shè)好。

[ 本帖最后由 劉五十三 于 2006-8-1 20:09 編輯 ]

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2006-08-09 15:23 |只看該作者
感謝分享!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP