1

这是我的测试代码:

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

4

1 回答 1

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 库是纯 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
于 2019-05-26T00:57:02.280 回答