ArduinoをDNSサーバにする (dnsmasqライク版)
ArduinoをDNSサーバにする (プロトタイプ) - DiaryExceptionのfuture workで述べているように、dnsmasqを参考に、Ethernet Shield付属のスロットに挿入されたmicroSDカード内のhostsファイルを読みルーティングテーブルを生成するDNSサーバをArduinoで作った。
hostsファイルはmicroSDカードの/etc/ディレクトリに格納しているものとする。hostsファイルはコメントを書くことも出来る。コメントは(ルーティングテーブルとは無関係の情報なので)Arduinoがファイルを読む段階で無視される。
# comment: this is hosts file 192.168.254.10 hoge.example.com 192.168.254.11 foo.example.com 192.168.254.12 bar.example.com # comment
ルーティングテーブルはArduinoのSRAMに格納する。僕が持っているDuemilanoveのSRAM容量は2KBである。チェックしたところ、僕が作ったコードではルーティングテーブルのIPアドレス-ドメイン名のペアは最大7つ格納できた。勿論、コードを改良すればもっと入るかもしれない。
このArduino DNSサーバの挙動はdigでチェックした。
$ dig @192.168.254.100 foo.example.com ; <<>> DiG 9.6.0-APPLE-P2 <<>> @192.168.254.100 foo.example.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40440 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;foo.example.com. IN A ;; ANSWER SECTION: foo.example.com. 60 IN A 192.168.254.11 ;; Query time: 5 msec ;; SERVER: 192.168.254.100#53(192.168.254.100) ;; WHEN: Sat Jan 22 12:51:18 2011 ;; MSG SIZE rcvd: 49
$ dig @192.168.254.100 foo0.example.com # no answer ;; Warning: Message parser reports malformed message packet. ; <<>> DiG 9.6.0-APPLE-P2 <<>> @192.168.254.100 foo0.example.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 42293 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; Query time: 2 msec ;; SERVER: 192.168.254.100#53(192.168.254.100) ;; WHEN: Sat Jan 22 12:52:17 2011 ;; MSG SIZE rcvd: 12
レスポンスflagsはdnsmasqの挙動に合わせた。再帰的な問い合わせをしないので、WARNINGが出ているが気にしなくて良い。