やりたいことは簡単にはできません。
<ブロック引用>または、eth0 と eth1 で異なる DNS ネーム サーバーを構成するにはどうすればよいですか?
ホスト名の名前検索は、標準のシステム ライブラリを介して行われ、特定の「接続」に関連付けられることはありません。実際、DNS クエリが発生した時点で、 アプリケーションが接続先のアドレスを把握していないため、接続できません (これが、そもそも DNS を使用している理由です)。
<ブロック引用>resolv.conf のデフォルトではなく、ifcfg の DNS 設定を尊重するにはどうすればよいですか?
Linux リゾルバーには、単一のグローバル構成 (/etc/resolv.conf
) しかありません。 )。インターフェイスごと、ドメインごと、または接続ごとの設定はありません。 /etc/sysconfig/network-scripts/...
の設定 /etc/resolv.conf
を設定するためにのみ使用されます 、そして一般的に DNS1
を指定した場合 と DNS2
これらのファイルでは、最後に表示されるインターフェイスは /etc/resolv.conf
に表示されるものになります。 .
これを処理するより良い方法はありますか?
実際に達成しようとしていることを教えてください。具体的な状況について詳しく教えていただければ、より良い解決策を提案できるかもしれません。
DNS リクエストは基本的に次のいずれかです
<オール>そのため、「要求」時に、どのイーサネット カードが関与するかはわかりません。 できること 「'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 はそのような構成をサポートしていません。ただし、上記のロジックを実装し、適切な「実際の」DNS サーバーにリクエストを転送する、独自の最小限の DNS サーバーを実行することもできます。
私は dnsmasq がこれを行うことができると信じています (How to configure dnsmasq to forward multiple DNS servers? を参照してください)。しかし、それがわかる前に、私は 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()