DNS:如何让本地服务器将结果叠加在权威服务器上?

我有一个域我的DNS控制,并在互联网上托pipe。 我也有一个NAT的内部networking(192.168.0.0/24),它有互联网接入,我也控制。 在这个内部networking上,我也有一个DNSparsing器。 两个DNS软件都是PowerDNS。

我希望能够做的是内部networking上的DNSparsing器能够添加/更改来自权威服务器的查询和结果的logging。 例如,授权服务器可能有一个animal.example.com的logging:

animal.example.com. IN AAAA 2001:140:283::1 

但是,我喜欢这样,当内部客户端做一个dns查找animal.example.com,他们可能会回来以下内容:

 animal.example.com. IN AAAA 2001:140:283::1 animal.example.com. IN A 192.168.0.2 

显然,我可以设置内部的DNS服务器来冒充example.com的权威,但是这需要花费相当的努力来保持主DNS服务器和内部DNS服务器同步都。 如果内部的DNS服务器可以以某种方式成为主DNS服务器的一个从属服务器,但是也可以添加自己的结果,那将是理想的。

这可能吗?

其实如果我不得不这样做,我会使用一个Lua脚本与recursor与postresolve上的数据冲突。

Hoever我真的推荐了一些不同的东西:只需使用一个独立的权威区域,比如internal.example.com,你可以从授权服务器获得AXFR example.com,然后附加你的本地RFC1918数据。

这样,您仍然可以从局域网上debugging权威区域,如使用内部数据。

关于PowerDNS Recursor Lua脚本: http : //doc.powerdns.com/recursor-scripting.html

我想你想要的是一个水平分割DNS设置,但PowerDNS不直接支持这种(不像绑定或DJBDNS)。 来自作者的官方回应是: http : //mailman.powerdns.com/pipermail/pdns-users/2006-September/003779.html

我从来没有发现水平分割DNS特别令人困惑,尤其是如果文件在文件系统中清楚地排列,例如./master-interal/domain.com ./master-external/domain.com

他们build议的唯一select是在侦听不同端口的服务器上运行PowerDNS的两个不同实例。 我想你会利用iptables将stream量redirect到端口53,无论哪个实例是相关的。

我强烈build议你不要走这条路,因为它非常混乱,复杂而且难以pipe理。 相反,你应该build立一个像inside.example.com这样的独立的内部域。 那么,如果你的外部dns服务器也在你的内部networking上,你应该把它设置为两个域的权威性。 但是,如果你的外部dns服务器不在你的内部networking上,你应该设置你的dns内部服务器为inside.example.com的权威。 那么你的DNS服务器应该转发所有其他的请求到外部的DNS服务器。

我意识到这一点的缺点是你必须改变所有内部机器上的域名,但是现在做这个前期工作将在以后节省你很多的困惑。

通过PowerDNS Recursor分割DNS

在我的Fedora 20上摸索了一段时间后,我似乎已经成功了。 我还没有find一个完整的方法在任何地方,所以一个简短的写作一个最小的设置:

说明

我们想要parsingwebserver.dyndns.org以便从Internet和局域网上访问Web服务。

来自networking

Internet上的计算机awebserver.dyndns.orgparsing为IP地址IPisp 。 Behing IPisp是一个带有NAT的路由器,它将端口80端口转发到LAN IP IPx ,从而使互联网上的Web服务可用。

这自然是通过在域dyndns.org的权威域名服务器上注册IP地址IPisp来完成的,对于像DynDns这样的服务,其使用在路由器上运行的ddclient或LAN中的某个地方来完成,并且因此没有更多的兴趣这里。

从局域网

局域网上的机器bwebserver.dyndns.orgparsing为IP地址IPx ,以使Web服务直接在LAN上可用。 此外,假设局域网中的所有机器均按照bar.localdomain的名称命名,则webserver.localdomain的名称也应parsing为IPx 。 我们也希望进行反向查找,将IPxparsing为局域网内的webserver.dyndns.org (在Internet上, IPx当然parsing为无, IPispparsing为由ISP生成的任意string)。

