Chinaunix

标题: 如何自己架设动态dns服务器 [打印本页]

作者: 網中人    时间: 2004-05-16 00:55
标题: 如何自己架设动态dns服务器
http://www.study-area.org/tips/ddns.htm

不過,若要用 web 來更新,那 cgi 你要自己寫了。
作者: 散步的风    时间: 2004-05-17 08:48
标题: 如何自己架设动态dns服务器
动态DNS解析自己动手做
阅读本文需要你参考这个文章http://www.chinaunix.net/jh/4/74349.html
安装动态DNS解析,你首先需要下列软件:
第一,DNS服务器后台软件,推荐使用bind9(bind9以前的版本不支持动态dns更新.),平台各种平台都可以,本文是使用windows 2000+bind9.(因为关于unix类操作系统中的文章相对比较多,所以本文就不再详细说明如何在unix系统中实现动态dns更新.本文仅仅涉及将bind9移植到windows平台中.),为了实现这个功能,你首先需要去http://www.isc.org(或http://www.bind.com(中下载相应的windows平台中的bind9好像最新的版本是9.2.3).下载下来之后解压安装就可以了,默认路径是c:\winnt\system32\dns中.
第二:配置named.conf文件,下文只仅仅涉及了一部分动态dns需要的一些部分,其他的大家可以参照网上的配置资料.
//named configure by jackywong
options {
directory "c:\winnt\system32\dns\etc\named";
version "testdns.com";
};

key "www" { //此key要使用dnssec-keygen –a hmac-md5 –b 128 HOST www生成
algorithm hmac-md5;
secret "WJEBMfFgU09zg3qGvUS3iw=="; //secret中的密码是生成的Kwww*.key中的那串东西.
};
.
.
.
zone “testdns.com” {
type master;
file “db.testdns.com”;
update-policy{
grant www name www.testdns.com. A; //与上面的key的名字对应就可以了
grant mail name mail.testdns.com. A;
grant sub subdomain testdns.com.. ANY; //身成的key可以更新testdns.com的所有子域
};
};



关于上面的这些可以看这片文章.
http://www.chinaunix.net/jh/4/74349.html

下面主要说明如何在windows中获得你的IP地址,之后上传更新.由于windows下默认的查看电脑IP地址的方法只有一种,那就是使用ipconfig,之后会分行显示很多信息,windows这样做看似比较直观,但对于如果你想通过命令行来获得你的iP地址,这样就会变得比较难了,因为特征子串比较难以获得.说到这里就应该抱怨一下”微软”了.微软自称很多东西可以在命令行方式进行,其实呢?你想在命令行下进行的东西,他都不能做.经过详细的查找终于在微软提供的resource kit中找到了一个类西grep的处理工具叫qgrep,呵呵这个工具实在是太有用了,可惜只有这一个.
不多说废话了,为了取得本机的IP地址,我们需要下列工具,大家可以在网上查找一下,应该可以很方便的找到.
Netwox515.exe 和netwib515.dll 我们使用这个工具来显示ip地址.使用这个工具你将会得到类似下面的特征串.
C:\>;netwox 1 -i
nu ip /netmask ppp point_to_point_with
1 127.0.0.1 /255.0.0.0 0
7 192.168.1.1 /255.255.255.0 0
7 192.168.88.52 /255.255.255.0 0
9 192.168.1.253 /255.255.255.0 0
呵呵,这个工具还有很强大的功能,搞网络的同志们一定要弄一个哦.
Sh.exe,一个模拟运行在windows中的shell,使用它,你就可以完成cmd无法完成的处理类unix的脚本了.(批处理对与脚本来说实在是太弱智了.)
Grep.exe这个工具就不用说了吧,大家应该都知道,如果不知道的话,呵呵,快去看看资料吧.
Cat.exe,也是一个大名鼎鼎的工具.标准的unix中全部都提供这个东东.
Cut.exe,同样也是很多unix系统的标配.
Sed.exe.用来处理文本流,功能真的是太强大了.(可惜windows从来没有提供类似这个工具,正是因为没有它,才使windows的批处理象一个畸形的东东,就使加上vbs,js都比不上这个功能强大.).

有了上面的几个东东,我们就可以开始动手写一个脚本,来获取本机的公网ip了.首先明确一点,我仅仅选择了一个比较简单的切入点,那就是凡是利用windows的拨号网络来拨号的adsl获得的公网ip均有以下特征,(目前我所知道的只有一种不是利用拨号网络来进行拨号,那就是enternet300系列.这种如何获得公网ip可能需要大家自己研究了,J).我们使用ipconfig就会看到,凡是使用拨号网络进行拨号的你所获得的ip均是255.255.255.255.不信可以看看.有了这个我们就可以非常方便的进行出处理了.下面开始写这个脚本:
#!c:/winnt/sh.exe //告诉sh.exe,以下的内容是脚本

