EDNS
DNSの機能を拡張する仕組み。UDPで送受信できるDNSメッセージの大きさの上限を、従来の512バイトから広げられる。上限を超える応答は、TCPでやり取りし直す。
イマシルちゃんの解説
DNSでドメイン名からIPアドレスを調べるとき、返事にはアドレス以外の情報が入ることもあるよ。
従来のDNSでは、UDPで運ぶ返事は512バイトまでだったんだ。
ところが、改ざんを検出するDNSSECの署名などが加わると収まらないことがあるよ。
EDNSは、受け取れる大きさなどを知らせてDNSの機能を拡張する仕組みだよ。
問い合わせにOPTレコードという追加情報を添えて、UDPで受け取れる上限をサーバへ伝えるんだ。
対応するサーバはその上限を守って返せるので、大きな返事もUDPで受け取れるようになるよ。
それでも返事が入りきらず切り詰められたときは、TCPという通信プロトコルで問い合わせ直して全体を受け取るんだ。
この解説はわかりやすかったですか?
より深い解説
定義
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 など |
応答が受信上限に収まらないとき
従来のDNSでUDPを使う場合、DNSメッセージの上限は512バイトである。これはEDNSを使わないDNSの制限であり、UDPというプロトコル自体の上限ではない。EDNSでは、問い合わせ側が受け取れる大きさを通知する。
| 状況 | 動作 |
|---|---|
| EDNSを使い、調整した上限以内 | UDPで送受信する |
| EDNSを使わず、従来の上限以内 | UDPで送受信できる |
| UDPで返せる上限に必要な回答が収まらない | 応答のTCビットを立てて切り詰めたことを示す。受信側はTCPで問い合わせ直す |
TCビットのTCはTruncatedの略である。相手がEDNSに未対応という理由だけで、短い応答まで必ずTCPになるわけではない。一方、通常の名前解決でも大きな回答ではTCPへの切替えが必要になる。
従来のDNSは、UDPとTCPのどちらでもサーバのポート53番を使う。ファイアウォールでUDPだけを許可すると、小さな回答は受け取れても大きな回答の取得に失敗することがある。
IPv6とDNSメッセージの大きさ
IPv6のアドレス(AAAAレコード)は128ビットで、IPv4のアドレス(Aレコード)の4倍の大きさがある。複数のレコードやDNSSECの署名が含まれると、応答が512バイトを超えやすくなる。ただし、IPv6の名前解決だから必ず大きくなるわけではない。応答に含まれるレコードの種類と数によって変わる。
大きなUDPのパケットの問題
大きなUDPデータグラムはIPのフラグメントに分かれる場合がある。IPv4では条件によって経路上のルータも分割するが、IPv6では分割するのは送信元である。フラグメントが途中で失われると回答全体を復元できないため、EDNSの受信上限を単に大きくすればよいわけではない。経路のMTUを考慮した上限とTCPへの切替えを組み合わせる。