1. djbdns/dnscache/プログラム

http://djbdns.qmail.jp/djbdns/dnscache.html

D. J. Bernstein [Translated into Japanese by MAENO Toshinori]
Internet publication
djbdns

2. dnscacheプログラム

dnscacheはローカルに DNS 情報をキャッシュするものです。

このページはリファレンスページです。

2.1. 構成(Configuration)

dnscache は通常 dnscache-conf プログラムを使って設定します。

dnscache は $ROOT環境変数で指定されたディレクトリにchrootして、 $UID と $GID 環境変数で指定された uid と gid として実行されます。

$IP の port 53 に向けて接続されてくる UDP パケットと TCP 接続を受け付けます。

ip/1.2.3.4, ip/1.2.3, ip/1.2, ip/1 のどれかのファイルが存在すれば、 IP アドレス1.2.3.4 からのパケット/接続を受け付けます。

$IPSENDの高位ポートからパケットを送り出します。

128 バイトまでのseedを標準入力から読み込み、 そのseedを dns_random_initに渡します。

ルートサーバのドット10進表記IPアドレスが一行にひとつ ずつ書かれているファイルservers/@を読み込みます。

さらに、他ドメイン用のサーバの IP アドレスがあるかどうか、 servers ディレクトリを調べます。

1.03 版以降の機能: 環境変数 $FORWARDONLY が設定されていると、

2.2. メモリの使用

200までのUDP問合せと20のTCP接続が同時に扱えるように、 256KB を越えない固定領域のテーブルを使います。

UDPで送られてくる問い合わせ列用に 128KBのバッファを予約します。 1.03 版以降では、すでに 200 のUDP 問い合わせを処理して いる最中に新しい UDP 問い合わせを受けとると、一番古い問い合わせを捨てます。 すでに 20 のTCP 接続を処理している最中に新しい接続要求があると、 一番古い接続を捨てます。

$CACHESIZE環境変数で制御される固定領域のキャッシュを使います。 キャッシュ領域の約 5% はハッシュテーブルに使われます。 残りがキャッシュエントリ用です。 (Y2038-適合の有効期限のための8バイトを含む。):

    A セット. 22 バイト と アドレス毎に4 バイト と 所有者名の長さ。
    NS セット、 PTR セット、 CNAME セット. 22 バイト と 所有者名と 全データ名の長さ。
    MX セット. 22 バイト と MX毎に 2 バイトと全データ名の長さ。
    その他のレコードセット. 22 バイト と レコード毎に 2 バイトと 全データ文字列と所有者名の長さ。
    存在しないドメイン または サーバフェイル 22 バイト と 所有者名の長さ。 

8192 バイトを越えるセットはキャッシュされません。

dnscacheはキャッシュに空きスペースが無くなっても終了しません。 単に最も古いエントリを削除して、空きスペースを作ります。

2.3. 名前の解決とキャッシュについての方針

dnscacheはきちんと作られたルートネームサーバの一覧表に依存しています。

当該サーバの管轄区域外のレコードは保存しません; (当然、渡しません。) これらのレコードには毒が入っているかもしれないからです。 例えば、foo.domのレコードは ルートサーバ、dom サーバ、そしてfoo.dom サーバ からしか受け取りません。

dnscacheは返事の additional セクションからグルーを取り出すために キャッシュをバイパスしたりしません。

レコードはたかだか1週間しか保存されません。 2147483647 より大きな TTLは 0 と見なされます。

SOA レコードは保存されません。

2.4. DNS クライアントへの返答

dnscacheの返答は一般に BINDの返答よりずっと小さいものです。 応答にはオーソリティレコード (ソースネームサーバのNS レコードと否定返答のSOA レコード) や 付加レコード( NS、MX レコードに関連する A レコード) は含めません。 UDP についての長さ制限のために切りつめられた answer セクションはまったくなかったものとして扱われます。

dnscacheはローカルユーザが他のローカルユーザを覗かせないよう努めます; 非再帰問合せと逆問合せには答えません; ゾーン転送要求も無視します。 環境変数 $HIDETTL が設定されているとき、返答のTTL を 0にして返します。 1.03 より前の版では常に 返答のTTL を 0にして返します。

RFC 1035 によれば、AA ビットは "specifies that the responding name server is an authority for the domain name in question section." 「返答したネームサーバは問合せセクション中のドメインのオーソリティであることを 示す」とあります。

dnscache はいかなるドメインのオーソリティでもありません。 けっして AA ビットをセットしません。 (ただし、NXDOMAIN 返答は例外です。RFC 2308によって よくあるクライアントの不良を回避するために要求されています。) 対照的に、BINDはしばしば肯定返答に対し そのドメイン名に対するオーソリティでないにもかかわらず、 AAをセットします。

2.5. 重複 IP アドレス

サーバーが dnscache にIP アドレスを重複して返してくると、 dnscache はその重複した IP アドレス をそのまま クライアントに渡します。 このサーバの振舞いは RFC 2181, section 5.5 に反しています。 しかし、重複 IP アドレスは負荷分散のために有用なので、 重複があっても dnscache はわざわざ取り除くことはしません。

広く存在しているBIND サーバの不良 (BIND 9.1 では修正されている)は 意図することなく重複 IP アドレス を作りだす。 以下は BIND 会社のあるサーバからの例です(現在は修正ずみ):

     % dnsq a ns-ext.vix.com ns-ext.vix.com
     1 ns-ext.vix.com:
     117 bytes, 1+1+2+2 records, response, authoritative, noerror
     query: 1 ns-ext.vix.com
     answer: ns-ext.vix.com 3600 A 204.152.184.64
     authority: vix.com 3600 NS ns-ext.vix.com
     authority: vix.com 3600 NS ns1.gnac.com
     additional: ns-ext.vix.com 3600 A 204.152.184.64
     additional: ns1.gnac.com 130768 A 209.182.195.77

dnscacheが重複した IP アドレスを返す 一番の理由がこの BIND の不良です。

2.6. 特定の名前

dnscacheは内部的にlocalhostを処理します。 127.0.0.1 という A レコードがあったものとします。

内部的に1.0.0.127.in-addr.arpaを処理します。 localhost という PTR レコードがあったものとします。

ドットつき 10進表記のドメイン名を内部処理します。 例えば、ドメイン名 192.48.96.2 には 192.48.96.2 という A レコードを与えます。


2002-10-30 訳:前野年紀

改訂 -- ToshinoriMaeno 2021-05-20 02:44:52

MoinQ: djbdns/dnscache/プログラム (last edited 2021-05-20 22:02:06 by ToshinoriMaeno)