## page was copied from kresd/lib/layer/iteration <> ---- <> = DNS/返答/処理 = <> [[DNS/1/queries]] [[DNS/RFC/1034/4.3]] エラーではない[[DNS/返答]] はNoErrorだけである。[[DNS/返答/RCODE]] ただし、問題のないqueryに対しても[[DNS/返答/NXDOMAIN]]などが返ることはある。  AA flag on, SOAあり。 [[/レコード処理]] [[DNS/毒盛/CNAME]] == NoError返答 == NoError返答は四つに分類される。[[DNS/返答/DJB]] 1. CNAMEであった。qtypeはCNAMEではない。(Answer Section) 1. answerあり。(AA flag, Answer Seciton) 1. no data (AA flag, +SOA) 1. referral (AA off, + Authoriy Section NS) === 返答処理試案 === 毒見の観点から考察する。安全だと考えられるものだけを受け入れる。 Answer Sectionあり(空ではない)の場合:  [qname, qtype]が一致しているものを取り出すこと。その他は捨てるのがより安全である。 qtype=ANY は扱わないものとする。 {{{ キャッシュ内容を優先すべし。キャッシュされている内容と矛盾する返答は受け入れない。 }}} === CNAME返答 === Answer Sectionにqtype, qnameに一致するCNAMEレコードがひとつだけある場合が該当する。  CNAMEが複数ある返答は不良であり、捨てるのがよい。 すでに、キャッシュにあるCNAMEレコードであれば、受けとったレコードは無視してよい。  CNAMEレコード以外のレコードが存在していれば、返答は毒である。 === 非存在情報を活用せよ === ネガティブキャッシング情報(SOA)は特に重要である。 ゾーンが存在しないとか、レコードが存在しないとかの情報。 ゾーンが存在しないはずの名前にNSレコード返答が返れば、偽だと分かる。 なんらかのレコードが存在しないといういう返事があったのなら、CNAME返答は偽である。 -- ToshinoriMaeno <> == NXDomain (RCODE) 返答 == Authority SectionにはSOAレコードがひとつある。NSはあっても無視する。  aa flag は on のはずだ。 このSOAレコードは毒見に有効である。(NoData も同様)  SOAレコードのownerはqnameが存在しないことを示すゾーンである。   「このゾーンのより下にはqnameを含むゾーンは存在しない。」  delegation返答を受け取ったときに、受け入れてよいかどうかの判断に利用できる。 現存するリゾルバーでそのようなものは見当たらない。 === NoError aa off === NoError返答のうちのひとつは[[DNS/1/delegation]]であり、aa offのはずだ。  Authority Section にNSレコードがある。SOAはない。   このNSレコードを毒見するには、-->ゾーンの不在情報が存在しないことを確認する。 === NoError aa on === Answer Sectionの有無で分ける。 Answer Sectionがある場合: 二種類ある。 1. query name は CNAME であった。(qtypeはCNAMEではない。)    照会名を変えて、続行する必要がある。 2. query name, query type に適合する返答があった。    適合する返答(RRSet)を受け取る。  Authoriy Section(NSレコードなどがある)は無視すべきである。(移転毒の可能性)   毒の可能性がある。   キャッシュされているはずだから、受け取る必要はない。 Answer Section がない場合:[[DNS/返答/NODATA]] と呼ばれる。--> Nagative Caching  Authority Section にSOAレコードがひとつある。NSはないはず。 ゾーンの不在を示す情報が含まれている。 == Knot resolver == === resolve === answer section を処理する前にauthorityを調べている意味が分からない。  authority section を見る理由がなにかあるらしいのだが。   aa==1でも返答の内容(NXDomain, NoError)によってはAuthorityを処理する必要がある。 DJBも言っているように、返答の種類を判別するのは面倒だ。 === process_authority === process_authorityをちょっと書きなおしてみた。 NXDomain: AA offのときだけ、[[DNS/1/delegation]]を処理するのが正しい。 NoErrorではAA on を確認して、authority (SOA) を処理する。 === delegation === 検査不十分な気がする。 ownerが一致していることを見ていなかったので、追加してみた。 不整合を発見したら、その場で打ち切り。 -- ToshinoriMaeno <>  それにしても、ownerの検査などがupdate_cutにあるのは気持ち悪い。    入力パラメタは使う側で全部検査するという立場なのか。大変だな。  不正な返答はできるだけ外側で弾くという原則にした方が分かりやすいのに。   コンパイラの入力検査の話を思い出させる。-- ToshinoriMaeno <> どこでどういう検査をするかというのは、全体の構造が見えていないと、決めるのはむずかしい。  つまり、このプログラムを書いたひとはそれが見えていないのだろうと想像してしまう。 NXDOMAINに付随するSOAの処理がおかしい。  finalize_answerでAuthority Sectionをkr_rrarray_addしているのは  毒を飲んでいるようなもの。 -- ToshinoriMaeno <> == co.jp == おかしな動き。 {{{ [plan] plan 'co.jp.' type 'A' kr_zonecut_find_cached cojp kr_zonecut_find_cached jp [resl] ns_fetch_cut ret 0 [resl] NT check; cojp cut jp [resl] peekpkt cojp ret -116 [resl] zone_cut_check -> ns_fetch_cut = 0 [resl] => querying: '203.119.40.1' score: 11 zone cut: 'jp.' m12n: 'Co.JP.' type: 'A' [iter] AA terminate resolution chain [iter] <= rcode: NOERROR [iter] <= finalize NXD/NODATA [ rc ] stash auth answer [ pc ] => pktcache_stash entry [ pc ] => pktcache_stash NXDOMAIN [ pc ] => pktcache_stash answer [ pc ] => answer cached for TTL=900 [resl] <= server: '203.119.40.1' rtt: 6 ms [resl] finished: 4, queries: 1, mempool: 32800 B [plan] plan 'co.jp.' type 'A' [ pc ] => satisfied from cache [iter] AA terminate resolution chain [iter] <= rcode: NOERROR [iter] <= finalize NXD/NODATA [ pc ] => pktcache_stash entry [resl] finished: 4, queries: 1, mempool: 32800 B }}}