しょんぼり技術メモ

まいにちがしょんぼり

RubyでDNSを解決したりする

自分用メモ。Net::DNS(net-dns)

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'net/dns/resolver'
=> true
irb(main):003:0> require 'pp'
=> true

# 8.8.8.8(google public dns)を使って名前解決を行うインスタンスを生成
irb(main):004:0> res = Net::DNS::Resolver.new(:nameservers => "8.8.8.8")
=> ;; RESOLVER state:
;; retry_interval: 5    searchlist: []
;; ignore_truncated: false      domain: ""
;; retry_number: 4      nameservers: 8.8.8.8
;; packet_size: 512     recursive: true
;; tcp_timeout: 5       defname: true
;; config_file: /etc/resolv.conf        source_port: 0
;; log_file: #<IO:0xb7f84564>   dns_search: true
;; source_address: 0.0.0.0      udp_timeout: 5
;; port: 53     use_tcp: false
;;

# "www.hatena.ne.jp."を問い合わせる
irb(main):005:0> ret = res.query("www.hatena.ne.jp.", Net::DNS::A)
=> ;; Answer received from google-public-dns-a.google.com:53 (50 bytes)
;;
;; HEADER SECTION
;; id = 59791
;; qr = 1       opCode: QUERY   aa = 0  tc = 0  rd = 1
;; ra = 1       ad = 0  cd = 0  rcode = NoError
;; qdCount = 1  anCount = 1     nsCount = 0     arCount = 0

;; QUESTION SECTION (1 record):
;; www.hatena.ne.jp.            IN      A

;; ANSWER SECTION (1 record):
www.hatena.ne.jp.       443     IN      A       59.106.108.86

# 戻り値はNet::DNS::Packetクラスのインスタンス
irb(main):006:0> ret.class
=> Net::DNS::Packet

# answerに回答が格納されている(配列)
irb(main):007:0> ret.answer
=> [www.hatena.ne.jp.       443     IN      A       59.106.108.86]
irb(main):008:0> ret.answer.class
=> Array
irb(main):009:0> ret.answer[0]
=> www.hatena.ne.jp.       443     IN      A       59.106.108.86

# 配列の各要素は Net::DNS::RRのサブクラス。応答の種類によりクラスが異なる
irb(main):010:0> ret.answer[0].class
=> Net::DNS::RR::A
irb(main):011:0> ret.answer[0].to_s
=> "www.hatena.ne.jp.       443     IN      A       59.106.108.86"

# Aレコード応答の場合、addressで解決したアドレスを参照できる。
irb(main):012:0> ret.answer[0].address
=> #<IPAddr: IPv4:59.106.108.86/255.255.255.255>
irb(main):013:0> ret.answer[0].address.to_s
=> "59.106.108.86"