[注意:这个问题的解决方案是完美的,但与标题所表明的内容有些偏差。]
我遇到了一个小问题Windows Server 2003 DNS service
。在我的公司中,我运行 Microsoft DNS 服务器 ( 172.16.0.12
) 来对我的公司内部网进行名称解析(域名以 结尾dev.nls
,解析为 IP 172.16.。),同时也配置为DNS转发器,用于将其他域名(例如*.google.com、*.sf.net)转发到Internet real DNS servers
。这台内部DNS服务器从来不会为外界用户提供服务。
我们正在运行一个邮件服务器(为真实的Internet 域@nlscan.com
)位于公司防火墙内,可以通过以下任一方式访问:
172.16.0.10
通过从内部网内部连接。- 通过从互联网连接到
mail.nlscan.com
(解析为)。202.101.116.9
注意172.16.0.10
和202.101.116.9
不是同一台物理机器,一个是防火墙机器,负责将和202
端口转发到内网地址。25
110
172.16.0.10
现在我的问题是:如果企业局域网内的用户想要解析mail.nlscan.com
,它会解析为202.101.116.9
。这是正确且可行的,但并不好,因为邮件流量会进入防火墙机器,然后反弹到172.16.0.10
。我希望我们internal DNS server
可以拦截名称mail.nlscan.com
并将其解析为 172.16.0.10 。因此,我希望我可以在“hosts”文件中写入一个条目来172.16.0.12
执行此操作。但是,如何Microsoft DNS server
识别这个“hosts”文件?
也许你会建议,为什么不让内网用户使用172.16.0.10
来访问我的邮件服务器?我不得不说这很不方便,假设一个用户(员工)白天在办公室使用笔记本电脑,晚上在家使用。当他在家时,他不能使用172.16.0.10
。
nlscan.com
在我们的内部创建区域DNS server
是不可行的,因为域的名称服务器nlscan.com
在我们的 ISP 上,它负责解析 nlscan.com 下的其他主机名和子域。
[编辑]
根据WesleyDavid
建议,我遵循以下解决方案只需创建一个名为的区域mailserver.nlscan.com
并在该区域中放置一个无名的 A 记录。时间证明这是有效的。
答案1
这篇文章的后半部分是错误的。根据我在网上读到的一些内容(如果是在网上,那一定是真的!),我的印象是,Windows DNS 服务器服务创建缓存的任务之一就是将其主机文件与本地区域数据一起加载到缓存中。我四处搜索,找不到确凿的证据。我在自己的 Server 2008 R2 机器上测试了这个理论,发现主机文件没有用于构建 DNS 服务器的缓存。
但是,我认为我有一个比 Massimo 更优雅的解决方案。无需为整个 nlscan.com 区域创建权威区域,只需创建一个名为 mailserver.nlscan.com 的区域并在该区域中放置一个匿名 A 记录。匿名 A 记录将具有与区域本身相同的名称,您可以为其提供所需的 IP 地址。nlscan.com 下的所有其他域以及 nlscan.com 本身都将通过公共 DNS 进行解析。
我刚刚在自己的 Server 2008 R2 DNS 服务器上测试了这一点,能够让我朋友的网站 (nessus.nl) 通过公共 DNS 服务器进行解析,但特定子域 (blog.nessus.nl) 解析为 Apple.com IP 地址。尝试一下,看看它是否适合您。
较旧的错误帖子开始于:
如果我的理解正确(编辑:但事实并非如此),当在 Server 2003 计算机中构建 DNS 缓存时,它会从 hosts 文件及其区域数据中提取条目。将其放入172.16.0.10 mailserver.nlscan.com
Server 2003 计算机的 hosts 文件中应该可以解决问题。更改 hosts 文件后,重新启动 DNS 服务。
在任何 Windows 机器(特别是您的 Server 2003 DNS 机器)上使用 ipconfig /displaydns 查看您的主机文件条目。另外请记住,负面响应会缓存在您的客户端中,因此请始终在您正在试验的客户端上运行 ipconfig /flushdns。否则,您最终会因为疑惑为什么您的客户端无法解析您刚刚输入到区域/主机文件中的名称而陷入各种困境。=)
您是否尝试过此操作但失败了?
答案2
让内部用户获取资源的内部 IP,而让外部用户获取相同资源的外部 IP,这种想法很常见。这被称为裂脑 DNS。您有一台面向互联网的 DNS 服务器和另一台面向本地用户的内部 DNS 服务器。内部用户在您的网络上使用 DHCP,而您的 DHCP 服务器则宣传内部 DNS 服务器。当您的用户不在办公室时,他们的 DHCP 服务器会将他们分配给仅知道外部区域的 DNS 服务器。
您似乎想要分裂脑 DNS,但实际上并没有在内部托管区域。您认为在内部托管区域是有问题的,因为您不希望用户在家工作时获取内部 IP,但这没有意义,因为当他们在家时,他们会从另一个 DHCP 服务器获取 IP,而该服务器不会宣传您的内部 DNS 服务器。它将宣传其 ISP 的 DNS 服务器,该服务器只会知道您的外部区域,因此只会为他们提供外部 IP 地址。
最后,我认为您无法成功要求 DNS 服务器提供来自 DNS 服务器上的 hosts 文件的记录。DNS 服务器提供来自其区域文件的记录。该 DNS 服务器上的本地 hosts 文件将条目传播到本地客户端解析缓存中,该缓存仅适用于该计算机上的查找。这些条目不由 DNS 服务器提供,这是一种不同的机制。
阅读有关裂脑 DNS 的信息 - 这是处理这种情况的正常方法。
答案3
Wes:我不确定是谁给你发的,但我想澄清一下 hosts 文件的用途:hosts 文件由 DNS 客户端解析器组件使用,而不是 DNS 服务器组件。DNS 服务器在充当 DNS 客户端时,将使用其 hosts 文件中的条目。例如,我的 W2K8 DNS 服务器的 hosts 文件中的条目如下:
1.1.1.1 测试.test.com
被加载到 DNS 服务器的 DNS 客户端缓存中(而不是服务器缓存中)。如果我从 DNS 服务器 ping test.test.com,它会按预期返回 1.1.1.1。如果我在 DNS 服务器上运行 nslookup 并向其请求 test.test.com,它会返回为 test.test.com 注册的正确公共 IP 地址,因为 DNS 服务器上的 DNS 客户端组件现在正在向 DNS 服务器组件请求解析(就像任何其他 DNS 客户端一样)。这是一个令人困惑的想法,但 DNS 服务器也是一个 DNS 客户端,当 DNS 客户端组件被调用时,它会像任何其他 DNS 客户端一样,查看自己的 DNS 客户端缓存,包括从 hosts 文件预加载的任何条目。只有当 DNS 客户端组件使用 DNS 服务器组件时(通过查询在其 TCP\IP 属性中配置的 DNS 服务器,这些服务器应该指向自身),DNS 服务器的缓存才会填充正确的信息。
任何查询 DNS 服务器的 DNS 客户端都将始终获得“真实”答案而不是主机条目,因为 DNS 服务器的 DNS 客户端缓存由服务器本身(作为 DNS 客户端)使用,而不是由 DNS 服务器组件使用。
答案4
不用管主机文件,只需在 DNS mail.domain.com 中添加一个新区域,并在该区域中添加一台主机。将名称留空(它将自动使用区域的名称)并输入本地邮件服务器的 IP 地址 ;-)