DNS【BIND】のresolvingエラーの対処「unexpected RCODE ・・・」

2018年4月11日

BINDのログに「unexpected RCODE ・・・」のようなログが大量に記録される

環境

  • Red Hat Enterprise Linux Server release 7.2 (Maipo)
  • bind-chroot-9.9.4-51.el7_4.2.x86_64

問題

BINDのログに下記のようなログが大量に記録される
最悪の場合、ログがあふれる。

 named[PID]: error (unexpected RCODE REFUSED) resolving 
 named[PID]: error (unexpected RCODE SERVFAIL) resolving 
 named[PID]: error (unexpected RCODE FORMERR) resolving

原因

自サーバのBINDが名前解決をしようとしたら予期しないメッセージが返ってきて「拒否しました / 失敗した / 形式が違う」という意味合いなのですが、

  • SERVFAIL: エラーが発生した
    – 再帰検索中にどこかの権威サーバが無応答でタイムアウトした
    – DNSSEC validaton に失敗した、など
  • REFUSED: 参照サーバに問い合わせが拒否された
  • FORMERR: 参照サーバから送られてきたフォーマットが不正

ネットワーク経路上でパケットが落ちていたり問い合わせ先のサーバでのクライアント制限数を超えたりということがあるようです。
つまり、ネットワークの経路上か問い合わせ先サーバが悪いんじゃないの?というところが原因となり、自サーバのリゾルバが悪いわけではない。ということのようです。

digコマンドを駆使して切り分けというのも大変だしということで下記の対処となります。

対処

キャッシュをクリアする。

rdnc flush

サーバーのキャッシュをフラッシュします。

rdnc flushname name [view]

指定された名前をサーバのDNSキャッシュからフラッシュし、必要に応じてサーバのネームサーバアドレスデータベースまたは不良サーバキャッシュからフラッシュします。

rdnc flushtree name [view]

サーバーのDNSキャッシュ、アドレスデータベース、および不良サーバーキャッシュから、指定された名前とすべてのサブドメインをフラッシュします。

ログを記録しないように抑制する

named.conf ファイルのログ設定の箇所に赤字の記述を差し込み「namedの再起動」を実施します。

logging { ...
  category lame-servers { null; };
... };

DNSの切り分け時に利用するオンラインチェックツール

DNSSECの確認

DNS Delegationをトレース

# gem install dnstraverse
Fetching: dnsruby-1.52.gem (100%)
Fetching: dnstraverse-0.1.0.gem (100%)
Successfully installed dnsruby-1.52
Successfully installed dnstraverse-0.1.0
2 gems installed
Installing ri documentation for dnsruby-1.52...
Installing ri documentation for dnstraverse-0.1.0...
Installing RDoc documentation for dnsruby-1.52...
Installing RDoc documentation for dnstraverse-0.1.0...
# PATH=$PATH:/var/lib/gems/1.8/bin
# export PATH
# dnstraverse www.google.com

DNSの健全性のチェック

外部からdigを実行

LinuxBIND