Nslookup、Dig、およびpingは、異なる値を返します。 foo.bar.nameが常に静的に自分のマシンのローカルホストに解決されるようにしたい。
コマンドを使用しました
Host foo.bar.name
/ etc/hostsを編集して次の行を含めました
1.1.1.1 foo.bar.name foo
(ここで、ホストマシンの1.1.1.1 IPアドレス)
Pingまたはcurlのいずれかを実行すると、希望どおりに動作します。
しかし、Digを実行すると、またはnslookupを実行すると、foo.bar.nameアドレスの解決方法がまったく異なります。
私は何か見落としてますか?
その特定のホストでDNS解決が私が述べたように行われるようにするには、どの構成を変更する必要がありますか。
ping
、curl
、および他のすべてのアプリは、実際にはDNSを直接使用しません。OSが提供する「gethostbyname」関数を使用して、複数のプロバイダーを呼び出します。それらの1つは「dns」(DNSサーバーと通信します)であり、もう1つは「ファイル」(つまり/etc/hosts
)です。他のプロトコルを話す追加のプロバイダーが存在する可能性があります。それらはすべて/etc/nsswitch.conf
を介して構成されます。
一方、Dig
、Host
、およびnslookup
は基本的にDNSクライアントです–これらはOSをバイパスします " gethostbyname」関数を使用し、代わりにDNSパケットを直接作成して送信します。 (これらは特にこのように記述されています。)その結果、/etc/hosts
やその他の名前解決メカニズムもスキップし、これを「修正」するように構成できるものはありません。
(OS自体がすべてのUDPパケットを調べてDNSであるかどうかを確認するわけではありません。また、/ etc/hostsから偽のDNS応答を挿入することもありません。)
Dig
&cを作成する唯一の方法。/etc/hostsを尊重することは、アプリが通信するための実際のDNSサーバーをセットアップすることです。これにより、必要な静的応答が提供されます。たとえば、dnsmasqはDNSキャッシュ/プロキシとして機能し、デフォルトで/ etc/hostsから静的データをロードします。または、Unboundには、/ etc/hostsを直接読み取ることはできませんが、広範な「ローカルデータ」構成があります。
DnsmasqまたはUnboundを構成したら、/etc/resolv.conf
を127.0.0.1(または他のホストdnsmasqが実行されているもの)にポイントします。
その特定のホストでDNS解決が私が述べたように行われるようにするには、どの構成を変更する必要がありますか。
unbound
などの軽量DNSフォワーダーをセットアップして、DNSレコードを上書きできます。
あなたの例を使用すると、unbound
configは次のようになります。
local-zone: "foo.bar.name" redirect
local-data: "foo.bar.name A 1.1.1.1"
外部DNSを上書きする場合は、次を使用できます。
local-data: "www.google.com. 1800 IN A 172.16.34.12"
local-data: 'www.google.com. 7200 IN TXT "My own TXT record for text"'
local-data-ptr: "172.16.34.12 www.google.com"
設定が完了したら、Dig @127.0.0.1 foo.bar.name a
でテストします
新しいリゾルバーが正常に機能する場合は、/etc/resolf.conf
のnameserver
行をnameserver 127.0.0.1
に変更して、システム全体として設定します。
追伸.
一部のDebianベースディストリビューションは、DNSキャッシャーとしてdnsmasq
をインストールします。 unbound
を使用する場合は、dnsmasq
をオフにします
システムは/ etc/hostsをデフォルトでチェックし、ネームサーバーを使用します。そして、あなたがしたことは完全に大丈夫です。 Host
、nslookup
、Dig
など、一部のプログラムはネームサーバーと直接通信するように設計されているだけです。そのため、結果が異なります。