netwox 1 –i |grep 255.255.255.255 >; c:/ip //把获得的有255.255.255.255的行输处到 c:/ip这个文件中
sed -e 's|/255.255.255.255| |g' c:/ip >;c:/swapip //处理c:/ip这个文本流,把其中的/255.255.255.255替换为多个空格,并把结果输出到 c:/swapip中
new_ip=`cat c:/swapip |cut -c4-18` //把刚才得到的文件截取从4-18的字符,为何这么做,大家可以自己想想,可获得的ip为n.n.n.n到nnn.nnn.nnn.nnn,上面那样做就是为了保证通用性.把获得ip赋值给new_ip.
cat c:/snd |sed -e "s|ipadd|$new_ip|g" >;c:/up.txt //处理c:/snd文件,把里面的ipadd替换成为new_ip的值.

c:/winnt/system32/dns/bin/nsupdate -k c:/winnt/system32/dns/bin/Ksc.+157+48890.key -v c:/up.txt //更新dns记录,里面的nsupdate执行文件是bind9中的,如果没有可以下载一个bind9,之后拷贝到相应的目录中去.


作完这些,基本的东西就已经搞定了,接下来就是怎么作定时器和如何使用上面编写的shell脚本了.定时器windows提供了一个替代品,虽说功能不是很强大,但作一些日常的工作也就够了(使用windows的计划任务,必须保证你已经启动task schedule,并且它的启动方式是自动.).做一个批处理.auto.bat,里面的内容很简单.
Sh c:/你刚才编写的脚本的名称.(一定要注意\在unix系统代表转义字符,千万不能在脚本中的路径中使用这个字符,全部用/替换.)
之后就做一个计划任务,让这个脚本,每隔10分钟运行一次.呵呵就大功告成了.

上面的脚本适合以下对象,客户端是windows系统,服务器什么平台没有什么要求..本文算是对http://www.chinaunix.net/jh/4/74349.html的一个补充吧.
作者: unixli    时间: 2004-05-17 12:04
标题: 如何自己架设动态dns服务器
很好!但能不能把在WIN2000下的从开始安装到安装成功的整个过程和脚本都写出来呀?急盼!
作者: 散步的风    时间: 2004-05-17 13:01
标题: 如何自己架设动态dns服务器
你参照我文档中提到的那篇文档,对着做就可以了,很简单的.关于更新脚本我也在文章中写出来了,你整理一下,把里面的注释去掉就可以了.如果你是使用windows的拨号网络,我上面的脚本就有通用性.有什么问题你可以发邮件给我.postmaster@panva.com.cn.
作者: unixli    时间: 2004-05-17 13:28
标题: 如何自己架设动态dns服务器
我现在是这样的
我想在别人的WIN2000服务器上安装一个BIND9,因他们学校那的是固定IP,但他们的服务器和客户都是通过防火墙NAT出去的。而我现在上网也是通过ADSL MODEM自动拔号共享上网的,所以我没法用你的脚本取得公网IP的。不知能不能通过PING一个免费的动态域名得知MODEM取到的公网IP,然后再去服务器上更新,就不知这样要怎样实现了。
作者: 散步的风    时间: 2004-05-17 13:54
标题: 如何自己架设动态dns服务器
关于前一个问题我想可能就比较麻烦了,因为你必须在它的防火墙上把53端口映射到安装bind的那个电脑上.这个东西恐怕只有网络的管理员才能做.或者如果你知道他们防火墙密码的话,应该也是没有问题的.
关于取IP的方法,其实有很多种的,不过我想最简单的可能就是你说的那种了.申请一个免费的动态域名,之后安装一个客户端挂在网上.之后通过Ping取取得IP地址是肯定行的通的.你最好做一个试验试试.具体取法如下:
ping your free domain >;c:/ip
sed -e 's|Reply from ||g' c:/ip >;c:/swapip
sed -e 's|: bytes|                 |g' c:/swapip>;c:/ip
new_ip=`cat c:/ip |cut -c1-18`
这样的获得的应该就是你的公网Ip了.不过我觉得这样做的通用性不是很好.呵呵,我只是为了解决你的问题.
作者: 散步的风    时间: 2004-05-17 13:55
标题: 如何自己架设动态dns服务器
sed -e 's|: bytes| |g' c:/swapip>;c:/ip
这句里面的空格要足量,否则,取ip的时候有可能取到字符
作者: unixli    时间: 2004-05-17 14:17
标题: 如何自己架设动态dns服务器
多谢散步的风,我先试试先,如有什么问题我再请教你,多谢支持!
我朋友是学校的网管,所以要做端口映射没问题。如能成功,那都可以让他给大家提供服务了。
作者: 散步的风    时间: 2004-05-17 14:28
标题: 如何自己架设动态dns服务器
呵呵,那感情好了.
作者: unixli    时间: 2004-05-17 16:53
标题: 如何自己架设动态dns服务器
有没有已编译好的FOR WIN2000的BIND9呢?因为要在别人服务器上装太多相关软件不太好的!安装BIND9太麻烦了!
作者: 散步的风    时间: 2004-05-17 20:01
标题: 如何自己架设动态dns服务器
我和你说的那个bind9本来就是编译好的的,只需用解压安装就可以了.bind9基本上是绿色软件,只是在系统中做了一个服务而已.其他的都是直接拷贝到安装目录的.
作者: unixli    时间: 2004-05-18 09:18
标题: 如何自己架设动态dns服务器
是吗?我下的是这个包bind-9.2.3.tar.gz
按照它的安装说明需要ActiveState、OpenSSL、Visual C++或Borland C
那是我下错了吧
作者: 散步的风    时间: 2004-05-18 11:13
标题: 如何自己架设动态dns服务器
直接下载那个bind-9.2.3.zip就可以了
作者: unixli    时间: 2004-05-23 15:28
标题: 如何自己架设动态dns服务器
ip.txt文件内容如下:
server ns.163.com
update delete 163.com A
update add 163.com 0 A NEWIP
update delete www.163.com A
update add www.163.com 0 A NEWIP
update delete bbs.163.com A
update add bbs.163.com 0 A NEWIP
update delete mail.163.com A
update add mail.163.com 0 A NEWIP
update delete ftp.163.com A
update add ftp.163.com 0 A NEWIP
update delete pop.163.com A
update add pop.163.com 0 A NEWIP
update delete smtp.163.com A
update add smtp.163.com 0 A NEWIP
send

