BIND
提供: Wikinote
目次
覚え書き
サーバの状態を得る
# 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 による通信が行われる。
- クライアントは 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 が提案された。