Non puoi facilmente fare quello che vuoi.
O come posso configurare un server dei nomi DNS diverso per eth0 rispetto a eth1?
La ricerca del nome di un nome host avviene tramite librerie di sistema standard e non è associata in alcun modo a una particolare "connessione". Infatti, nel momento in cui avviene la query DNS, c'è nessuna connessione, perché la tua applicazione non ha nemmeno capito l'indirizzo a cui si connetterà (motivo per cui utilizza il DNS in primo luogo).
Come posso far sì che rispetti le impostazioni DNS in ifcfg piuttosto che un valore predefinito per resolv.conf?
Il resolver Linux ha una sola configurazione globale (/etc/resolv.conf
). Non esiste alcuna impostazione per interfaccia, per dominio o per connessione di alcun tipo. Le impostazioni in /etc/sysconfig/network-scripts/...
sono usati solo per popolare /etc/resolv.conf
, e generalmente se specifichi DNS1
e DNS2
in questi file, l'ultima interfaccia che apparirà sarà quella che vedi in /etc/resolv.conf
.
C'è un modo migliore per gestirlo?
Puoi dirci cosa stai effettivamente cercando di realizzare? Potremmo essere in grado di suggerirti soluzioni migliori se puoi dirci di più sulla tua situazione specifica.
Una richiesta DNS è fondamentalmente o
- "qual è l'indirizzo IP di host1.domain1.com" o
- "qual è il nome host di 192.168.0.5."
Quindi non si sa al momento della "richiesta" quale scheda Ethernet sarà coinvolta. Quello che potresti chiedere ragionevolmente sarebbe "tutte le richieste che terminano con 'domain1.com' dovrebbero andare a 192.168.0.2, e tutte le altre richieste dovrebbero andare a 10.0.0.2."
E allo stesso modo, "Tutte le richieste DNS inverse corrispondenti a 192.168.0.0/24 dovrebbero andare a 192.168.0.2 e il resto dovrebbe andare a 10.0.0.2."
Come ha detto Larsks, Linux non supporta tale configurazione. Tuttavia, puoi eseguire il tuo server DNS minimo che implementa la logica di cui sopra e inoltra le richieste al server DNS "reale" appropriato.
Credo che dnsmasq possa farlo (vedi Come configurare dnsmasq per inoltrare più server DNS?). Ma prima di scoprirlo, ho lanciato il mio in 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()