PythonでDNSサーバを構築

勉強のためにPythonでDNSサーバを書いてみました。

単純なコンテンツサーバです。 GitHubで公開しています。

https://github.com/yuzurihara/pydns/blob/master/dns.py

手元の環境(Python 2.7.3 on FreeBSD 9.1)で動作確認はしていますが、十分なテストは行われていません。

使い方

とりあえず、ソース内の「設定項目」以下にある、HOST, PORT, UIDを、環境に合わせて設定してください。

レコードの設定はmain()の中で行います。 def_a_record()は、Aレコードとその逆引きを設定します。 add_record()は、ドメイン名に対応する任意のレコードを設定します。

その後、root権限でdns.pyを実行してください。

※GitHub上のソースは変更される可能性があります。そのため、上記の説明がソースと合わないことになるかもしれません。

機能

以下のレコードに対応しています。

  • SOA
  • A
  • PTR
  • MX
  • NS
  • TXT
  • CNAME
  • HINFO

TCPとUDP両方の問い合わせに対応しています。

とりあえず判明している未実装な部分

  • 上に挙げた以外のレコードの処理
  • 十分なエラー処理
  • ドメイン名圧縮
  • 再帰問い合わせ(?)
  • UDP使用時に応答が512バイトを超えた場合の処理

資料とか

RFC1035: DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION