勉強のために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