BIND9を実行する2つのDNSサーバーがあり、1つはマスター、もう1つはスレーブです。マスターでゾーンファイルが更新されたときに、スレーブサーバーが変更されたレコードのサービスをすぐに開始するようにしたいのですが、BINDによって多少の問題が生じます。
DNSゾーン転送は、マスターとスレーブ間で既に正しく機能しています。スレーブサーバーにログインしてDig @dnsmaster myzone. AXFR
を実行すると、ゾーンのコンテンツ全体が出力されます。これを機能させるために、DNSマスターはnotify yes
およびalso-notify { dnsslave }
で構成されています。同様に、スレーブはallow-transfer { dnsmaster }
で構成されています。
Dnsmasterが更新されたら、rndc reload
を実行すると、通知が送信されていることがわかります。これは、/var/named/slavedata/
のゾーンファイルを検査することにより、スレーブで確認されます。それらには、マスターが知っているものと一致する最新のデータが含まれています。
今、奇妙な部分が来ます。
スレーブサーバーは、古い古いDNSレコードを引き続き提供し、マスターから通知された後、新しいデータがディスク上で利用可能であるという事実を完全に無視します。次のコマンドで結果を確認するためにDig
を使用しています:Dig @slaveserver record.zone.tld
。
BINDが権限のあるゾーンのメモリ内キャッシュを保持しているのではないかと思ったので、max-cache-size
とmax-cache-ttl
を0に設定しましたが、効果がありませんでした。
スレーブサーバーでrndc flush
やrndc reload
などのコマンドを実行して、この疑わしいキャッシュをフラッシュする別の方法を試しましたが、それでも古い古いレコードが返されます。
最後に、ゾーンのMINTTL
が86400(24時間)に設定されていることに気付いたので、MINTTL
を一時的に15秒に変更し、スレーブサーバーを再起動しました。影響なし-スレーブは、サービスが再起動された後にのみ、更新されたDNS結果を提供します。
何が起きてる?ゾーンが更新されたという通知を受け取ったときのBIND9の予想される動作は何ですか?常にTTL
とMINTTL
を尊重していますか?私は常に利用可能な最新のデータを使用すると思います。
私の機知の終わりに、古くなったデータの提供を避けるために、BINDスレーブを1時間ごとに再起動するようにcrontabを設定することを検討しています。もっと良いものはありますか?
あなたの説明から、私はあなたに正確には何を伝えることができませんis問題ですが、いくつかのことを除外するのを助けることができます。
キャッシュサイズの設定とキャッシュttlの設定は、キャッシュされた再帰クエリデータ用であり、(既にお気付きのように)信頼できるデータには適用されません。同様に、rndcフラッシュはここでは適用できません。
推奨されるトラブルシューティング方法:
それでも問題が解決しない場合は、マスターとスレーブの両方からのnamed.confセクションと、両方のサーバーからのログを含め、新たに編集されたゾーンをマスターにロードした後に何が発生しているかの詳細を投稿することを検討してください。
私も同じ状況に直面しました。研究の結果、次のことがわかりました。ビューを使用している場合、Dig @ localマシンはlocalhost-viewにあるもののみを提供します。 localhost-viewは、namedの再起動時にのみ更新されます。ただし、最新のゾーンファイル(マスターから転送されたもの)は引き続きスレーブで使用でき、外部ソースまたは外部ビューからのすべてのクエリに提供されます。そのため、localhost-viewが更新されるように調整する必要があります。
名前をリロードする前にマスターサーバーで変更を行う場合は、ゾーンファイルからシリアルIDをインクリメントすることを忘れないでください。そうしないと、ゾーンファイルがスレーブサーバーに複製されません。