�� DNS �定技巧


Google
�原本是 Leo 兄的�信指教�因��在太有�考�值了�於是公�同好。
所有� dynamic dns 技�有�趣的朋友�都��看的。
--
----- Original Message -----
From: LeoLiou
To: netman
Sent: Monday, February 11, 2002 6:59 AM
Subject: about dns
Hi, kenny:
我是 Leo,好久不��~~ 在此跟您拜�年,新年快�喔~ :-)
放假回�翻了您的 DNS 教�,嗯,太棒�,�充了�多�多的新�西,
昨天我回了一篇有� "�� IP 架站" 的��文章,�面是提到��更新
DNS 的,自行架� Dynamic DNS � client 端的 script 更新,不�我在
DNS 中,不是使用 allow-update,而是使用 update-policy,update-policy
比起 allow-update 更有�性,比方,可以限定什� key 可以做什�事。
�例��,我的 named.conf �得像是��..
// --------------- 宣告 Key 的部分---------------
// P.S: 底下的 leo, mail key 是不正�的
key "leo" {
algorithm hmac-md5;
secret "hB/XM2eFTyxA5r/scautOZ==";
};
key "mail" {
algorithm hmac-md5;
secret "ht5TkKKFP5l8u9ZTcDbStw==";
};

// --------------- 宣告 ZONE 的部分---------------
zone "sayya.org" {
type master;
file "named.sayya";
notify yes;
also-notify {
140.128.78.250;
211.23.99.147;
61.218.164.83;
};
allow-transfer {
140.128.78.250;
211.23.99.147;
61.218.164.83;
};
allow-query {
0.0.0.0/0;
};
update-policy {
// 使用 mail HOST 的 key,�有�限�更 mail.sayya.org � rsync.sayya.org 的 A record
grant mail name mail.sayya.org. A;
grant mail name rsync.sayya.org. A;
// 使用 leo USER 的 key,可以完全控制 sayya.org,比方新增一 subdomain,指定 DNS
// 或是增加一 A, CNAME,TXT.. record 等等
grant leo subdomain sayya.org. ANY;
};
};
大概就是���子,另外附上之前回覆的那篇..
--------
作者: leoliou (暖冬) 看板: Linux
��: Re: �� IP 架站 @_@
��: Sun Feb 10 14:49:30 2002
※ 引述《
skchen.bbs@bbs.nsysu.edu.tw
(ㄚ�)》之�言:
>         小弟在之前就有提�相�的��
>         大家用的��IP�映的系�都不一�
>         我是用 DynDNS 的系�
>         也不知道�什�跑了一段��就��生一大堆��程序 @_@
>         更神的是找不到程序在哪�(�是我比���????) @_@
>         �好像是 DynDNS �的 ddClient 程式有 BUG 吧
>         我利用了 perl 和 bash shell script �了一些小程式
>         可以用��� PPP 介面是否存在
>         如果不存在就�� ^o^
嗯,看到�封信感�是真的有��的�氛,超喜���感�~ :)
�得以前�用 ADSL �接制的�候,是使用 rp-pppoe ��的,�在��後自�
重新��,��可以解���的��。
再�是重�了,Dynamic IP 怎��呢?我目前的�境是�向 Cable,IP 也是由
DHCP Server 取得 Dynamic IP 的。�然,如果您去申� dns2go �似的程式,
是可以解�您�� IP 的��,但是缺�是您不可以使用自己的�址,一定要是
某一些已�律定好的�址,或者是有可能要求您把 Primary DNS 指向�公司代
管,另外,就是您可能�要在 Server 中�行�公司所提供的�� IP 更新程式..
��如何,就��我�想到系�安全性的��.. �我��,非常不方便。
於是,我找了一台固定 IP 的 Server,架上了 Bind,�台就是我自己�域的
Primary DNS,也就是 Dynamic DNS,如何�定,晚�提到。而�台 DNS 的
固定 IP 假�� 61.22.33.20,Domain � example.com,��名��
ns.example.com :)
再�,比方我的 mail server 架在家�,就是我�在�向 Cable 的�路上,
�台 mail server 的 Domain name 假��: mail.example.com
我只要定�向我的 Primary DNS 更新我的 mail server 的 IP 就可以�,
Primary DNS 怎�判�允�哪些��做更新呢?有��方式,第一�方式�
在 Primary DNS 中�定 allow-update,�定某些固定 IP 可以向 Primary
DNS 更新�料,但是比��有�性。另外一�就是待�要介�的
update-policy。
allow-update  可以允�特定的 IP 或 key �做��更新,��是不允�任何
IP 更新。
update-policy 在 BIND 9 才提供,不用指定某特定的 IP 才可以做��更新,
而是要� key ��定更新�限。Primary DNS 有�� key,
mail server 往後只要��� key 就可以��更新 IP 了。
�然了,mail server � Primary DNS 的 key 得一�才行。
key 就是用 dnssec-keygen 工具�生出�的��,�在於 Primary DNS
上,�生 key,��� mail server。
首先,感生 mail server 用的 key:
# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST mail
Kmail.+157+44587
#
查看一下,�果��生了�名�似 Kmail.+157+44587.key �
Kmail.+157+44587.private ���案。
其中 Kmail.+157+44587.key �案�容�得�似��:
# less Kmail.+157+44587.key
mail. IN KEY 512 3 157 BJ7y6dzxchy3u0B4hRLksQ==
#
�案�容 BJ7y6dzxchy3u0B4hRLksQ== �是���的,就是所�的 key。
首先,您得���� key ��到 mail server 上面,建�使用 sftp ��,
避免被�。
�在,�始 Primary DNS 上的�定了。
----- /etc/named.conf ----------
key "mail" {
algorithm hmac-md5;
secret "BJ7y6dzxchy3u0B4hRLksQ==";
};
zone "example.com" {
type master;
file "named.example";
update-policy {
grant mail name mail.example.com. A;
// mail key �允�更新 mail.example.com 的 A record.
};
};
----- End of File ----------
Primary DNS 上面的�定完成後,��得重跑 bind。
接下�,在 mail server 方面,要如何更新呢?
�然,最重要的,首先要取得 mail server 的 key。��已�有提到,
在 Primary DNS �生後,用 ftp ��到 mail server �。
使用 nsupdate 工具向 Primary DNS 做更新�作:
$ nsupdate -k Kmail.+157+44587.key
> server ns.example.com                          // 指定 Primary DNS
> update delete mail.example.com A               // 先�除��料
> update add mail.example.com 0 A 210.64.233.10  // 再新增�料
> send                                           // 送出到 Primary DNS
$                                                // Ctrl-C or Ctrl-D ��
��一下,是不是更新成功:
$ host mail.example.com ns.example.com
mail.example.com has address 210.64.233.10
$
恭喜您更新成功了,如果您�有成功,�到 Primary DNS 上看 messages ���。
注意, key �案的�限,��只有 owner 可以��,�� -rw------- �注意。
�行 nsupdate 的 user,�� key 的 owner,否���生 Permission denied
的情形。
如果您要�您的��自�更新,��有我自己�的 script 供�考:
建立一� tmp.txt �容如下:
----- tmp.txt ----------
server ns.example.com
update delete mail.example.com A
update add mail.example.com 0 A SERVER_NEW_IP
send
----- End of File ----------
建立更新的 script: newip.sh
----- newip.sh ----------
#!/bin/sh
#
# Written by LeoLiou.
#
# config the update dir.
exe_path=/root/nsupdate
new_IP=`/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f 2 \
| cut -d' ' -f1`
/bin/cat $exe_path/tmp.txt | sed s/SERVER_NEW_IP/$new_IP/g \
> $exe_path/update.txt
# update now IP to name server.
/usr/bin/nsupdate -k $exe_path/Kmail.+157+44587.key -v $exe_path/update.txt
----- End of File ----------
��您的 key, tmp.txt, newip.sh 放置於同一目�,��予 newip.sh �行�限。
��行一次 newip.sh �定�有��之後,再利用 crontab �行 newip.sh 即可。
0 * * * * /root/nsupdate/newip.sh
��就完成整��� IP 更新�制了。
�於 update-policy,�看 BIND 9 Administrator Reference Manual:

