Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->网络应用 ->服务器 ->正文

用BIND架设DDNS Server提供DDNS服务

来源: 作者: 时间:2007-04-11 点击: [收藏] [投稿]

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 <



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 动作

CODE:[Copy to clipboard]#!/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 (*),所以若别人连时

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Linux CollegeLinux LiveServer 发布   下一篇:在Enterprise Server上配置SCSI磁带机

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号