MoinQ:

1. DNS/リゾルバー/計画

DNS/リゾルバーにある要件を実施する。

DNS/実装/python/dnslib/リゾルバー

python/dnslibの存在を知ったおかげで、ゾーンサーバーの骨格ができてきた。

そこで、そろそろリゾルバーを作り始める。(目的は毒盛対策だ)

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

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.
    """

2. 実装項目

優先

  1. /毒盛対策

  2. /qname_minimisation RFC

後回しか。

  1. qname randomization 0x20

ひとつの問い合わせを回答するまでは次の問い合わせは受け付けない。

ローカルに解決すべき対象

/rfc要請

3. データ構造

/data-structure RRSet キャッシュ

TTLの管理

Ghost Domain Names脆弱性で明らかにされたにも拘らず、 消滅したドメインのレコードを残すリゾルバーがありそうだ。

zone cuts キャッシュ

否定返答キャッシュ

Knot resolverはpacketキャッシュを持っているが、必要か。

4. query生成

/query どこになにを問い合わせるか。

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 レコードを与えます。 

qname minimisationの原則:

zone cutsの存在を調べながら、降下していくことにする。(qname minimisation)

5. response 処理

/respense

毒盛対策を中心に考える。特にゾーンサーバからの不正なデータを除去する。

6. cache overwrite

RFC2181にあるような判断を避けるための原則

特に(権威のない)delegation返答はキャッシュしないというのが大事だと思う。

-- ToshinoriMaeno 2016-10-16 11:37:45