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