「BIND」の版間の差分

提供: Wikinote
移動: 案内検索
(動作・仕様)
 
(同じ利用者による、間の9版が非表示)
行1: 行1:
 +
== 覚え書き ==
 +
=== サーバの状態を得る ===
 +
 +
# rndc dumpdb -all
 +
# rndc stats
 +
# rndc status
 +
number of zones: 5
 +
debug level: 0
 +
xfers running: 0
 +
xfers deferred: 0
 +
soa queries in progress: 0
 +
query logging is OFF
 +
recursive clients: 0/1000
 +
tcp clients: 0/100
 +
server is up and running
 +
 +
=== dig の使い方 ===
 +
 +
# dig [@server] domain [a|any|mx|ns|soa|hinfo|axfr|txt|ptr]
 +
# dig [@server] -x address
 +
 +
ドメイン名を補完してくれないので、ホスト名だけではダメである。
 +
FQDN にするか、以下のようにデフォルトドメインを指定する必要がある。
 +
 +
# dig lab +domain=hagio.org
 +
 +
== 設定 ==
 +
 +
=== named.conf ===
 +
ひとまず動く設定だけでも何かと役に立つかと。
 +
 +
/* ネットワークを定義 */
 +
acl mynet {
 +
    192.168.8.0/24;
 +
    192.168.1.0/24;
 +
};
 +
 +
/* グローバル設定 */
 +
options {
 +
    /* named の作業ディレクトリ */
 +
    directory "/var/named";
 +
    /* # rndc dumpdb の出力先 */
 +
    dump-file "/var/named/data/cache_dump.db";
 +
    /* # rndc stats の出力先 */
 +
    statistics-file "/var/named/data/named_stats.txt";
 +
 +
    /* クエリを受け付けるネットワークを指定 */
 +
    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.rev";
 +
};
 +
zone "1.168.192.in-addr.arpa" IN {
 +
    type master;
 +
    file "192.168.1.0.rev";
 +
};
 +
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";
 +
};
 +
 +
=== 正引きゾーンファイル ===
 +
 +
正しいかどうかはわからないがとりあえず名前引きはできている。
 +
 +
$TTL 86400
 +
@      IN  SOA    lab.hagio.org.  root.hagio.org. (
 +
                    2010121301 ; Serial  シリアル番号
 +
                    3H        ; Refresh  更新間隔
 +
                    15M        ; Retry    リトライ間隔
 +
                    1W        ; Expire  有効期限
 +
                    1D )      ; Minimum  デフォルトの TTL (ネガティブキャッシュ含む)
 +
        IN  NS      lab.hagio.org. ; ネームサーバ
 +
        IN  A      192.168.1.1    ; ホスト名なしの指定も可能らしい
 +
lab    IN  A      192.168.1.1
 +
kuro    IN  A      192.168.1.10
 +
lab    IN  A      192.168.8.1
 +
cent47  IN  A      192.168.8.47
 +
cent52  IN  A      192.168.8.52
 +
 +
=== 逆引きゾーンファイル ===
 +
 +
192.168.1.0/24 のネットワーク用。
 +
 +
$TTL 86400
 +
@      IN  SOA    lab.hagio.org.  root.hagio.org. (
 +
                    2010121301 ; Serial  シリアル番号
 +
                    3H        ; Refresh  更新間隔
 +
                    15M        ; Retry    リトライ間隔
 +
                    1W        ; Expire  有効期限
 +
                    1D )      ; Minimum  デフォルトの TTL
 +
        IN  NS      lab.hagio.org.
 +
1      IN  PTR    lab.hagio.org.
 +
10      IN  PTR    kuro.hagio.org.
 +
 
== 動作・仕様 ==
 
== 動作・仕様 ==
  
行18: 行143:
 
==== 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 通信によるコストを減らすためのプロトコルである (他にも目的はあるが)。
 +
 +
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;
 +
};
  
 
== 脚注 ==
 
== 脚注 ==
 
<references />
 
<references />
 +
 +
== 参考文献 ==
 +
* [http://www.nic.ad.jp/ja/translation/rfc/2671.html DNS用拡張メカニズム(EDNS0)(RFC2671)]
 +
* [http://technet.microsoft.com/ja-jp/library/cc785769.aspx DNS の拡張機能機構 (EDNS0) を使用する]

2011年1月12日 (水) 22:21時点における最新版

覚え書き

サーバの状態を得る

# rndc dumpdb -all
# rndc stats
# rndc status
number of zones: 5
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/1000
tcp clients: 0/100
server is up and running

dig の使い方

# dig [@server] domain [a|any|mx|ns|soa|hinfo|axfr|txt|ptr]
# dig [@server] -x address

ドメイン名を補完してくれないので、ホスト名だけではダメである。 FQDN にするか、以下のようにデフォルトドメインを指定する必要がある。

# dig lab +domain=hagio.org

設定

named.conf

ひとまず動く設定だけでも何かと役に立つかと。

/* ネットワークを定義 */
acl mynet {
    192.168.8.0/24;
    192.168.1.0/24;
};

/* グローバル設定 */
options {
    /* named の作業ディレクトリ */
    directory "/var/named";
    /* # rndc dumpdb の出力先 */
    dump-file "/var/named/data/cache_dump.db";
    /* # rndc stats の出力先 */
    statistics-file "/var/named/data/named_stats.txt";

    /* クエリを受け付けるネットワークを指定 */
    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.rev";
};
zone "1.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.1.0.rev";
};
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";
};