在sh(for windows)命令行下运行如下命令
ping -n 1 www.163.com |grep Pinging >;e:/bind/newip
sed -e 's|] with 32 bytes of data      |g' e:/bind/newip >;e:/bind/swapip
NEW_IP=`cat e:/bind/swapip |cut -c22-36`
cat e:/bind/ip.txt |sed -e 's|NEWIP|$NEW_IP|g' >;e:/bind/up.txt
得到的输出文件是up.txt文件内容如下:
server ns.163.com
update delete 163.com A
update add 163.com 0 A $NEW_IP
update delete www.163.com A
update add www.163.com 0 A $NEW_IP
update delete bbs.163.com A
update add bbs.163.com 0 A $NEW_IP
update delete mail.163.com A
update add mail.163.com 0 A $NEW_IP
update delete ftp.163.com A
update add ftp.163.com 0 A $NEW_IP
update delete pop.163.com A
update add pop.163.com 0 A $NEW_IP
update delete smtp.163.com A
update add smtp.163.com 0 A $NEW_IP
send
这样并没有得到我想要的结果,就是把ip.txt中的NEWIP替换成取到的IP地址。NEW_IP中的值是正确的,测试结果如下:
LYM# ping $NEW_IP

Pinging 202.108.36.153 with 32 bytes of data:

Reply from 202.108.36.153: bytes=32 time=390ms TTL=52
Reply from 202.108.36.153: bytes=32 time=391ms TTL=52
Reply from 202.108.36.153: bytes=32 time=381ms TTL=52
Reply from 202.108.36.153: bytes=32 time=380ms TTL=52

Ping statistics for 202.108.36.153:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 380ms, Maximum =  391ms, Average =  385ms

这应该是
cat e:/bind/ip.txt |sed -e 's|NEWIP|$NEW_IP|g' >;e:/bind/up.txt
这句用法有问题,请问各位要怎样做才能把ip.txt中的NEWIP替换成取到的IP地址呢,多谢!
作者: unixli    时间: 2004-05-23 15:58
标题: 如何自己架设动态dns服务器
解决了,就是在$NEW_IP这参数上多加两个" '  " 就得了。如下
cat e:/bind/ip.txt |sed -e 's|NEWIP|'$NEW_IP'|g' >;e:/bind/up.txt

在WINDOWS2000下的DNS也可以用nsupdate工具动态更新,只要在域属性中允许动态更新就可以了。不过我不知道在WINDOWS2000中“安全动态更新”要怎么实现,受权用户是怎么通过用户认证然后再更新DNS记录的?
  那位朋友知道的请共享一下经验吧,多谢!
