如何动态更新DNS记录.md
零、概述
一般来说,DNS记录都是手动更新的,通过修改配置文件,或者通过网站页面,但是如何才能简化工作,使部分DNS记录更新自动化呢?
这就是本文关注的内容。
一、通过DHCP服务来更新DNS记录(DDNS)
DDNS(Dynamic Domain Name Server)是动态域名服务的缩写。 DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。
DDNS在企业中最常见的应用就是服务器的远程控制卡了(iDRAC或者ilo),部署了DDNS的网络中不需要手动设置远程控制卡IP地址,直接使用相关的域名就能访问远程控制卡界面。
DDNS工作原理
ILO网卡在通过DHCP获取地址时,可以把自己的主机名发送给DHCP服务器软件,而DHCP服务器再去更新DNS服务器中的记录。就这么简单,实际使用中会有安全考虑,只有拿着特定KEY的DHCP服务器才能更新。
这里,我们使用DNS服务器软件(bind)和DHCP软件(dhcpd)来实现。
DNS服务器的配置如下
#@以下是DNS配置,文件/etc/named.conf
#@定义一个KEY,用于安全防护
key "ilokey" {
algorithm hmac-md5;
secret "fvA/r7RriulZQWHEVqoG8A==";
};
#@定义一个zone,允许特定的KEY可以更新
zone "ipcpu.com" {
type master;
allow-update { key ilokey; };
file "/etc/named/ipcpu.com.conf";
};
DHCP服务器的配置
#@以下是DHCP配置,文件/etc/dhcpd.conf
ddns-update-style interim;
ignore client-updates;
ddns-updates on;
option domain-name "ipcpu.com";
option domain-name-servers 4.4.4.2;
default-lease-time 600;
max-lease-time 7200;
#@设置KEY和Zone
key "ilokey" {
algorithm hmac-md5;
secret "fvA/r7RriulZQWHEVqoG8A==";
};
zone ipcpu.com. {
primary 127.0.0.1;
key ilokey;
}
subnet 4.4.4.0 netmask 255.255.255.0 {
range 4.4.4.101 4.4.4.150;
option domain-name-servers 4.4.4.2;
option domain-name "ipcpu.com";
option routers 4.4.4.1;
default-lease-time 600;
max-lease-time 7200;
}
DHCP服务器需要注意的地方:
- 打开DDNS选项
- 只里面必须配置zone 这个选项;
- primary 127.0.0.1; 如果DNS和DHCPD不在一台机器上需要改成外部IP;
结果测试
然后我们在DHCP服务器上看到了分配给客户的IP信息
[root@s0 named]# tail -11 /var/lib/dhcpd/dhcpd.leases
lease 4.4.4.150 {
starts 5 2012/09/14 10:03:27;
ends 5 2012/09/14 10:13:27;
binding state active;
next binding state free;
hardware ethernet 00:0c:29:14:e6:f4;
set ddns-rev-name = "150.4.4.4.in-addr.arpa.";
set ddns-txt = "0016de8f4b9a6439c2d2abe55a7c3d58b1";
set ddns-fwd-name = "rac-H3LG23X.ipcpu.com";
client-hostname "rac-H3LG23X";
}
[root@s0 named]# ping rac-H3LG23X.ipcpu.com
PING rac-H3LG23X.ipcpu.com (4.4.4.150) 56(84) bytes of data.
64 bytes from 4.4.4.150: icmp_seq=1 ttl=64 time=0.289 ms
二、通过nsupdate来更新DNS记录
使用动态更新之前需要在配置文件中的zone中加入allow-update,如下
zone "ipcpu.com" {
type master;
allow-update { any; };
file "data/ipcpu.com.txt";
};
#使用allow-update { keyname; }; 会更加安全
然后即可通过nsupdate命令更新DNS记录了
# nsupdate
> server 192.168.36.54
> update add update.ipcpu.com 6000 IN A 192.168.0.2
> send
> quit
或者使用python的dnspython模块来完成
#!/usr/bin/env python
# -*- coding=utf-8 -*-
import dns.query
import dns.tsigkeyring
import dns.update
import sys
keyring = dns.tsigkeyring.from_text({
'ipcpu-example-dyn-update.' : 'XXXXXXXXXX=='
})
update = dns.update.Update('ipcpu.com', keyring=keyring,
keyname="ipcpu-example-dyn-update.")
update.add('st', 300, 'a', '2.2.2.2')
response = dns.query.tcp(update, '192.168.36.54')
更新完成后,可以使用 dig @192.168.36.54 st.ipcpu.com来测试。
三、journal文件查看和整合
通过查看服务器数据,我们发现动态更新的域名都会存储到ipcpu.com.txt.jnl文件中,这并不是一个文本文件,如何查看其内容呢?
bind为我们提供了一个命令named-journalprint,通过这个命令来查看。
#named-journalprint ipcpu.com.txt.jnl
del ipcpu.com. 604800 IN SOA jackal. root.jackal. 2 604800 86400 2419200 604800
add ipcpu.com. 604800 IN SOA jackal. root.jackal. 3 604800 86400 2419200 604800
add update.ipcpu.com. 6000 IN A 192.168.0.2
del ipcpu.com. 604800 IN SOA jackal. root.jackal. 3 604800 86400 2419200 604800
add ipcpu.com. 604800 IN SOA jackal. root.jackal. 4 604800 86400 2419200 604800
add st.ipcpu.com. 300 IN A 2.2.2.2
把数据放在这个文件里其实挺难管理的,我们还可以把数据合并回主数据文件ipcpu.com.txt,操作命令如下。
#@@freeze zone first to avoid update
rndc freeze ipcpu.com
#@@update zone file
rndc thaw ipcpu.com
四、参考资料
无
转载请注明:IPCPU-网络之路 » 如何动态更新DNS记录