1. DNS/実装/python/dnslib/ゾーンサーバー

python/dnslibを利用して、簡単なゾーンサーバを作ってみる。-- ToshinoriMaeno 2016-08-01 08:46:32

ゾーンサーバで実現したい機能をまとめる。DNS/実装/ゾーンサーバ

../server.py

1.1. ゾーンデータ

/zone.py

いわゆるゾーン形式のテキストを読み込んで、dnslib.RRタイプに変換する。 ../usage

>>> RR.fromZone("abc.com IN A 1.2.3.4")

複数行からなるゾーンファイル形式でもよい。

必須のレコード: ゾーンの根にはSOAとNSは必須である。

ドメイン名はゾーン名をsuffixに持つこと。

1.2. 構造化

最初にやることはドメイン名(owner)をキーにしたDictを作ることだ。

 値はレコードタイプをキーにしたDict
  そのDictの値は資源レコードセットとする。

ゾーン外のowner名をもつレコードは捨てるのがよいが、 実際にはゾーン外の名前かどうかはSOAを見つけたあとでないとわからない。 また、delegateされた先に属する名前もわからない。

1.2.1. 登録時の検査

レコードセットとしてまとめる。(名前とrtype)

NSレコードの登録:

CNAMEレコードの登録:

CNAMEレコードが登録ずみでないことの確認:

1.2.2. 登録完了時の検査

zone apexに必須のレコードの確認

NSレコードを持つ末端ノードのリスト(zone cut; delegation判定用)

このあとで、ゾーン外の名前に属するレコードは削除することになるだろう。

CNAMEレコードのownerは他のレコードが登録されていないこと。

CNAMEを指す名前(CNAME, NSなどがないか)

1.3. 検索

問い合わせの形式検査 /query-example

1.3.1. ゾーン内の名前の検索

1.3.1.1. 名前あり

レコードタイプの一致: 返答; 

不一致の場合、CNAMEの存在を調べる。

CNAMEならAnswerにいれて終了。(ターゲット名で検索を続行する必要はない。)

1.3.1.2. 一致する名前がなかった

delegation返答の必要があるか。(zone cut DBが欲しい)

wild card レコードが該当するかもしれない。(省略)

NXDomain返答(SOAレコードをAuth. Sec. に入れる)  -- ToshinoriMaeno 2016-08-03 12:24:47

1.4. 返答生成

minimal response policy

delegation返答には真のglueを付ける。(additional section)

-- ToshinoriMaeno 2016-07-31 23:28:25