作者: unixli    时间: 2004-05-23 16:20
标题: 如何自己架设动态dns服务器
奇怪,我刚运行如下命令得到的结果都是正确的
LYM# ping -n 1 www.163.com |grep Pinging >;e:/bind/newip
LYM# sed -e 's|] with 32 bytes of data      |g' e:/bind/newip >;e:/bind/swapip
LYM# NEW_IP=`cat e:/bind/swapip |cut -c22-36`
LYM# cat e:/bind/ip.txt |sed -e 's|NEWIP|'$NEW_IP'|g' >;e:/bind/up.txt
LYM# cat up.txt
server ns.163.com
update delete 163.com A
update add 163.com 0 A 202.106.168.103
update delete www.163.com A
update add www.163.com 0 A 202.106.168.103
update delete bbs.163.com A
update add bbs.163.com 0 A 202.106.168.103
update delete mail.163.com A
update add mail.163.com 0 A 202.106.168.103
update delete ftp.163.com A
update add ftp.163.com 0 A 202.106.168.103
update delete pop.163.com A
update add pop.163.com 0 A 202.106.168.103
update delete smtp.163.com A
update add smtp.163.com 0 A 202.106.168.103
send

但现在同样的命令却有如下错误,不得其解!!!???
LYM# ping -n 1 www.163.com |grep Pinging >;e:/bind/newip
LYM# sed -e 's|] with 32 bytes of data      |g' e:/bind/newip >;e:/bind/swapip
LYM# NEW_IP=`cat e:/bind/swapip |cut -c22-36`
LYM# cat e:/bind/ip.txt |sed -e 's|NEWIP|'$NEW_IP'|g' >;e:/bind/up.txt
e:\bind\tools\sed.EXE: -e expression #1, char 22: Unterminated `s' command
LYM#

到底哪出错了???
作者: unixli    时间: 2004-05-23 17:50
标题: 如何自己架设动态dns服务器
我测了一下,是因为IP地址变了,变成14位数了,但我默认取的是15位字符,所以只要
NEW_IP=`cat e:/bind/swapip |cut -c22-36`
这句得到的IP地址后面有空格,那就会出错,那用什么可以去掉最后的空格呢?
作者: unixli    时间: 2004-05-23 18:51
标题: 如何自己架设动态dns服务器
终于搞定,以下脚本测试没问题了!
ping -n 1 www.163.com | grep Pinging >;e:/bind/newip
sed -e 's/] with 32 bytes of data:/      /g' e:/bind/newip >;e:/bind/swapip
cat e:/bind/swapip |cut -c22-36 >;e:/bind/ip
cat e:/bind/ip |sed 's/ //g' >;e:/bind/newip
cat e:/bind/newip |sed 's/  //g' >;e:/bind/ip
cat e:/bind/ip |sed 's/   //g' >;e:/bind/newip
cat e:/bind/newip |sed 's/    //g' >;e:/bind/ip
cat e:/bind/ip |sed 's/     //g' >;e:/bind/newip
cat e:/bind/newip |sed 's/      //g' >;e:/bind/ip
cat e:/bind/ip |sed 's/       //g' >;e:/bind/newip
cat e:/bind/newip |sed 's/        //g' >;e:/bind/ip
new_ip=`cat e:/bind/ip`
cat e:/bind/ip.txt | sed -e 's/NEWIP/'$new_ip'/g' >;e:/bind/up.txt
作者: unixli    时间: 2004-05-23 23:22
标题: 如何自己架设动态dns服务器
以上命令可用如下命令代替,结果是一样的,更简洁方便
new_ip=`ping -n 1 www.163.com |grep 'Pinging' |cut -d[ -f 2 |cut -d] -f 1`  #取PING结果的第一行[ ]中的字符
cat e:/bind/ip.txt | sed -e 's/NEWIP/'$new_ip'/g' >;e:/bind/up.txt
作者: 散步的风    时间: 2004-05-24 17:48
标题: 如何自己架设动态dns服务器
呵呵,何必那么麻烦,你取到ip有空格,在unix脚本中,空格会被自动删除的.你最好在你脚本中考虑ping中的request time out的情况.
作者: unixli    时间: 2004-05-24 18:23
标题: 如何自己架设动态dns服务器
[quote]原帖由 "散步的风"]呵呵,何必那么麻烦,你取到ip有空格,在unix脚本中,空格会被自动删除的.你最好在你脚本中考虑ping中的request time out的情况.[/quote 发表:

没办法,我用的是99年的FOR WINDOWS的sh等工具,所以空格不会被自动删除的。
new_ip=`ping -n 1 www.163.com |grep 'Pinging' |cut -d[ -f 2 |cut -d] -f 1`  #取PING结果的第一行[ ]中的字符
这语句不会有空格,也考虑到了request time out的情况,所以才用Pinging这关键字取结果的第一行。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2