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

ルーティングテーブルはArduinoSRAMに格納する。僕が持っている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が出ているが気にしなくて良い。