10.1 PowerDNS zone设置

概述

根据10.1 PowerDNS安装部署 中内容进行配置zone, 建立好powerdns集群后根据需要的域名进行如下配置, 下文的测试域名为example.com, 根据节点的状态分别进行配置。 配置DNS之前需要明白DNS Modes of Operation SOA and NS记录区别 还有powerdns私用zone递归查询

DNS Modes of Operation

Powerdns总体来说有Master/SlaveNative 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

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.15310.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

  1. 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可以解决此问题

  2. 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记录也配置错误

  3. Request to queue notification for domain 'example.com' was processed, but no valid nameservers or ALSO-NOTIFYs found. Not notifying!

    zone不存在有效的NS记录也没有配置ALSO-NOTIFYs

最后更新于