在BIND中为内部networking覆盖一些DNS条目

我有一个运行BIND的DNS服务器的内部networking,通过一个网关连接到互联网。 我的域名“example.com”由外部DNS提供商pipe理。 该域中的一些条目(例如“host1.example.com”和“host2.example.com”)以及顶级条目“example.com”指向网关的公共IP地址。

我希望位于内部networking上的主机将“host1.example.com”,“host2.example.com”和“example.com”parsing为内部IP地址,而不是网关的IP地址。 像“otherhost.example.com”的其他主机仍应由外部DNS提供商解决。

我通过在BIND中为“host1.example.com”和“host2.example.com”定义了两个单入口区域,从而成功实现了host1和host2条目。 但是,如果为“example.com”添加区域,则该域的所有查询都将由本地DNS服务器parsing,例如查询“otherhost.example.com”会导致错误。

是否有可能configurationBIND只覆盖一个域的一些条目,并recursion解决其余的?

最好的方法是通过绑定9.8.1或更新的响应策略区域。 它允许您覆盖任意区域中的单个logging(并且不需要为此创build整个子域,只需logging您想要更改的单个logging),它允许您覆盖CNAME等。其他解决scheme(如Unbound)不能覆盖CNAME 。

https://www.redpill-linpro.com/sysadvent/2015/12/08/dns-rpz.html


编辑:让我们这样做,然后。 我将根据上面链接的教程logging我所做的事情。

我的操作系统是针对Raspberry Pi的Raspbian 4.4,但是这项技术应该在Debian和Ubuntu上没有任何改变,或者在其他平台上进行微小的改动。

去你的绑定configuration文件保存在你的系统上的地方 – 这里是/etc/bind 。 在那里创build一个名为db.rpz的文件,内容如下:

 $TTL 60 @ IN SOA localhost. root.localhost. ( 2015112501 ; serial 1h ; refresh 30m ; retry 1w ; expiry 30m) ; minimum IN NS localhost. localhost A 127.0.0.1 www.some-website.com A 127.0.0.1 www.other-website.com CNAME fake-hostname.com. 

它有什么作用?

  • 它会覆盖假冒地址为127.0.0.1 www.some-website.com的IP地址,从而有效地将该站点的所有stream量发送到环回地址
  • 它将www.other-website.comstream量发送到另一个名为fake-hostname.com站点

任何可以在Bind区域文件中使用的东西都可以在这里使用。

要激活这些更改,还有几个步骤:

编辑named.conf.local并添加此部分:

 zone "rpz" { type master; file "/etc/bind/db.rpz"; }; 

上面链接的教程告诉你添加更多的东西到zone "rpz" { }但这不是必要的简单的设置 – 我在这里显示的是使其在本地parsing器上工作的最低限度。