http://www.isc.org/products/BIND/bind9.html
dnssec-keygen � nsupdate 的使用方法,相信 man page �得已�很清楚了。
:-)
--
Leo Liou (
leo@i18n.linux.org.tw
)
Join i18n project:
http://i18n.linux.org.tw/
* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~
---------------
�充 by netman  on October 30, 2002�
---------------
我略�修改了 Leo兄 的 script ��置於 /root/nsupdate 目�下面。
我���界面改� ppp0 �同�也�少不必要的�送�作。
(��原本的 tmp.txt 我也改名� nsupdate.scr 了��留意。)
�容如下�
#!/bin/bash
#
# Written by LeoLiou.
# Modified by netman on 2002/09/26
#
# set variables
if echo $0 | grep '^/' ; then
w_dir=${0%/*}
else
w_dir=$PWD/${0%/*}
fi
KEY_FILE=$w_dir/Kmail.+157+44587.key
UPDATE_SCR=$w_dir/nsupdate.scr
UPDATE_DATA=$w_dir/nsupdate.data
HOST_NAME=mail.example.com
NS_SERVER=ns.example.com
IF="ppp0"
# ensure key files
for file in $KEY_FILE ${KEY_FILE%key}private
do
if [ ! -r $file ]; then
echo "$(basename $0): ERROR: $file is not readable."
exit 1
fi
done
# prepare initial script
test -f $UPDATE_SCR || {
cat >| $UPDATE_SCR
# ensure the server is connectable
host $NS_SERVER $NS_SERVER | grep "$NS_SERVER" &>/dev/null || {
echo "$(basename $0): ERROR: could not contact nameserver $NS_SERVER."
exit 3
}
# get current ip
NEW_IP=$(ifconfig | grep "$IF " -A 1 \
| awk '/inet/ {print $2}' | sed -e 's/.*://')
# do a test then update
host $HOST_NAME $NS_SERVER | grep "$NEW_IP" &>/dev/null || {
/bin/cat $UPDATE_SCR | sed s/NEW_IP/$NEW_IP/ \
| sed s/NS_SERVER/$NS_SERVER/ \
| sed s/HOST_NAME/$HOST_NAME/ \
>| $UPDATE_DATA
/usr/bin/nsupdate -k $KEY_FILE -v $UPDATE_DATA || rm -rf $UPDATE_DATA
}
#-- end of script --#
上面的 script 可於��下�:

http://study-area.ks.edu.tw/linux/src/newip.sh.tgz
目前�� script 只能在 linux client 上�行�
但我想�透���的 cgi 功能�那�任何的 windows client 也能��的�行更新�
不���部份就需要其他朋友�忙�定了。
假如您已�成功完成了��迎通知 leo 或 netman �以便和大家作更�一步的分享。
���


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/5591/showart_102539.html
免责声明:
1、本文系本网编辑转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。
2、如涉及作品内容、版权和其它问题,请在30日内与本网联系,我们将在第一时间删除内容