正引きゾーンファイル

正しいかどうかはわからないがとりあえず名前引きはできている。

$TTL 86400
@       IN  SOA     lab.hagio.org.  root.hagio.org. (
                    2010121301 ; Serial   シリアル番号
                    3H         ; Refresh  更新間隔
                    15M        ; Retry    リトライ間隔
                    1W         ; Expire   有効期限
                    1D )       ; Minimum  デフォルトの TTL (ネガティブキャッシュ含む)
        IN  NS      lab.hagio.org. ; ネームサーバ
        IN  A       192.168.1.1    ; ホスト名なしの指定も可能らしい
lab     IN  A       192.168.1.1
kuro    IN  A       192.168.1.10
lab     IN  A       192.168.8.1
cent47  IN  A       192.168.8.47
cent52  IN  A       192.168.8.52

逆引きゾーンファイル

192.168.1.0/24 のネットワーク用。

$TTL 86400
@       IN  SOA     lab.hagio.org.  root.hagio.org. (
                    2010121301 ; Serial   シリアル番号
                    3H         ; Refresh  更新間隔
                    15M        ; Retry    リトライ間隔
                    1W         ; Expire   有効期限
                    1D )       ; Minimum  デフォルトの TTL
        IN  NS      lab.hagio.org.
1       IN  PTR     lab.hagio.org.
10      IN  PTR     kuro.hagio.org.

動作・仕様

UDP と TCP

DNS の通信には、通常 UDP が用いられる。 ただし、UDP パケットが 512 バイト [1] を超えるような通信 (応答) が必要となった場合、TCP による通信が行われる。

  1. クライアントは UDP にてクエリをサーバへ送信する。
  2. (512 バイトを超える場合) サーバは UDP にて、ヘッダ部の TC ビットを 1 にセットした回答をクライアントへ送信する。
  3. クライアントは、TCP にてサーバへ接続し、クエリを送信する。
  4. サーバは、回答をクライアントへ送信する。

したがって、iptables などでパケットをフィルタリングしている場合、UDP/TCP ともに 53 番ポートを通す必要がある。

EDNS0

BIND 8.3 以降、BIND 9 以降は EDNS0 (Extension Mechanisms for DNS version 0) に対応している。 これは、512 バイトより大きな UDP パケットを利用し、TCP 通信によるコストを減らすためのプロトコルである (他にも目的はあるが)。

EDNS0 を用いるには、クライアントとサーバが両方とも EDNS0 に対応している必要がある。

  • クライアントが対応していない場合
    • 上述の通常の通信が行われる。
  • クライアント・サーバともに対応しており、1 パケットで応答できる場合
    1. クライアントが UDP にて、EDNS0 クエリをサーバに送信する。MTU を考慮した最大ペイロード長が情報として含まれる (べき)。
    2. サーバが UDP にて、EDNS0 レスポンスをクライアントに送信する。
  • クライアント・サーバともに対応しており、1 パケットで応答できない場合
    1. クライアントが UDP にて、ENDS0 クエリをサーバに送信する。
    2. サーバが UDP にて、TC ビットを 1 に設定した EDNS0 レスポンスをクライアントに送信する。
    3. クライアントが TCP にて、サーバに接続する。
    4. サーバが TCP にて、レスポンスを送信する。
  • クライアントは対応しているが、サーバが対応していない場合
    1. クライアントが UDP にて、EDNS0 クエリをサーバに送信する。
    2. サーバが UDP にて、FORMERR/SERVFAIL/NOTIMPL ビットいずれかを 1 に設定したレスポンスをクライアントに送信する。
    3. クライアントが UDP にて、通常のクエリをサーバに送信する。
    4. 以降、通常の動作と同様。

よって、サーバが対応していない場合は通常のクエリを用いるよりもコストがかかってしまう。 BIND では、デフォルトの設定で EDNS0 が用いられるが、使わないように設定することも可能だ。

例えば、以下の設定で特定のサーバへのクエリには EDNS0 を使用しないようになる。

server <サーバアドレス> {
  edns no;
};

脚注

  1. UDP にてデータ分割が行われないことが保証される最大サイズ。 UDP にてデータが分割されると、TCP と違ってデータの順序が保証されていないため、問題が生じる。 ただし、近年の現実のネットワークでは、もっと大きなパケットでも分割せずに送信されるため、後述の EDNS0 が提案された。

参考文献