Dnsruby試した

RubyでDynamicDNSサーバに対してNsupdateするのに、pNet-DNSというライブラリを使ってきたのですが
Rubyforgeのページを見ると、A direct port of the perl Net::DNS project - this project has been discontinued. PLEASE USE DNSRUBY INSTEAD!って記述があったので、
dnsrubyをインストールして試して見ました。

インストール

rubygemでインストール(fastthreadが使える場合内部で呼び出しているので一緒にインストールした方がいいです)

$ sudo gem install dnsruby
$ sudo gem install fastthread

※最初仕事用のPCにインストールしたとき、なぜか同一バージョンのfastthreadが重複して入ってしまっておりrequire 'dnsruby'したときにエラーが発生しましたが、
その場合は、fastthreadの全削除、再インストールで直りました。

AXFR

とりあえずゾーン転送で全内容表示

サーバの設定としては、

  • Bindのポートはデフォルトではない
  • TSIG鍵による認証
#!/usr/bin/env ruby
# coding: utf-8
# zt.rb

require 'pp'
require 'rubygems'
require 'dnsruby'

# Model find
zt = Dnsruby::ZoneTransfer.new.tap do |ins|
  ins.server = "10.1.1.1"
  ins.port = "10053"
  ins.tsig = "nsupdate.example.com.", "WImSObCU+ClK7Ol8wWSDo6AkeR6kBtGp8CUPSBpKBSc1yA2ODpcye7vryKzIMqBjELzRsHjWJACyfgs+b7qUnA=="
end

%w[nsupdate.example.com int.nsupdate.example.com].each do |zone|
  puts "#{zone} -------------------------------------------------------------"
  result = zt.transfer(zone)
  puts "Record Total: #{result.size}"

  result.each do |r|
    rrset = "#{r.name} #{r.ttl} #{r.klass} #{r.type}"
    rrset = [rrset, r.type != "SOA" ? "#{r.rdata}": r.rdata.map {|x| "#{x}" }.join(' ')].join(' ')
    puts rrset
  end
end

digコマンド風に表示

$ ruby zt.rb
-------- nsupdate.example.com ---------------------------------------------------
Record Total: 9
nsupdate.example.com 10 IN SOA dns.nsupdate.example.com root.nsupdate.example.com 1970010102 20 2 86400 60
nsupdate.example.com 10 IN NS dns.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-001.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-002.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-003.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-004.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-005.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-006.nsupdate.example.com
foo.nsupdate.example.com 3600 IN A 1.2.3.4
-------- int.nsupdate.example.com ---------------------------------------------------
Record Total: 8
int.nsupdate.example.com 10 IN SOA dns.nsupdate.example.com root.int.nsupdate.example.com 1970010100 20 2 86400 60
int.nsupdate.example.com 10 IN NS dns.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-001.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-002.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-003.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-004.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-005.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-006.nsupdate.example.com

Nsupdate

なにかレコードを更新してみます。

#!/usr/bin/env ruby
# coding: utf-8
# nsupdate.rb

require 'pp'
require 'rubygems'
require 'dnsruby'

res = Dnsruby::Resolver.new(:nameservers => ["10.1.1.1"], :port => "10053")
res.tsig = "nsupdate.example.com.", "WImSObCU+ClK7Ol8wWSDo6AkeR6kBtGp8CUPSBpKBSc1yA2ODpcye7vryKzIMqBjELzRsHjWJACyfgs+b7qUnA=="

update = Dnsruby::Update.new("nsupdate.example.com")
update.add("bar.nsupdate.example.com", "A", 3600, "1.2.3.4")
update.delete("foo.nsupdate.example.com")

begin
  reply = res.send_message(update)
rescue => e
  pp e
end

bar.nsupdate.example.comを追加して、foo.nsupdate.example.comを削除しました。
シリアル番号も更新されてますね。

$ ruby nsupdate.rb
$ ruby zt.rb
-------- nsupdate.example.com ---------------------------------------------------
Record Total: 9
nsupdate.example.com 10 IN SOA dns.nsupdate.example.com root.nsupdate.example.com 1970010103 20 2 86400 60
nsupdate.example.com 10 IN NS dns.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-001.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-002.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-003.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-004.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-005.nsupdate.example.com
nsupdate.example.com 10 IN NS dns-006.nsupdate.example.com
bar.nsupdate.example.com 3600 IN A 1.2.3.4
-------- int.nsupdate.example.com ---------------------------------------------------
Record Total: 8
int.nsupdate.example.com 10 IN SOA dns.nsupdate.example.com root.int.nsupdate.example.com 1970010100 20 2 86400 60
int.nsupdate.example.com 10 IN NS dns.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-001.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-002.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-003.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-004.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-005.nsupdate.example.com
int.nsupdate.example.com 10 IN NS dns-006.nsupdate.example.com