Обратный поиск DNS в Ruby

Выполнение обратного поиска IP в Ruby.

Обратный поиск DNS иногда называется обратным поиском IP потому, что вы начинаете с IP-адреса и используете его для поиска доменного имени. К примеру, если вы имеете IP-адрес 66.249.64.10, обратный поиск DNS должет возвратить следующее имя crawl-66-249-64-10.googlebot.com.

Вы так же можете встретить такие названия как разборка DNS, обратный поиск PTR или обратный поиск указателя DNS. Все эти названия - синонимы.

Так как обратный поиск DNS является частой задачей, много языков программирования уже имеют библиотеки, который поддерживают поиск DNS по IP адресу. Мы опишим только Ruby.

Обратный поиск DNS в Ruby

Ruby имеет несколько модулей(gem-ов), которые можно использовать для обратного поиска, но я предпочитаю resolv потому, что эта библиотека встроена в стандартную библиотеку Ruby и она проста в использовании.

Просто используйте интуитивно понятный метод, который называется getname:

Обратный поиск DNS в ruby с использованием ‘resolv’

require 'resolv'
reversed_dns = Resolv.new.getname('203.208.60.1')
# "crawl-203-208-60-1.googlebot.com"

Если resolv вам не подходит, тогда для вас есть и другие альтернативы. К примеру, dnsruby и net-dns также являются очень крутыми библиотеками DNS.

Поиск IP в ruby с использованием ‘resolv’

Если вы хотите найти IP-адрес по имени хоста тогда вам нужно использовать функцию getaddress:

require 'resolv'
Resolv.new.getaddress("crawl-203-208-60-1.googlebot.com")
# '203.208.60.1'

Зачем это нужно

К примеру вы хотите заблокировать доступ пользователей к файлу sitemap.xml, но хотите чтобы гугл бот имел доступ к этому файлу, тогда вам нужно будет осуществить обратный поиск DNS и проверить содержит ли имя хоста .googlebot.com.

Пример:

def reverse_dns_lookup
      begin
        user_ip = request.remote_ip
        dns = Resolv.new.getname(user_ip)
        unless dns.blank? || dns.include?('googlebot.com')
          raise ActionController::RoutingError.new('Page not found')
        end
        dns_address = Resolv.new.getaddress(dns)
        unless dns_address.blank? || dns_address == user_ip
          raise ActionController::RoutingError.new('Page not found')
        end
      rescue => e
        raise ActionController::RoutingError.new('Page not found')
      end
    end
Тема: 
LikeMe: