Resolv :: DNS无法解析192.168.x的PTR

时间:2014-11-21 12:03:57

标签: ruby dns resolv

这是我的测试代码:

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查找失败,而不是挖掘(以及如何修复?)

1 个答案:

答案 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