/cache優先の原則 /固定問い合わせ先 /有効返答 /親子同居 |
1. DNS/返答/処理
Contents
DNS/1/queries DNS/RFC/1034/4.3
エラーではないDNS/返答 はNoErrorだけである。DNS/返答/RCODE
ただし、問題のないqueryに対してもDNS/返答/NXDOMAINなどが返ることはある。
- AA flag on, SOAあり。
1.1. NoError返答
NoError返答は四つに分類される。DNS/返答/DJB
- CNAMEであった。qtypeはCNAMEではない。(Answer Section)
- answerあり。(AA flag, Answer Seciton)
- no data (AA flag, +SOA)
- referral (AA off, + Authoriy Section NS)
1.1.1. 返答処理試案
毒見の観点から考察する。安全だと考えられるものだけを受け入れる。
Answer Sectionあり(空ではない)の場合:
- [qname, qtype]が一致しているものを取り出すこと。その他は捨てるのがより安全である。
qtype=ANY は扱わないものとする。
キャッシュ内容を優先すべし。キャッシュされている内容と矛盾する返答は受け入れない。
1.1.2. CNAME返答
Answer Sectionにqtype, qnameに一致するCNAMEレコードがひとつだけある場合が該当する。
- CNAMEが複数ある返答は不良であり、捨てるのがよい。
すでに、キャッシュにあるCNAMEレコードであれば、受けとったレコードは無視してよい。
- CNAMEレコード以外のレコードが存在していれば、返答は毒である。
1.1.3. 非存在情報を活用せよ
ネガティブキャッシング情報(SOA)は特に重要である。
- ゾーンが存在しないとか、レコードが存在しないとかの情報。
ゾーンが存在しないはずの名前にNSレコード返答が返れば、偽だと分かる。
なんらかのレコードが存在しないといういう返事があったのなら、CNAME返答は偽である。
-- ToshinoriMaeno 2016-07-15 12:36:54
1.2. NXDomain (RCODE) 返答
Authority SectionにはSOAレコードがひとつある。NSはあっても無視する。
- aa flag は on のはずだ。
このSOAレコードは毒見に有効である。(NoData も同様)
- SOAレコードのownerはqnameが存在しないことを示すゾーンである。
- 「このゾーンのより下にはqnameを含むゾーンは存在しない。」
現存するリゾルバーでそのようなものは見当たらない。
1.2.1. NoError aa off
NoError返答のうちのひとつはDNS/1/delegationであり、aa offのはずだ。
- Authority Section にNSレコードがある。SOAはない。
このNSレコードを毒見するには、-->ゾーンの不在情報が存在しないことを確認する。
1.2.2. NoError aa on
Answer Sectionの有無で分ける。
Answer Sectionがある場合: 二種類ある。
- query name は CNAME であった。(qtypeはCNAMEではない。)
- 照会名を変えて、続行する必要がある。
- query name, query type に適合する返答があった。
- 適合する返答(RRSet)を受け取る。
- 毒の可能性がある。 キャッシュされているはずだから、受け取る必要はない。
Answer Section がない場合:DNS/返答/NODATA と呼ばれる。--> Nagative Caching
- Authority Section にSOAレコードがひとつある。NSはないはず。
- ゾーンの不在を示す情報が含まれている。
1.3. Knot resolver
1.3.1. resolve
answer section を処理する前にauthorityを調べている意味が分からない。
- authority section を見る理由がなにかあるらしいのだが。
aa==1でも返答の内容(NXDomain, NoError)によってはAuthorityを処理する必要がある。
DJBも言っているように、返答の種類を判別するのは面倒だ。
1.3.2. process_authority
process_authorityをちょっと書きなおしてみた。
NXDomain: AA offのときだけ、DNS/1/delegationを処理するのが正しい。
NoErrorではAA on を確認して、authority (SOA) を処理する。
1.3.3. delegation
検査不十分な気がする。 ownerが一致していることを見ていなかったので、追加してみた。
不整合を発見したら、その場で打ち切り。
-- ToshinoriMaeno 2016-04-29 02:57:11
- それにしても、ownerの検査などがupdate_cutにあるのは気持ち悪い。
- 入力パラメタは使う側で全部検査するという立場なのか。大変だな。
コンパイラの入力検査の話を思い出させる。-- ToshinoriMaeno 2016-04-30 05:46:27
どこでどういう検査をするかというのは、全体の構造が見えていないと、決めるのはむずかしい。
- つまり、このプログラムを書いたひとはそれが見えていないのだろうと想像してしまう。
NXDOMAINに付随するSOAの処理がおかしい。
- finalize_answerでAuthority Sectionをkr_rrarray_addしているのは 毒を飲んでいるようなもの。
-- ToshinoriMaeno 2016-04-29 05:05:44
1.4. 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