「BIND」の版間の差分
提供: Wikinote
(→EDNS0) |
(→EDNS0) |
||
行18: | 行18: | ||
==== EDNS0 ==== | ==== EDNS0 ==== | ||
BIND 8.3 以降、BIND 9 以降は [http://www.nic.ad.jp/ja/translation/rfc/2671.html EDNS0] (Extension Mechanisms for DNS version 0) に対応している。 | BIND 8.3 以降、BIND 9 以降は [http://www.nic.ad.jp/ja/translation/rfc/2671.html EDNS0] (Extension Mechanisms for DNS version 0) に対応している。 | ||
− | これは、512 バイトより大きな UDP パケットを利用し、TCP | + | これは、512 バイトより大きな UDP パケットを利用し、TCP 通信によるコストを減らすためのプロトコルである (他にも目的はあるが)。 |
EDNS0 を用いるには、クライアントとサーバが両方とも EDNS0 に対応している必要がある。 | EDNS0 を用いるには、クライアントとサーバが両方とも EDNS0 に対応している必要がある。 | ||
行25: | 行25: | ||
** 上述の通常の通信が行われる。 | ** 上述の通常の通信が行われる。 | ||
* クライアント・サーバともに対応しており、1 パケットで応答できる場合 | * クライアント・サーバともに対応しており、1 パケットで応答できる場合 | ||
− | *# クライアントが UDP にて、EDNS0 クエリをサーバに送信する。MTU | + | *# クライアントが UDP にて、EDNS0 クエリをサーバに送信する。MTU を考慮した最大ペイロード長が情報として含まれる (べき)。 |
*# サーバが UDP にて、EDNS0 レスポンスをクライアントに送信する。 | *# サーバが UDP にて、EDNS0 レスポンスをクライアントに送信する。 | ||
* クライアント・サーバともに対応しており、1 パケットで応答できない場合 | * クライアント・サーバともに対応しており、1 パケットで応答できない場合 | ||
行37: | 行37: | ||
*# クライアントが UDP にて、通常のクエリをサーバに送信する。 | *# クライアントが UDP にて、通常のクエリをサーバに送信する。 | ||
*# 以降、通常の動作と同様。 | *# 以降、通常の動作と同様。 | ||
+ | |||
+ | よって、サーバが対応していない場合は通常のクエリを用いるよりもコストがかかってしまう。 | ||
+ | BIND では、デフォルトの設定で EDNS0 が用いられるが、使わないように設定することも可能だ。 | ||
+ | |||
+ | 例えば、以下の設定で特定のサーバへのクエリには EDNS0 を使用しないようになる。 | ||
+ | server <サーバアドレス> { | ||
+ | ends no; | ||
+ | }; | ||
== 脚注 == | == 脚注 == | ||
<references /> | <references /> |
2009年5月12日 (火) 07:18時点における版
動作・仕様
UDP と TCP
DNS の通信には、通常 UDP が用いられる。 ただし、UDP パケットが 512 バイト [1] を超えるような通信 (応答) が必要となった場合、TCP による通信が行われる。
- クライアントは UDP にてクエリをサーバへ送信する。
- (512 バイトを超える場合) サーバは UDP にて、ヘッダ部の TC ビットを 1 にセットした回答をクライアントへ送信する。
- クライアントは、TCP にてサーバへ接続し、クエリを送信する。
- サーバは、回答をクライアントへ送信する。
したがって、iptables などでパケットをフィルタリングしている場合、UDP/TCP ともに 53 番ポートを通す必要がある。
EDNS0
BIND 8.3 以降、BIND 9 以降は EDNS0 (Extension Mechanisms for DNS version 0) に対応している。 これは、512 バイトより大きな UDP パケットを利用し、TCP 通信によるコストを減らすためのプロトコルである (他にも目的はあるが)。
EDNS0 を用いるには、クライアントとサーバが両方とも EDNS0 に対応している必要がある。
- クライアントが対応していない場合
- 上述の通常の通信が行われる。
- クライアント・サーバともに対応しており、1 パケットで応答できる場合
- クライアントが UDP にて、EDNS0 クエリをサーバに送信する。MTU を考慮した最大ペイロード長が情報として含まれる (べき)。
- サーバが UDP にて、EDNS0 レスポンスをクライアントに送信する。
- クライアント・サーバともに対応しており、1 パケットで応答できない場合
- クライアントが UDP にて、ENDS0 クエリをサーバに送信する。
- サーバが UDP にて、TC ビットを 1 に設定した EDNS0 レスポンスをクライアントに送信する。
- クライアントが TCP にて、サーバに接続する。
- サーバが TCP にて、レスポンスを送信する。
- クライアントは対応しているが、サーバが対応していない場合
- クライアントが UDP にて、EDNS0 クエリをサーバに送信する。
- サーバが UDP にて、FORMERR/SERVFAIL/NOTIMPL ビットいずれかを 1 に設定したレスポンスをクライアントに送信する。
- クライアントが UDP にて、通常のクエリをサーバに送信する。
- 以降、通常の動作と同様。
よって、サーバが対応していない場合は通常のクエリを用いるよりもコストがかかってしまう。 BIND では、デフォルトの設定で EDNS0 が用いられるが、使わないように設定することも可能だ。
例えば、以下の設定で特定のサーバへのクエリには EDNS0 を使用しないようになる。
server <サーバアドレス> { ends no; };
脚注
- ↑ UDP にてデータ分割が行われないことが保証される最大サイズ。 UDP にてデータが分割されると、TCP と違ってデータの順序が保証されていないため、問題が生じる。 ただし、近年の現実のネットワークでは、もっと大きなパケットでも分割せずに送信されるため、後述の EDNS0 が提案された。