powerdns zone配置
Zone Settings
概述
根据10.1 PowerDNS安装部署 中内容进行配置zone, 建立好powerdns集群后根据需要的域名进行如下配置, 下文的测试域名为example.com
, 根据节点的状态分别进行配置。 配置DNS之前需要明白[DNS Modes of Operation](#DNS Modes of Operation) [SOA and NS记录区别](#SOA and NS记录区别) 还有powerdns私用zone递归查询
DNS Modes of Operation
Powerdns总体来说有Master
/Slave
和 Native replication
两个模式, 其中Native replication
数据库主从复制。 考虑使用数据库主从复制的维护成本比较高, 所以使用Master
/Slave
模式, 当启用Master/Slave模式时需要注意如下配置:
- Master/Slave状态必须在
/etc/powerdns/pdns.conf
配置文件中指定 - Master/Slave的状态存在数据库中的
domains
表中, 表中的type
字段必须生命为Master
或者Slave
, 如果type为Slave那么表中的Master字段需要存Master节点的IP地址 - Nameserver必须设置为NS记录
主要工作原理如下:
提到Master和Slave的记录同步就不得不说到SOA记录中的序列号记录和dns的全量更新协议(AXFR)/dns的增量更新协议(IXFR)
。 DNS的区域复制只会发生在如下的情况:
- 当区域的刷新间隔到期时
- 当其Master服务器主动向Slave服务器通知区域更改时
- 启动区域的Slave服务器时
- 在区域的Slave服务器使用DNS控制台以便手动启动来自其master服务器的传送时
区域复制的主要流程如下:
- Slave像Master发出请求查询SOA
- Master 响应请求并回复SOA资源记录的给Slave, Slave进行序列号对比如果这个number比当前存储的高那就说明master服务器存在改变
- Slave服务器向Master DNS服务器发送初始“所有区域”传送(AXFR)区域传输请求。
- Master服务器作出响应并将全量或者增量信息发送给Slave服务器
- 根据SoA记录中refresh的间隔, slave服务器从新进行上面的操作
有关DNS Notify的更多内容请查看https://tools.ietf.org/html/rfc1996.html
SOA and NS记录区别
在任何 DNS 记录文件(Domain Name System (DNS) Zone file)中, 都是以SOA(Start of Authority)记录开始。SOA 资源记录表明此 DNS 名称服务器是为该 DNS 域中的数据的信息的最佳来源。SOA 记录与 NS 记录的区别:简单讲,NS记录表示域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析;SOA记录设置一些数据版本和更新以及过期时间的信息.
SOA
SOA记录表明了DNS服务器之间的关系。SOA记录表明了谁是这个区域的所有者。比如51CTO.COM这个区域。一个DNS服务器安装后,需要创建一个区域,以后这个区域的查询解析,都是通过DNS服务器来完成的。现在来说一下所有者,我这里所说的所有者,就是谁对这个区域有修改权利。常见的DNS服务器只能创建一个标准区域,然后可以创建很多个辅助区域。标准区域是可以读写修改的。而辅助区域只能通过标准区域复制来完成,不能在辅助区域中进行修改。而创建标准区域的DNS就会有SOA记录,或者准确说SOA记录中的主机地址一定是这个标准区域的服务器IP地址。
存储格式为:
primary hostmaster serial refresh retry expire default_ttl
dig查询出的格式如下
ns1.a.shifen.com. baidu_dns_master.baidu.com. 2003200012 5 5 2592000 3600
- primary: default-soa-name 表示该Zone的解析服务器
- hostmaster:
hostmaster@domain-name
表示该域名的所有者, 该信息的第一个点表示为@
- serial(序列号): 是域名记录的版本,每更改一次域名的任何DNS记录,版本号就会自动加一,这时secondary dns就会知道DNS记录发生更改,以便重新同步。
- refresh(刷新时间): 告诉secondary dns多久应该查询primary dns,看看DNS记录是否有更新。每次查询时,secondary dns会向primary dns请求SOA记录。如果记录中的serial number跟secondary dns已有的序列号不一样,则会向primary dns请求传送域名的当前的DNS记录。
- retry(重试时间): 如果想primary dns请求传送域名当前的DNS记录失败后,间隔重试时间后再次重试请求。一般来说,retry小于refresh。
- expire:(过期时间): 在过期时间之前,secondary dns会继续请求DNS记录,并且在此时间里,secondary dns会根据已有的记录应答相关的DNS查询。如果到了过期时间后,secondary dns会停止应答该域名的DNS查询。
- default_ttl 域名所有记录的最小生存时间值。当用户DNS查询到记录后,将存在缓存中,直到至少过了这个时间才将缓存刷新重新查询。
powerdns私用zone递归查询
如下图所示当使用powerdns做为私有zone解析时, recursor
将私有zone的转发到authoritative Server
, 将不是私有zone的转发到其它dns服务器上, recursor的配置请看 [Recursor Node](#Recursor Node)
zone配置实例
Master Node
建立zone与解析
本文Master node的backend为Mysql,可以直接执行如下SQL建立zone与records, 也另外一种方法使用Powerdns-admin
进行相关配置,还有一种方式使用pdnsutil
命令行工具, 建立完成后使用dig验证解析是否生效
mysql> INSERT INTO domains (name, type) values ('example.com', 'Master');
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'example.com','localhost admin.example.com 1 10380 3600 604800 3600','SOA',86400,NULL);
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'example.com','dns-us1.powerdns.net','NS',86400,NULL);
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'example.com','dns-eu1.powerdns.net','NS',86400,NULL);
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'www.example.com','192.0.2.10','A',120,NULL);
以上SQL的主要内容解析如下:
- 第1行为建立
example.com
的zone, 由于为Master使用所以type=Master- 第2行设置
example.com
的SOA记录- 第3,4行设置zone的nameserver, 一般为powerdns_slave地址
- 第5行为设置·
www.example.com
的A记录
pdnsutil
创建zone, 但是创建出来的zone的类型为native,要求为master
# pdnsutil create-zone example.com ns1.example.com.
添加A 记录record
# pdnsutil add-record example.com www A '10.40.58.153'
New rrset:
www example.com. 3600 IN A 10.40.58.153
添加NS的A记录
# pdnsutil add-record example.com ns1 A '10.40.58.153'
New rrset:
www example.com. 3600 IN A 10.40.58.153
设置zone的metadata
登录Master节点使用powerdns的命令行工具设置metadata, 由于/etc/powerdns/pdns.conf
没有设置default notify
# pdnsutil set-meta example.com ALSO-NOTIFY 10.40.58.153
- 其中
example.com
为zone的名称, 实际情况根据建立zone与解析 SQL中第一行插入的zone为准ALSO-NOTIFY 10.40.58.153
当这个zone发生通知时通知到10.40.58.153
,10.40.58.153
为Slave节点的IP地址
查看zone的metadata
pdnsutil get-meta example.com
验证解析是否生效
dig A www.example.com @127.0.0.1 #验证A记录是否正常
dig SOA example.com @127.0.0.1 #验证SOA记录是否正常
dig NS example.com @127.0.0.1 #验证NS记录是否正常
Slave Node
创建slave zone
# pdnsutil create-slave-zone example.com 10.40.58.116
Creating slave zone 'example.com', with master(s) '10.40.58.116:53'
从master上拉取所有的record
# pdns_control retrieve example.com
删除slave zone
# pdnsutil delete-zone example.com
从master从新拉取记录
Recursor Node
编辑/etc/powerdns/recursor.conf
添加如下信息
forward-zones=example.com.=10.40.58.153:53
forward-zones-recurse=.=100.100.2.136:53;100.100.2.138:53
- 其中forward-zones=example.com 表示将所有该zone的解析交给10.40.58.153这个地址进行解析
- forward-zones-recurse 表示将不是example.com zone的解析全部交给这两个IP地址解析
配置完成后重新启动recursor根据解析进行测试, 请参考 验证解析是否生效
Q&A
-
Unable to AXFR zone 'example.com' from remote '10.40.61.116:53' (PDNSException): GSQLBackend unable to feed record: CANTOPEN error in sqlite3, often caused by unwritable sqlite3 db _directory_: unable to open database file
是因为 /var/lib/powerdbns 目录所属用户和组为root, 执行
chown -R pdns:pdns /var/lib/powerdns
可以解决此问题 -
pdns_server: Notification for example.com to 10.40.58.154:53 failed after retries
查看
10.40.58.154
主机发现没有任何的日志输出, 也没有触发AXFR, 查看example.com 的metadata发现没有配置also-notify, NS记录也配置错误 -
Request to queue notification for domain 'example.com' was processed, but no valid nameservers or ALSO-NOTIFYs found. Not notifying!
zone不存在有效的NS记录也没有配置ALSO-NOTIFYs