另外,根據 RR_VALID 參數,若 USER 的登錄時間 小於 現在時間-RR_VALID (秒數),則該 Record 視同
離線,所以我們需要進行 delete 動作
CODE:[Copy to clipboard]#!/bin/sh
while [ 1 ]
do
# 您必需調整路徑,放在 while loop 裏是要讓修改了設定檔即可生效,若不要可放在 while 之外
eval `cat /home/abelyang/dyndns/dyndns.cfg`
cat <<EOF > $CMD_FILE
server $DYNDNS_MASTER
zone $DOMAIN
EOF
# 取得這段時間內有上來更新的 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
CODE:[Copy to clipboard]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 才會過期的情況 (二天的更新頻率+二天的
快取時間)