■ はじめに
DNSにはEDNSと呼ばれる拡張機能があります。このEDNSの実装が正しくないDNSサーバやネットワーク機器が、インターネット上に存在しています。これまで、いくつかのオープンソースのDNSサーバソフトウェアでは、EDNSの動作に不具合があるようなサーバ等に対しても名前解決ができるように、回避策が実装されていました。しかし「実装が複雑になりDNSの安定運用にも支障をきたすため、2019年2月1日以降のリリースから回避策の機能を削除することにした」というアナウンスがありました。
機能削除の予定日である2019年2月1日は "DNS flag day" と名付けられました。この記事では、その DNS flag day についてご紹介します。
■ EDNS (Extension Mechanisms for DNS)
DNSは古くから存在するシステムの一つです。元々の仕様としてDNSサーバ間の通信は、やりとりするDNSメッセージが512オクテット以下の場合はUDPを、それより大きなメッセージになる場合はTCPを用いることになっています。また、DNSメッセージ中の制御情報となるヘッダ領域は長さが固定になっており、情報を新しく追加することは無制限にはできません。
こうした元となる仕様は、設計当初のインターネットの状況を反映したものなのですが、当時はあまり問題とならず、仕様の許す範囲で徐々に機能が追加されていきました。しかし、近年になっても機能追加の要望は続き、やりとりするデータ量は増加傾向にありました。そのため、メッセージサイズの大きさ制限やヘッダ情報への追加の困難さなど、従来の制限は厳しいものとなってきていました。
そのため1999年、従来のDNSを機能拡張できるようにする目的で標準化されたものがEDNSです。そのEDNSで拡張される基本的な機能としては以下のものがあげられます。
DNSメッセージヘッダ: RCODEやフラグの拡張
DNSラベルタイプ: ラベル型の拡張
DNSメッセージのUDPペイロードサイズ: 最大512オクテットの制限を通信可能であれば65535オクテットまでに拡張これらのEDNSの機能によって新たな情報が追加可能となったため、近年では "NSID" や "EDNS Client Subnet" などの、EDNSを用いた追加機能が標準化されています。
■ 実装の不備と回避処理
上記の通り、EDNSを利用することでさまざまな機能が、DNSに対して追加することができるようになりました。また、メッセージサイズの上限が増えたため、大きなメッセージでもTCPを使わずUDPだけで送信できることになり、負荷軽減や速度の向上が見込めるようにもなりました。
しかし、DNSサーバやファイアウォールをはじめとしたDNS機能を持つ各種ネットワーク機器において、正しくEDNSを処理できない機器がインターネット上に存在することが判明しています。そういった機器に対してDNSの通信を行ったとき、問い合わせや応答が不正になる場合があります。
そういった状況があったことから、各種オープンソース実装のDNSサーバソフトウェアはこれまで、通信途中で正しくないEDNSの機器を検知した場合、EDNSなしでの通信を再試行する、バッファサイズを512オクテットで再送する、TCPでの再送を行ったりするなど、名前解決ができるような回避策を実装し対応をしてきました。
■ DNS flag day
しかしながら、そのような特殊な対応は、DNSサーバの処理速度の低下を招いたり、プログラムコードのメンテナンスや新規機能の実装を困難にさせたりする要因になっています。
それを改善するため、各種オープンソース実装をしているいくつかの組織は、2019年2月1日以降にリリースされるDNSソフトウエアから、回避機能を取り除くと発表しました。その組織と主な実装は、以下の通りです。
Internet Systems Consortium (BIND)
CZ.NIC (Knot Resolver)
NLnet Labs (Unbound)
PowerDNS (PowerDNS Recursor)これらの組織は、転機となる2019年2月1日を DNS flag day と名付け、DNSサーバ運用者やDNSソフトウェア開発者などに対して注意を呼びかけています。