编辑named.conf.options并在options { }部分的某个地方添加response-policy选项:

 options { // bunch // of // stuff // please // ignore response-policy { zone "rpz"; }; } 

现在重新启动绑定:

 service bind9 restart 

而已。 名称服务器现在应该开始覆盖这些logging。

如果您需要更改,只需编辑db.rpz ,然后重新启动绑定。

奖励:如果您想将DNS查询logging到系统日志,那么您可以留意程序,编辑named.conf.local并确保有一个包含以下语句的logging部分:

 logging { // stuff // already // there channel my_syslog { syslog daemon; severity info; }; category queries { my_syslog; }; }; 

重新绑定绑定,就是这样。

我已经使用这种技术取得了巨大的成功,可以覆盖我正在处理的网站的CNAME,并将其发送到我刚刚testing的新的AWS负载平衡器。 一个Raspberry Pi被用来运行绑定,并且RPi也被configuration为一个WiFi路由器 – 所以通过连接设备到在RPi上运行的SSID,我会得到我需要testing的DNS覆盖。

未绑定的recursionDNS服务器可以覆盖单个资源logging。

查看手册中的local-zonelocal-dataconfiguration设置,例如:

 local-zone: "example.com." transparent local-data: "foo.example.com. IN A 192.168.1.1" 

local-zone上的transparent设置告诉它对没有用local-data提供的任何名称进行正常的recursion查找。

你可能想看看“dnsmasq”,它可以让你做一些巧妙的事情,调整解决scheme。

你正在寻找的是分裂的DNS,由Webopedia定义为:

在拆分的DNS基础结构中,为同一个域创build两个区域,一个用于内部networking,另一个用于外部networking。 拆分DNS将内部主机定向到内部域名服务器以进行名称parsing,并将外部主机定向到名称parsing的外部域名服务器。

本质上,您需要制作外部区域文件的副本,并将其支撑在内部DNS服务器上,然后更改或添加专门用于内部networking的logging。 这是一个非常常见的设置,尽pipe保持两个DNS服务器之间的“外部”logging同步可能是一个痛苦。 如果您在公共服务器上创build或更改logging,则还需要在专用服务器上创build或更改该logging。

无论您使用什么DNS服务器实施,都可以实施。 在大多数设置中,您将有一台服务于外部networking的DNS服务器,另一台服务于内部networking。 使用BIND,也可能是其他实现,通过在named.conf文件的区域部分中使用“allow-query”语句,可以在同一台服务器上拥有两个版本的区域。

BIND的另一种可能性(我从来没有尝试过)将是只在内部使用的logging在内部DNS服务器上设置您的example.com域。 然后,用“第一”参数(与“转发者”一起)设置一个“转发”语句。 从理论上讲,这会问外部的DNS服务器(在“转发器”中设置一个答案,这将不会有你的内部logging,并返回一个失败的答复,然后,内部服务器会看自己的答案。当然,如果那会奏效,但这是一个想法。

在BIND中,我通过使用所需主机名定义一个区域来获得这个结果。 如果您只想覆盖less数几个主机,那么这种方法很好。

我的区域声明如下所示:

 zone "override.example.com" { type master; notify no; file "zone-config/override.example.com"; }; 

我的区域定义如下所示:

 $TTL 4H @ IN SOA ns.override.example.com. root.override.example.com. ( 2009072215 ; Serial 3600 ; Refresh 600 ; Retry 604800 ; Expire 3600 ) ; Minimum ; NS ns IN NS ns.override.example.com. IN A 192.168.1.100 ns IN A 192.168.1.100 

所以,如果我查询内部网DNS和ISP DNS example.com我得到相同的IP,但如果我查询override.example.com我得到不同的结果,如果内部网DNS(主)是可访问的。

你已经走上了正轨。

在您的内部DNS服务器上,您需要为“example.com”正下方的每个exception主机定义一个区域。 为了最大限度地减less这些exception,通常将所有内部机器命名为“hosta.internal.example.com”,DNS服务器将大部分查询发送到外部DNS服务器,但对区域“internal.example.com”具有权威性。 (一旦你通过一个小的操作,通常有一个DNS服务器,客户端指向一个单独的权威的DNS服务器是指向“internal.example.com”)。

通常情况下,只有在主机必须可以在外部和内部访问的情况下,您所描述的exception才会被创build。 即使这样,您可能也想从外部使用“host1.example.com”,从内部使用“host1.internal.example.com”。 内部主机被configuration为在“internal.example.com”中查找名称。 在某些情况下,您已经在做的是合适的,例如服务器的证书将服务器标识为“host1.example.com”,在这种情况下,您希望将其作为客户端连接的名称。

使用dnsmasq使其变得非常简单。 http://www.thekelleys.org.uk/dnsmasq/doc.html作为DNS服务器的行为,但从本地DNS服务器获取答案。 很好的事情是,你可以覆盖单域logging,而不会搞乱区域文件

事实上,还有另一种方式,即使可能略有不同,也是如此。 我有同样的情况,我有一个外部和内部使用的域,我有外部的静态和dynamic主机。 唯一真正痛苦的是外在的动力。 该解决scheme可能不是最优雅的,但可以用一个小脚本来实现。 大多数情况下,我正在使用我的dynamicDNS提供程序的API来执行我自己的dynamicDNS脚本,我通过cron运行此脚本,每隔5分钟:

1)获取我的外部IP。 有改变吗? 没有出口。

2)改变IP,调用dyndns-provider的API,用新的IP地址,

3)用外部IP sed db.mydomain.com

4)重新启动绑定。

我的家庭networking工作非常可靠