我是一名云平台IAAS层的运维开发工程师,在本系列文章中,我会介绍服务器装机的方方面面,欢迎大家关注.
本系列已经发布的文章,欢迎大家阅读
0x00 域名动态注册对于数据中心,通常需要自己的域名服务器,用来管理环境中的域名解析和注册,毕竟环境中的机器数量多,加上其他一些服务也有自己的IP对外暴露.如果所有的服务之间都用IP来相互引用,有两个比较麻烦的问题:
通常来说,IP不好记.看到一个IP,比如192.168.1.1,我们根本不知道这个IP下面有什么服务.但是如果是一个域名,比如zk1.example.com,那么我们很容易知道其是zk集群中的一台机器.当IP变更之后,不好维护. 如果服务直接使用IP来相互引用,当因为某种原因,IP必须要变化的时候,这种相互引用关系就变得很难维护了.如果是域名,那么只需要更新一下域名对应的A记录,最多有些服务可能要重启一下.0x01 搭建named dns服务器搭建dns域名服务器通常使用bind9 named服务器. 在centos7中,直接yum install -y bind就可以安装了.
安装完成后对/etc/named.conf进行如下配置.其中最主要的是配置example.com这个zone,其type为master,表示可以更新域名记录,为了限制只能在本机通过rndc对域名记录进行更新,配置allow-update { 127.0.0.1; };
#cat /etc/named.confoptions { directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; allow-query { localhost; 0.0.0.0/0; };};logging { channel default_debug { file "data/named.run"; severity dynamic; print-time yes; };};zone "." IN { type hint; file "named.ca";};include "/etc/named.rfc1912.zones";# 定义一个zone,可以在本地使用nsupdate进行更新zone "example.com" IN { type master; allow-update { 127.0.0.1; }; file "example.com";};下面配置example.com的zone数据. 这儿除了配置必要的SOA信息,NS记录. 最重要的是配置了dnsapi.example.com的A记录为本机IP 172.18.0.1. 这样其他服务要更新域名的时候就可以调用dnsapi.example.com提供的API服务了.
#cat /var/named/example.com$ORIGIN .$TTL 60 ; 1 minuteexample.com IN SOA ns1.example.com. admin.example.com. ( 10002 ; serial 600 ; refresh (10 minutes) 300 ; retry (5 minutes) 2419200 ; expire (4 weeks) 3600 ; minimum (1 hour) ) NS ns1.example.com.$ORIGIN example.com.dnsapi A 172.18.0.1ns1 A 172.18.0.1然后使用systemctl start named启动dns服务器.成功之后使用dig @localhost axfr example.com确定内容正确.
#dig @localhost axfr example.com; <<>> DiG 9.11.9-RedHat-9.11.9-1.fc30 <<>> @localhost axfr example.com; (2 servers found);; global options: +cmdexample.com. 60 IN SOA ns1.example.com. admin.example.com. 10002 600 300 2419200 3600example.com. 60 IN NS ns1.example.com.dnsapi.example.com. 60 IN A 172.18.0.1ns1.example.com. 60 IN A 172.18.0.1example.com. 60 IN SOA ns1.example.com. admin.example.com. 10002 600 300 2419200 3600;; Query time: 1 msec;; SERVER: ::1#53(::1);; WHEN: Wed Aug 28 21:44:33 CST 2019;; XFR size: 5 records (messages 1, bytes 203)0x02 使用nsupdate更新域名记录nsupdate命令可以动态更新named中配置了allow-update zone的域名记录.
如下是给test.example.com绑定A记录为1.2.3.6,TTL为60s
nsupdate -v << EOFserver 127.0.0.1update add test.example.com 60 A 1.2.3.6sendEOF可以看到这条域名记录有了.(也可以使用dig +short @localhost test.example.com查看 )
#dig @localhost axfr example.com; <<>> DiG 9.11.9-RedHat-9.11.9-1.fc30 <<>> @localhost axfr example.com; (2 servers found);; global options: +cmdexample.com. 60 IN SOA ns1.example.com. admin.example.com. 10003 600 300 2419200 3600example.com. 60 IN NS ns1.example.com.dnsapi.example.com. 60 IN A 172.18.0.1ns1.example.com. 60 IN A 172.18.0.1test.example.com. 60 IN A 1.2.3.6example.com. 60 IN SOA ns1.example.com. admin.example.com. 10003 600 300 2419200 3600;; Query time: 0 msec;; SERVER: ::1#53(::1);; WHEN: Wed Aug 28 21:46:46 CST 2019;; XFR size: 6 records (messages 1, bytes 224)0x03 使用flask编写更新域名API接口如果总是使用nsupate来更新域名,操作起来会比较麻烦,而且域名服务器通常不能随便登录.可以在域名服务器上提供一个更新域名的API,这样其他服务只需要调用这个API即可更新域名.
我使用flask实现了一个简单的可以更新和删除A记录的接口.支持update和remove两个API调用
如下是update的调用样例
#curl 'dnsapi.example.com/api/dns/update?name=test1.example.com&ip=2.3.4.5'ok完成之后域名信息如下,可以看到test1.example.com的域名A记录被成功添加了.
#dig @localhost axfr example.com; <<>> DiG 9.11.9-RedHat-9.11.9-1.fc30 <<>> @localhost axfr example.com; (2 servers found);; global options: +cmdexample.com. 60 IN SOA ns1.example.com. admin.example.com. 10004 600 300 2419200 3600example.com. 60 IN NS ns1.example.com.dnsapi.example.com. 60 IN A 172.18.0.1ns1.example.com. 60 IN A 172.18.0.1test.example.com. 60 IN A 1.2.3.6test1.example.com. 60 IN A 2.3.4.5example.com. 60 IN SOA ns1.example.com. admin.example.com. 10004 600 300 2419200 3600;; Query time: 0 msec;; SERVER: ::1#53(::1);; WHEN: Wed Aug 28 21:56:19 CST 2019;; XFR size: 7 records (messages 1, bytes 246)如下是remove的调用样例
#curl 'dnsapi.example.com/api/dns/remove?name=test1.example.com'ok完成之后域名信息如下,可以看到test1.example.com的域名A记录被成功删除了.
#dig @localhost axfr example.com; <<>> DiG 9.11.9-RedHat-9.11.9-1.fc30 <<>> @localhost axfr example.com; (2 servers found);; global options: +cmdexample.com. 60 IN SOA ns1.example.com. admin.example.com. 10005 600 300 2419200 3600example.com. 60 IN NS ns1.example.com.dnsapi.example.com. 60 IN A 172.18.0.1ns1.example.com. 60 IN A 172.18.0.1test.example.com. 60 IN A 1.2.3.6example.com. 60 IN SOA ns1.example.com. admin.example.com. 10005 600 300 2419200 3600;; Query time: 0 msec;; SERVER: ::1#53(::1);; WHEN: Wed Aug 28 21:58:21 CST 2019;; XFR size: 6 records (messages 1, bytes 224)其中实现的核心函数就是使用subprocess.run来调用nsupate命令.整体来说还是比较简单的.
基于这个实现,大家可以进行扩展,完成对其他类型,比如CNAME,AAAA类型域名的更新操作.
0xff 总结数据中心中大量的服务需要相互调用,如果相互使用IP很容易出错,通过域名可以减少错误.域名服务器最好配置成可以动态更新,但是最好不要手动使用nsupdate去更新,而是写一个API来进行操作.实际上,上面介绍的内容每个zone只有一个master节点,为了高可用,可以再配置一到多个slave节点.