这是我的测试代码:
require 'resolv'
puts `dig @172.17.0.40 -x 203.208.60.1 +short`
puts `dig @172.17.0.40 -x 192.168.12.100 +short`
resolver = Resolv::DNS.new(
:nameserver => ['172.17.0.40'],
:search => ['example.com'],
:ndots => 1
)
puts resolver.getname('203.208.60.1')
puts resolver.getname('192.168.12.100')
运行上述脚本会导致:
crawl-203-208-60-1.googlebot.com.
asdf.example.com.
crawl-203-208-60-1.googlebot.com
/home/jskarpet/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/resolv.rb:431:in `getname': DNS result has no information for 192.168.12.100 (Resolv::ResolvError)
from ruby.rb:14:in `<main>'
为什么使用Resolv查找失败,而不是挖掘(以及如何修复?)
答案 0 :(得分:0)
在将DNS服务器从Debian Wheezy升级到Debian Jessie之后,我今天遇到了同样的问题。突然我得到了:
/usr/lib/ruby/2.1.0/resolv.rb:431:in `getname': DNS result has no information for 192.168.12.100 (Resolv::ResolvError)
我碰巧注意到IN-ADDR.ARPA中不熟悉的大写字母:
$ host 192.168.12.100
100.12.168.192.IN-ADDR.ARPA domain name pointer asdf.example.com.
$
对于较旧的DNS服务器,它是:
$ host 192.168.12.100
100.12.168.192.in-addr.arpa domain name pointer asdf.example.com.
$
即使使用新服务器,外部IP示例仍然具有小写字母:
$ host 203.208.60.1
1.60.208.203.in-addr.arpa domain name pointer crawl-203-208-60-1.googlebot.com.
$
我注意到该测试用例适用于Ruby 2.3。 resolv.rb库是Pure Ruby,而2.3版现在只能在Ruby 2.1上运行,但可以通过测试用例。这样就可以轻松地跟踪到以下有效成分:
https://git.ruby-lang.org/ruby.git/commit/lib/resolv.rb?id=69a7bb31f917bd68d78460216aa2ef274428790e
...这可能是解决问题的关键所在
https://bugs.ruby-lang.org/issues/10550(当名称服务器以与查询不同的方式返回时,Resolv :: DNS.getaddresses不返回IP)
我通过猴子补丁修复了它,从而可以修复Ruby 1.8.7、1.9.3和2.1.0,而剩下的2.3.3可以正常工作了:
require "resolv"
class Resolv
class DNS
class Name
if Resolv::DNS::Name.new("in-addr.arpa".split(".")) != Resolv::DNS::Name.new("IN-ADDR.ARPA".split("."))
def ==(other)
return false unless @absolute == other.absolute?
return @labels.join('.').casecmp(other.to_a.join('.')).zero?
end
end
end
end
end