我们假设pdns-recursor运行在IP IPDns的独立机器上,但是我们也可以在networking服务器上运行(与IPx相同的IP地址或别名),或者在LAN上只有一台机器。

机器“b”可以通过DHCP静态或dynamicconfiguration; 看dhclientdnsmasq ,可能还有avahiNetworkManager也会进入这里,因为它可能会重写/etc/resolv.conf ; 现在,假设静态configuration。

另外,假定:

 IPx = 192.168.1.1 IPdns = 192.168.1.2 IPbar = 192.168.1.3 

然后:

/etc/resolv.conf在任何机器上:

 nameserver 192.168.1.2 domain localdomain 

pdns-recursor的configuration:

/etc/pdns-recursor/recursor.conf基本上/etc/pdns-recursor/recursor.conf为:

 setuid=pdns-recursor setgid=pdns-recursor allow-from=127.0.0.0/8, 192.168.1.0/8, ::1/128, fe80::/10 auth-zones=webserver.dyndns.org=/etc/pdns-recursor/[webserver.dyndns.org].zone, localdomain=/etc/pdns-recursor/[localdomain].zone, 168.192.in-addr.arpa=/etc/pdns-recursor/[168.192.in-addr.arpa].zone local-address=192.168.1.2 

上面引用了非常多的分割区文件 (它们的实际名称并不重要):

在/ /etc/pdns-recursor/[168.192.in-addr.arpa].zone (注意在logging名称末尾缺less一个点 – 它是一个相对名称,不是绝对的名称: 1.1表示1.1.168.192.in-addr.arpa )。 这有效或无“IN”。

 1.1 IN PTR webserver.dyndns.org. 2.1 IN PTR dns.localdomain. 3.1 IN PTR b.localdomain. 

/etc/pdns-recursor/[webserver.dyndns.org].zone (注意logging名称末尾的点 – 它是绝对名称而不是相对名称)

 webserver.dyndns.org. IN A 192.168.1.1 

/etc/pdns-recursor/[localdomain].zone

 webserver IN A 192.168.1.1 dns IN A 192.168.1.2 b IN A 192.168.1.3 

重启pdns-recursor ,就可以通过运行这些命令来使用dig进行testing:

 PDNS=192.168.1.2 # Test unknwon domain resolution and webserver resolution dig @$PDNS www.cnn.com | grep -A1 ";; ANSWER SECTION:" dig @$PDNS webserver.dyndns.org | grep -A1 ";; ANSWER SECTION:" # Test responses for localdomain dig @$PDNS unknown.localdomain | grep -A1 ";; ANSWER SECTION:" dig @$PDNS webserver.localdomain | grep -A1 ";; ANSWER SECTION:" dig @$PDNS b.localdomain | grep -A1 ";; ANSWER SECTION:" dig @$PDNS dns.localdomain A | grep -A1 ";; ANSWER SECTION:" # Test responses for localdomain if the domain is omitted dig +search @$PDNS webserver | grep -A1 ";; ANSWER SECTION:" # Test reverse resolution dig @$PDNS -x 192.168.1.1 | grep -A1 ";; ANSWER SECTION:" dig @$PDNS -x 192.168.1.2 | grep -A1 ";; ANSWER SECTION:" dig @$PDNS -x 192.168.1.3 | grep -A1 ";; ANSWER SECTION:" dig @$PDNS -x 192.168.1.4 | grep -A1 ";; ANSWER SECTION:" 

在PowerDNS中使用PipeBackend 。 我在Python上创build了几个系统。

PipeBackend:

PipeBackend主要用于在不与PowerDNS紧密集成的情况下快速开发新的后端。 它允许最终用户以任何语言编写PDNS后端。