ズンドコウェーブにのってインフラエンジニアらしくズンドコネームサーバを作ってみました。
#仕様
*.zunの応答は127.0.0.1
*.dokoの応答は
・直前の.zunドメインへの問い合わせが4回以上連続した場合CNAMEとして*.kiyosiを返す
・それ以外127.0.0.1
$ dig foo.zun
127.0.0.1
$ dig foo.doko
foo.kiyoshi
みたいな感じ
#準備
rubyの標準クラスではDNSサーバ機能がないためrubydnsを利用します。
$ gem install rubydns
コード
zundokoNameSystem.rb
require 'resolv'
require 'rubydns'
Interfaces = [
[:udp, "0.0.0.0", 5300],
[:tcp, "0.0.0.0", 5300]
]
zun_counter = 0
RubyDNS::run_server(:listen =>Interfaces) do
match(/\.zun$/, Resolv::DNS::Resource::IN::A) do |transaction|
zun_counter += 1
transaction.respond!("127.0.0.1", resource_class: Resolv::DNS::Resource::IN::A)
end
match(/.doko$/, Resolv::DNS::Resource::IN::A) do |transaction|
cname= transaction.name.gsub(/doko$/, "kiyoshi")
if zun_counter >= 4
transaction.respond!(Resolv::DNS::Name.create(cname), resource_class: Resolv::DNS::Resource::IN::CNAME)
else
transaction.respond!("127.0.0.1", resource_class: Resolv::DNS::Resource::IN::A)
end
zun_counter = 0
end
otherwise do |transaction|
transaction.fail!(:NXDomain)
zun_counter = 0
end
end
実行
サーバ起動
$ ruby zundokoNameSystem.rb
5300ポートで起動させているのでクライアント側でポートを指定してます。
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.doko
foo.kiyoshi.
日本語ドメイン対応は春休みの宿題ですw