Du kannst nicht einfach machen, was du willst.
Oder wie konfiguriere ich einen anderen DNS-Namensserver für eth0 vs. eth1?
Die Namenssuche nach einem Hostnamen erfolgt über Standardsystembibliotheken und ist in keiner Weise mit einer bestimmten "Verbindung" verbunden. Tatsächlich gibt es zum Zeitpunkt der DNS-Abfrage eine keine Verbindung, da Ihre Anwendung noch nicht einmal die Adresse herausgefunden hat, mit der sie sich verbinden wird (weshalb sie überhaupt DNS verwendet).
Wie bekomme ich es dazu, die DNS-Einstellungen in ifcfg zu respektieren, anstatt einen Standardwert für resolv.conf?
Der Linux-Resolver hat nur eine einzige, globale Konfiguration (/etc/resolv.conf
). Es gibt keinerlei Einstellungen pro Schnittstelle, pro Domäne oder pro Verbindung. Die Einstellungen in /etc/sysconfig/network-scripts/...
werden nur verwendet, um /etc/resolv.conf
zu füllen , und allgemein, wenn Sie DNS1
angeben und DNS2
In diesen Dateien wird als letzte Schnittstelle das angezeigt, was Sie in /etc/resolv.conf
sehen .
Gibt es einen besseren Weg, damit umzugehen?
Können Sie uns sagen, was Sie eigentlich erreichen wollen? Wir können möglicherweise bessere Lösungen vorschlagen, wenn Sie uns mehr über Ihre spezifische Situation mitteilen.
Eine DNS-Anfrage ist grundsätzlich entweder
- "wie lautet die IP-Adresse von host1.domain1.com" oder
- "Wie lautet der Hostname von 192.168.0.5."
Es ist also zum Zeitpunkt der "Anfrage" nicht bekannt, welche Ethernet-Karte beteiligt sein wird. Was Sie könnten Eine sinnvolle Frage wäre:"Alle Anfragen, die mit 'domain1.com' enden, sollten an 192.168.0.2 gehen, und alle anderen Anfragen sollten an 10.0.0.2 gehen."
Und ebenso:„Alle Reverse-DNS-Anfragen, die mit 192.168.0.0/24 übereinstimmen, sollten an 192.168.0.2 gehen, und der Rest sollte an 10.0.0.2 gehen.“
Wie larsks sagte, unterstützt Linux eine solche Konfiguration nicht. Sie könnten jedoch Ihren eigenen, minimalen DNS-Server betreiben, der die obige Logik implementiert und Anfragen an den entsprechenden "echten" DNS-Server weiterleitet.
Ich glaube, dnsmasq kann dies tun (siehe Wie konfiguriere ich dnsmasq, um mehrere DNS-Server weiterzuleiten?). Aber bevor ich das herausfand, habe ich mein eigenes in Twisted gewürfelt:
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()