BIND
提供: Wikinote
設定
named.conf
/* ネットワークを定義 */ acl mynet { 192.168.8.0/24; 192.168.1.0/24; }; /* グローバル設定 */ options { /* named の作業ディレクトリ */ directory "/var/named"; /* クエリを受け付けるネットワークを指定 */ allow-query { localhost; mynet; }; /* 再帰問い合わせを行なうネットワークを指定 */ allow-recursion { localhost; mynet; }; /* cache → forward → recursion の順番で行なう設定 */ forward first; /* クエリを丸投げする先を指定 */ forwarders { 202.224.32.1; 202.224.32.2; }; }; /* ゾーンの定義 */ zone "hagio.org" IN { // 末尾に "." は不要 type master; file "hagio.org.zone"; }; zone "8.168.192.in-addr.arpa" IN { // ゾーン名が重要 type master; file "192.168.8.0.zone"; }; zone "1.168.192.in-addr.arpa" IN { type master; file "192.168.1.0.zone"; }; zone "." IN { // hint は不要との説もある type hint; file "named.root"; }; zone "localhost" IN { type master; file "localhost.zone"; }; zone "0.0.127.in-addr.arpa" IN { type master; file "named.local"; };
動作・仕様
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 <サーバアドレス> { edns no; };
脚注
- ↑ UDP にてデータ分割が行われないことが保証される最大サイズ。 UDP にてデータが分割されると、TCP と違ってデータの順序が保証されていないため、問題が生じる。 ただし、近年の現実のネットワークでは、もっと大きなパケットでも分割せずに送信されるため、後述の EDNS0 が提案された。