在每个nic接口上configurationDNS服务器(eth0 / eth1)?

如何在RHEL / Centos 6上为每个NIC(eth0 vs eth1)接口configurationDNS名称服务器

例如

eth0在子网10.0.0.1/24上

eth1在子网192.168.0.1/24上

任何通过eth0发送的请求都应该使用DNS服务器10.0.0.2。

任何通过eth1发送的请求都应该使用DNS服务器192.168.0.2。

我补充说:

DNS1:10.0.0.2> / etc / sysconfig / network-scripts / ifcfg-eth0

DNS1:19.168.0.2> / etc / sysconfig / network-scripts / ifcfg-eth1

但是这些值会被忽略,并且默认为resolv.conf中的设置“nameserver 10.0.0.2”。当eth0closures时,连接通过eth1发送…但是当它试图达到10.0.0.2时,DNS不能再parsing。

  • 我如何得到它在尊重DNS设置在ifcfg而不是resolv.conf默认?

  • 或者我如何为eth0和eth1configuration不同的DNS名称服务器?

  • 有没有更好的方法来处理这个问题?

更新

我们有两个VLAN,每个都有它自己的子网上的DNS服务器。 这些处理查找本地DNS(example.loc,guest.app等),以及在需要时转发。

这两个独立的服务器位于两个不同的物理位置。 如果可能的话,我宁愿不要在两个子网上运行一个服务器(一个处理敏感数据)。

如果eth0被closures,我需要eth1继续提出DNS请求。

我想添加两个IP到resolv.conf,然后让它失败,如果它不能到达服务器在第一个子网,但这似乎不雅(当eth0是等待第一个服务器超时,每个DNS查询下)。

你不能轻易地做你想要的。

或者我如何为eth0和eth1configuration不同的DNS名称服务器?

主机名的名称查找通过标准系统库进行,并不以任何方式与特定的“连接”相关联。 事实上,在DNS查询发生的时候,没有连接,因为你的应用程序甚至没有find它要连接的地址(这就是为什么它首先使用DNS)。

我如何得到它在尊重DNS设置在ifcfg而不是resolv.conf默认?

Linuxparsing器只有一个全局configuration( /etc/resolv.conf )。 没有任何types的每个接口,每个域或每个连接的设置。 /etc/sysconfig/network-scripts/...中的设置仅用于填充/etc/resolv.conf ,并且通常如果在这些文件中指定DNS1DNS2 ,则最后出现的接口将是您所看到的在/etc/resolv.conf

有没有更好的方法来处理这个问题?

你能告诉我们你究竟想要完成什么吗? 如果您能更多地了解您的具体情况,我们可能会提出更好的解决scheme。

DNS请求基本上也是

  1. “host1.domain1.com的IP地址是多less”,或者
  2. “什么是192.168.0.5的主机名”。

所以在“请求”时间内不知道哪个以太网卡将被涉及。 你可以合理地问的是“所有以'domain1.com'结尾的请求应该去192.168.0.2,所有其他的请求应该去到10.0.0.2”。

同样,“所有匹配192.168.0.0/24的反向DNS请求应该去192.168.0.2,其余的应该去10.0.0.2”。

正如Larsks所言,Linux不支持这样的configuration。 但是,您可以运行自己的,实现上述逻辑的最小DNS服务器,并将请求转发给适当的“真实”DNS服务器。

我相信dnsmasq可以做到这一点(请参阅如何configurationdnsmasq转发多个DNS服务器? )。 但是在我发现之前,我把自己卷入了Twisted:

 from twisted.internet import reactor from twisted.names import dns from twisted.names import client, server class Resolver(client.Resolver): def queryUDP(self, queries, timeout=None): if len(queries) > 0 and (str(queries[0].name).endswith('.domain1.com'): self.servers = [('192.168.0.2', 53)] else: self.servers = [('10.0.0.2', 53)] return client.Resolver.queryUDP(self, queries, timeout) resolver = Resolver(servers=[('10.0', 53)]) factory = server.DNSServerFactory(clients=[resolver]) protocol = dns.DNSDatagramProtocol(factory) reactor.listenUDP(53, protocol, interface='127.0.0.1') reactor.listenTCP(53, factory, interface='127.0.0.1') reactor.run() 

现在三个问题的答案现在已经解决了 (重点是我的):

根据以下规则将查找请求路由到可用的DNS服务器和LLMNR接口:

特殊主机名“localhost”的查找不会路由到networking。 (其他一些特殊的域也是以相同的方式处理的。)

单标签名称使用LLMNR协议路由到所有能够进行IP多播的本地接口。 IPv4地址的查找只能通过IPv4上的LLMNR发送,IPv6地址的查找只能通过IPv6上的LLMNR发送。 查找本地configuration的主机名和“网关”主机名不会路由到LLMNR。

多标签名称将被路由到所有configuration了DNS服务器的本地接口,以及全局configuration的DNS服务器(如果有的话)。 从链接本地地址范围的地址查找不会路由到DNS。

如果查找路由到多个接口,则返回第一个成功响应(从而有效地合并所有匹配接口上的查找区域)。 如果在所有接口上查找失败,则返回最后一个失败的响应。

查找的路由可能会受到configuration每个接口域名的影响。 有关详细信息,请参阅systemd.network(5)。 查找以每个接口域中的一个结尾的主机名将被专门路由到匹配的接口。