DNS/実装/python/dnslib/リゾルバーについて、ここに記述してください。 ゾーンサーバーの骨格ができてきたので、 そろそろリゾルバーを作り始める。-- ToshinoriMaeno <> https://github.com/paulchakravarti/dnslib/blob/master/dnslib/server.py {{{ >>> resolver = BaseResolver() >>> logger = DNSLogger(prefix=False) >>> server = DNSServer(resolver,port=8053,address="localhost",logger=logger) >>> server.start_thread() >>> q = DNSRecord.question("abc.def") >>> a = q.send("localhost",8053) }}} {{{ class BaseResolver(object): """ Base resolver implementation. Provides 'resolve' method which is called by DNSHandler with the decode request (DNSRecord instance) and returns a DNSRecord instance as reply. In most cases you should be able to create a custom resolver by just replacing the resolve method with appropriate resolver code for application (see fixedresolver/zoneresolver/shellresolver for examples) Note that a single instance is used by all DNSHandler instances so need to consider blocking & thread safety. """ }}} == 実装項目 == 1. qname minimisation RFC 2. qname randomization 0x20 3. 毒盛対策 == データ構造 == RRSet キャッシュ zone cuts キャッシュ 否定返答キャッシュ * レコード不在のキャッシュ * ゾーン不在のキャッシュ Knot resolverはpacketキャッシュを持っているが、必要か。 == query生成 == どこになにを問い合わせるか。  zone cuts 確認方法   上位ドメインから末端へ; TTLを確認しながら。  delegation返答を疑え。   1. unbound風にdelegation返答は権威あるNSを確認する。     しかし、これだけでは偽delegationを排除できない。   2. 事前に受け取ったSOA返答から、     zonecut非存在が分かる名前へのdelegationは毒であると判断する。   3. delegation返答を再確認する。random nameを付けて、NSを問い合わせてみる。 == response 処理 == 毒盛対策を中心に考える。特にゾーンサーバからの不正なデータを除去する。 === CNAME === === NoData === === negative response === SOA cuts information (Maeno) === delegation === -- ToshinoriMaeno <>