该hosts
文件允许我们配置系统以覆盖整个 DNS 服务器系统并将特定的 DNS 名称解析为特定的 IP 地址。但是,如果我只想让它使用特定的 DNS 服务器来实现此目的,该怎么办?
答案1
这就是所谓的水平分割 DNS 服务有四种方法可以做到这一点。为了举例,我们假设您希望为其配置水平分割unix.stackexchange.com.
(当然还有其下方的域名树的所有部分)。如何执行取决于您选择在本地运行的内容。
你经营一家本地转发代理 DNS 服务器。 这是一种常见的情况,您需要本地缓存,但本地计算机被防火墙与公共 Internet 隔开,或者与从 LAN 上的一个位置集中执行查询相比,这些计算机的查询解析相对昂贵。
你告诉它
unix.stackexchange.com.
转发到不同的服务器。您必须设置第二个(远程)代理 DNS 服务器,该服务器知道如何解析unix.stackexchange.com.
及其子域的查询。您还必须设置一个私有内容 DNS 服务器,为其及其子域提供实际的替代数据unix.stackexchange.com.
,第二个代理 DNS 服务器知道并配置为使用该服务器。你可能已经有后两者,特别是如果您是一个大型组织。您可能已经将解析代理 DNS 服务器作为中央计算机来执行查询解析的实际繁重工作。您可能已经拥有一个私有内容 DNS 服务器,该服务器在本地镜像公共
.
内容 DNS 服务器,以阻止各种内部流量“泄漏”到您的组织之外,您只需将unix.stackexchange.com.
数据添加到其中即可。本地转发代理DNS服务器配置:
- 对于像 Bernstein 这样的服务器
dnscache
(在FORWARDONLY
模式下),您可以使用servers/unix.stackexchange.com
代理 DNS 服务器的 IP 地址配置文件(在服务器的根/工作目录中),以将查询转发到服务器并重新启动服务器。 - 为了分区的DNS服务器就像微软的DNS服务器和ISC的BIND,你配置一个转发区并
unix.stackexchange.com.
重新加载/重新启动服务器。
/etc/resolv.conf
)直接地在(本地/远程)解析代理 DNS 服务器上,而不是使用转发代理 DNS 服务器作为中介。- 对于像 Bernstein 这样的服务器
你经营一家本地解析代理 DNS 服务器。 自 20 世纪 80 年代域名系统出现以来,像 Unices 和 Linux 这样的多任务操作系统并没有像往常一样回避在每台计算机上运行解析代理 DNS 服务器。但正如选择#1 中所指出的,“本地”可以是 LAN 上的本地,而不是单个计算机上的本地。
您告诉它
unix.stackexchange.com.
必须在与公共 DNS 数据库中发布的内容不同的 DNS 服务器上启动查询解析。您必须设置一个私有内容 DNS 服务器,为unix.stackexchange.com.
及其子域提供实际的替代数据。配置本地解析代理 DNS 服务器:
- 对于像 Bernstein 这样的服务器
dnscache
(在非FORWARDONLY
模式下),您可以使用servers/unix.stackexchange.com
内容 DNS 服务器的 IP 地址配置文件(在服务器的根/工作目录中),以启动查询解析并重新启动服务器。 - 为了分区的DNS服务器就像微软的DNS服务器和ISC的BIND,你配置一个存根区并
unix.stackexchange.com.
重新加载/重新启动服务器。
- 对于像 Bernstein 这样的服务器
您的公共内容 DNS 服务器能够根据发送查询的人提供替代数据。 很少有,但如果您有一个具有此功能的软件,那么它在架构上的设置是最简单的。
您根本不需要摆弄代理 DNS 服务器,也不需要设置第二个私有内容 DNS 服务器。您告诉公共内容 DNS 服务器哪一类客户端属于哪一类,并为其提供各种带标签的数据集以服务
unix.stackexchange.com.
及其子域。无论如何,每个人都已经通过任何途径到达您的公共内容 DNS 服务器。- 对于像伯恩斯坦这样的服务器,
tinydns
你可以使用它的位置代码功能并将“您的”代理 DNS 服务器的所有(后端客户端 IP 地址)配置为一个位置代码,并将互联网的其余部分配置为另一个位置代码。您可以使用第一个位置代码来标记数据库中对代理 DNS 服务器可见的所有数据,以及对互联网其余部分可见的所有数据(或者根本没有位置代码)全部)。%si:10 %si:192.168 %lo:127 …… =unix.stackexchange.com:127.0.0.1:::lo =unix.stackexchange.com:192.168.72.3:::si =unix.stackexchange.com:151.101.1.69:::
- 对于微软的DNS服务器,你用它稍微麻烦一点区域范围系统。它通过标记服务器自己的接收接口的 IP 地址来操作,而不是通过标记 DNS 客户端的源 IP 地址。改编微软的PowerShell示例:
Add-DnsServerQueryResolutionPolicy -Name“SplitHorizonZonePolicy”-Action ALLOW -ServerInterface“eq,10.0.0.56”-ZoneScope“internal,1”-ZoneName“stackexchange.com” Add-DnsServerResourceRecord -ZoneName“stackexchange.com”-A -Name“unix”-IPv4Address“151.101.1.69” Add-DnsServerResourceRecord -ZoneName“stackexchange.com”-A -Name“unix”-IPv4Address“10.0.0.69”-ZoneScope“内部”
- 对于ISC的BIND,你用它肯定比较麻烦意见系统。
tinydns
但是,如果您(比如说)在自己的公共 OpenBSD 机器上发布自己的数据,这种方式的水平分割 DNS 服务非常简单。 ☺- 对于像伯恩斯坦这样的服务器,
您使用复杂的 DNS 客户端软件。 通常,您的 DNS 客户端是链接到系统上的应用程序软件的 C 库中的代码。但有时并非如此。
应用程序软件可以使用诸如与 systemd 通信的桌面总线系统之类的东西
systemd-resolved
。他们不与代理 DNS 服务器使用 DNS 协议。 (systemd 人员鼓励应用程序软件编写者停止这样做。)相反,他们使用一种特殊且非标准化的桌面总线协议来进行systemd-resolved
.systemd-resolved
反过来,又具有一个复杂的系统,用于根据当前网络配置确定实际向哪个或哪些 DNS 服务器发送 DNS 协议查询。请注意,此本地 DNS 服务的功能不如 libc NSS 或
systemd-resolved
[桌面] 总线 API 功能齐全。 […] 因此,强烈建议所有应用程序使用 libc NSS API 或本机systemd-resolved
[桌面] 总线 API。
—伦纳特·珀特林,2016-06-25操纵它远远超出了像这样的一般范围问题和答案的范围。
对于像 Microsoft 的 DNS 服务器、ISC 的 BIND 等一劳永逸的 DNS 服务器软件来说dnsmasq
,有一些复杂的场景,看起来像是选择 #1、#2 和 #3 的混合;或者看起来像真的很复杂选择#2 的版本。但近二十年来,徒劳地同时担任所有职务一直被大多数 DNS 世界视为坏主意。 (即使在 Microsoft DNS 服务器领域,也持续了大约十年。)您的 DNS 服务器不应该是内容 DNS 服务器和代理 DNS 服务器合二为一。 (有这样的人OpenResolver 项目积极地探查人们的公共 DNS 服务器以尝试执行此操作。)将服务类型正确地分离到不同的服务器中,就像您很可能已经对 SMTP 和 HTTP 服务所做的那样,并且选择简化为上述之一。
进一步阅读
- 乔纳森·德博因·波拉德 (2000)。“内容”和“代理”DNS 服务器。 经常给出的答案。
- 乔纳森·德博因·波拉德 (2002)。提供“水平分割”DNS服务。 经常给出的答案。
- 乔纳森·德博因·波拉德 (2003)。您忘记用数据填充“内部”DNS 数据库。 经常给出的答案。
- 乔纳森·德博因·波拉德 (2004)。如果您使用非公共 IP 地址范围,请使用水平分割 DNS 服务。 经常给出的答案。
- 微软公司(2015)。 如何使用 Microsoft DNS 创建仅缓存名称服务器。 #167234。知识库。
- Windows 网络团队 (2015-05-12)。使用 Windows DNS 服务器策略的裂脑 DNS 部署。微软公司。
- 刘蟋蟀和保罗·阿尔比茨 (2006)。 “安全”。 DNS 和绑定。奥莱利. ISBN 978-0596100575。
答案2
一种解决方案是为您想要直接控制的域安装bind
( ) 并设置区域文件。named
有很多简单的教程可以做到这一点,但我特别喜欢https://www.digitalocean.com/例如这个。