IT技术互动交流平台

dnspython实现DDNS功能

作者:david_bj  发布日期:2014-05-23 08:52:47

DDNS应用场景

一个平台有一组MYSQL集群服务器,该组服务器通过域名解析进行提供服务。如果其中一台服务器宕机,可以通过DDNS将其中出现故障的服务器踢出该集群,避免访问到该台服务器的用户受到影响;当该集群的平均负载过高,可以自动从备用的机器中,拉出一台机器,添加到该集群,降低该集群的负载。

dnspython

dnspython 是python的一个DNS工具包。它支持几乎所有的记录类型。它可以用于查询、区域转移和动态更新。它支持TSIG验证信息和ENDS0.

我主要用到它的动态更新功能,给大家分享一下动态更新功能。

 

安装和配置bind

1.安装bind
yuminstallbind
2.配置bind
vim/etc/named.conf
options{
directory"/var/named";
statistics-file"/var/named/stats";
listen-onport53{127.0.0.1;10.58.102.198;};
};

zone"."IN{
typehint;
file"named.ca";
};

zone"localhost"IN{
typemaster;
file"localhost.zone";
};

#此段密钥是通过dnssec-kengen进行生成
key"davidddns"{
	algorithmhmac-md5;
	secret"xcj4wgrtSwkXlHOKTlozvw==";
};

zone"david.com"IN{
typemaster;
file"david.com.zone";
allow-update{keydavidddns;};
};

zone"0.0.127.in-addr.arpa"IN{
typemaster;
file"named.local";
};

zone"10.in-addr.arpa"IN{
typemaster;
file"david.local";
allow-update{keydavidddns;};
};

#通过rndc-kengen生成
#Usewiththefollowinginnamed.conf,adjustingtheallowlistasneeded:

key"rndc-key"{
	algorithmhmac-md5;
	secret"v4goHeKLu3V/rqzEID5Vnw==";
};

controls{
	inet10.58.102.98port953
	allow{any;}keys{"rndc-key";};
};
#Endofnamed.conf

3.配置zone
vim/var/named/david.com.zone

$ORIGIN.
$TTL600	;10minutes
david.com		INSOA	ns.david.com.admin.david.com.(
				2014052103;serial
				3600;refresh(1hour)
				600;retry(10minutes)
				86400;expire(1day)
				604800;minimum(1week)
				)
			NS	ns.david.com.
			NS	ns2.david.com.
$ORIGINdavid.com.
ns			A	10.58.102.198
ns2			A	10.58.102.199
www			A	10.58.102.198

4.使用rndc管理bind
rndc-config>/etc/rndc.key
将该文件的key和controls复制到named.conf文件,具体内容看上面配置文件(named.conf)

5.使用dnssec-kengen生成密钥文件
dnssec-kengen-aHMAC-MD5-b128-nUSERdavidddns
-aHMAC-MD5:采用HMAC-MD5加密算法
-b128:生成的密钥长度为128位
-nUSERdavidddns:密钥的用户名为davidddns

该命令会在/var/named目录下生成两个密钥文件,Kdavidddns.+157+50923.key和Kdavidddns.+157+50923.private

然后将密钥的key复制到named.conf,详细内容请看如上named.conf配置文件

6.修改权限
chown-Rnamed:named/var/named/
chownnamed:named/etc/named.conf

7.启动服务
servicenamedrestart

4.安装dnspython

pip install dnspython

 

5.使用dnspython自动更新david.com 记录

#!/usr/local/bin/python2.7

fromoptparseimportOptionParser
importdns.tsigkeyring
importdns.update
importdns.query

SERVER_IP='10.58.102.198'

defopt():
parser=OptionParser(usage="usage:%prog[options][comm1comm2]")
parser.add_option('-a','--Action',
dest="Action",
action="store",
default="add",
help="Action.")
parser.add_option("-z","--zone",
dest="zone",
action="store",
default="david.com",
help="domainzonename.")
parser.add_option("-n","--name",
dest="name",
action="store",
default="www",
help="Hostname.")
parser.add_option("-t","--ttl",
dest="ttl",
action="store",
default="21600",
help="TTLtimes.")
parser.add_option("-T","--type",
dest="type",
action="store",
default="A",
help="Recordexmple:AMXTXTNS")
parser.add_option("-i","--ipaddr",
dest="ipaddr",
action="store",
default="127.0.0.1",
help="ClientIPaddr.")
returnparser.parse_args()

defup():
opts,args=opt()
ttl=opts.ttl
zone=opts.zone
type=opts.type
ip=opts.ipaddr
name=opts.name
action=opts.Action

try:
#davidddns是在dns配置文件的davidddns
#key是dns配置文件的key
keyring=dns.tsigkeyring.from_text({'davidddns':'xcj4wgrtSwkXlHOKTlozvw=='})
	up=dns.update.Update(zone,keyring=keyring)
	
	ifaction=='add':
	up.add(name,ttl,type,ip)
	dns.query.tcp(up,SERVER_IP)
	elifaction=='delete':
	up.delete(name)
dns.query.tcp(up,SERVER_IP)
excepterr:
printerr


if__name__=="__main__":
up()

6.测试

> 查看帮助

wKioL1N9TueyG2TQAAHCFVhm4hQ907.jpg

> 添加一条记录

wKiom1N9T6XxEcYFAAP4d6x1KGA577.jpg> 删除一条记录

wKiom1N9UCbD8AURAANl7k16Dz4713.jpg

 

dnspython 是一个很强大的类库,还有其它更加强大的功能。可以结合自己的线上业务进行使用!

    Tag标签: dnspython   DDNS  
    • 专题推荐

    About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
    本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规