= DNS/実装/ゾーンサーバ = <> <> == 単独のゾーンをサービスする == ひとつだけのゾーンをサービスするゾーンサーバでも考えておく必要があることがたくさんある。  複数のゾーンを同居させるのは難しい。 [[DNS/1/ゾーンサーバ/親子ゾーン同居]]    [[DNS/課題/親子同居問題]] [[DNS/RFC/1912]] 参考:[[../リゾルバー]] [[../リゾルバー計画]] (長音記号の使い方が一貫していない。ごめん) [[/zone.py]] [[DNS/実装/python/dnslib/ゾーンサーバー]] と重複している。 == ゾーンファイルの検査 == [[DNS/実装/ゾーンファイル]]がRFCの制約に従っているかを検査しておく必要がある。[[/zone.py]]  返答を作成するのにも必要だから。-- ToshinoriMaeno <> 1. ゾーンに必須のレコード(SOA+NS) 1. CNAMEは他のレコードと共存させられない 1. CNAMEを値としてはいけないレコード 1. delegate されたサブドメイン下の名前 == queryの検査 == python/dnslibを利用しての実装 qnameは自ドメイン管理下の名前であること。(それ以外には答えない)  当面はqtype ANY ではないとする。 (TC=1 の返答を返すことにする。) == 返答作成 == ゾーンサーバの返す返答 (DJBの分類では5種類だ)  NXDomain返答をするのが意外に面倒 (wildcard設定まで考えると) 正当な形式のqueryに対しては、以下の場合の返答があり得る。 1. 存在が確認できた名前   1. qtypeが一致するレコードがある。(Answerあり)      Authority Section, Additional Sectionは付けない。(minimum responseの原則)   2. qtypeと一致するレコードがない。 1. CNAMEレコードがある。(qtype はCNAMEではない。)(CNAME 返答)    2. CNAMEではない。名前の存在は確認できた。qtypeレコードは存在しない。([[/NoData返答]]) 2. delegation 検査   問い合わせ名のsuffixを持つzone cutが存在する。(referral返答/delegation)   delegation返答 aa=0 (問い合わせ名の末尾に対応するNSレコードがある) 3. wildcard 検査 (qnameに一致する名前はなかった)   問い合わせ名のsuffixを持つwildcard名が存在するか。[[/wildcard]] qtypeは一致するか。--> [[DNS/用語/wildcards/RFC4592/example]]    面倒な割に益が小さいので、当面はこの程度でお茶を濁す。(自分では使わない) 4. 存在しない名前である。(ENTでもない。[[/NXDomain返答]]) == データ構造 == これらの確認が簡単にできるようなデータ構造にするには?   Empty Non Terminalもすべて登録しておけばいい。 レコード登録時にひとつ上を検査する。登録されていれば、終了。   存在しない名前を簡単に検出できる。 === ゾーンデータのためのデータ構造 === 名前が存在しないことを確認するのが意外に面倒だということです。(NXDomain) ENT名を登録するのが現状ではよさそう。-- ToshinoriMaeno <>   == 名前が存在しない == これが問題になるのはwild cardレコードが設定されている場合だが、  名前は存在するが、特定のタイプのレコードが存在しないことを区別する必要がある。 NXDomainを返答する必要がある。 -- ToshinoriMaeno <> [[../リゾルバー]] ---- <>