EDNS
DNSの機能を拡張する仕組み。UDPで送受信できるDNSメッセージの大きさの上限を、従来の512バイトから広げられる。上限を超える応答は、TCPでやり取りし直す。
イマシルちゃんの解説
むかしのDNSは、UDPで送れる返事の大きさに、けっこう小さな上限があったんだ。
でも、IPv6のアドレスや、DNSSECの署名みたいに、返事に入れたい情報がどんどん大きくなってきた。
EDNSは、「ぼくは大きい返事でも受け取れるよ」ってお互いに伝え合って、UDPのまま大きな返事を送れるようにする仕組みなんだよ。
それでも入りきらないときは、もっと確実な別の運び方に切り替えて送り直すんだ!
より深い解説
定義
EDNS(Extension Mechanisms for DNS、バージョン0は EDNS(0))は、RFC 6891で定められた、DNSのプロトコルを拡張するための仕組みである。DNSメッセージの追加情報セクション(ADDITIONAL SECTION)に、OPTという疑似的なリソースレコードを入れて、送信者が扱える能力を伝える。
主な機能
| 機能 | 内容 |
|---|---|
| UDPのメッセージサイズの拡大 | 受け取れるUDPのペイロードの大きさ(例:1232バイト)を相手に伝え、512バイトを超えるメッセージをUDPで送受信できるようにする |
| DNSSECへの対応 | DNSSECの署名(RRSIG)などを要求することを示す(DOビット) |
| 拡張オプション | クライアントのサブネットの情報(ECS)、Cookie など |
512バイトを超えるとき
| 状況 | 動作 |
|---|---|
| EDNSを使い、調整した上限以内 | UDPで送受信する |
| 上限を超える、または相手がEDNSに対応していない | 応答のTCビット(切り詰め)を立てた短い応答を返す。受け取った側は、TCPで問い合わせ直す |
DNSは、UDPとTCPのどちらでもポート53番を使う。そのため、ファイアウォールでは、UDP/53だけでなく、TCP/53の通信も許可しておく必要がある。
IPv6とDNSメッセージの大きさ
IPv6のアドレス(AAAAレコード)は128ビットで、IPv4のアドレス(Aレコード)の4倍の大きさがある。また、デュアルスタックでは、AAAAレコードとAレコードの両方を問い合わせる。DNSSECを使うと、署名も加わる。このため、IPv6の環境では、DNSメッセージが512バイトを超えることが多くなる。
大きなUDPのパケットの問題
UDPで大きなDNSメッセージを送ると、経路の途中でIPのフラグメンテーションが起きることがある。フラグメントは、ファイアウォールで捨てられたり、偽のフラグメントを混ぜる攻撃(キャッシュポイズニング)に使われたりするおそれがある。そのため、フラグメントが起きにくい1232バイトを、EDNSのUDPのサイズの既定値にする運用が推奨されている(2020年の DNS Flag Day)。
午後での問われ方
「EDNSに対応していない権威DNSサーバと512バイトを超えるDNSメッセージを送受信するときは、何で送受信するか」のように、TCPへの切り替えが問われる。