Vous ne pouvez pas facilement faire ce que vous voulez.
Ou comment configurer un serveur de noms DNS différent pour eth0 vs eth1 ?
La recherche de nom pour un nom d'hôte s'effectue via des bibliothèques système standard et n'est en aucun cas associée à une "connexion" particulière. En fait, au moment où la requête DNS se produit, il existe pas de connexion, car votre application n'a même pas trouvé l'adresse à laquelle elle va se connecter (c'est pourquoi elle utilise le DNS en premier lieu).
Comment faire pour qu'il respecte les paramètres DNS dans ifcfg plutôt qu'une valeur par défaut pour resolv.conf ?
Le résolveur Linux n'a qu'une seule configuration globale (/etc/resolv.conf
). Il n'y a aucun paramètre par interface, par domaine ou par connexion d'aucune sorte. Les paramètres en /etc/sysconfig/network-scripts/...
ne sont utilisés que pour remplir /etc/resolv.conf
, et généralement si vous spécifiez DNS1
et DNS2
dans ces fichiers, la dernière interface à apparaître sera celle que vous voyez dans /etc/resolv.conf
.
Existe-t-il une meilleure façon de gérer cela ?
Pouvez-vous nous dire ce que vous essayez réellement d'accomplir ? Nous pourrons peut-être suggérer de meilleures solutions si vous pouvez nous en dire plus sur votre situation spécifique.
Une requête DNS est essentiellement soit
- "quelle est l'adresse IP de host1.domain1.com," ou
- "quel est le nom d'hôte de 192.168.0.5."
Il est donc impossible de savoir au moment de la "demande" quelle carte Ethernet sera impliquée. Ce que vous pourriez raisonnablement demander serait "toutes les requêtes se terminant par 'domain1.com' doivent aller à 192.168.0.2, et toutes les autres requêtes doivent aller à 10.0.0.2."
Et de même, "Toutes les requêtes DNS inversées correspondant à 192.168.0.0/24 doivent aller à 192.168.0.2, et le reste doit aller à 10.0.0.2."
Comme l'a dit larsks, Linux ne prend pas en charge une telle configuration. Cependant, vous pouvez exécuter votre propre serveur DNS minimal qui implémente la logique ci-dessus et transmet les requêtes au "vrai" serveur DNS approprié.
Je pense que dnsmasq peut le faire (voir Comment configurer dnsmasq pour transférer plusieurs serveurs DNS ?). Mais avant de le découvrir, j'ai lancé le mien dans 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()