Pull to refresh

Comments 31

Ты whois, давай до свидания…
Автору спасибо, много интересного из простой вещи.
Фундаментально! И читается как детектив.

Автору — респект.
Отличная статья. Самому всегда было лень разобраться, гугл не давал ответа, но теперь многие непонятности стали понятны.
Посмотрите на pwhois, фактически это обвязка для перлового модуля Net::Whois::Raw, про зону UA он точно знает, причём в нём есть whois-сервера и многих зон 3-го уровня:
COM.UA whois.com.ua
ORG.UA whois.com.ua
BIZ.UA whois.biz.ua
CO.UA whois.co.ua
PP.UA whois.pp.ua
KIEV.UA whois.com.ua
DN.UA whois.dn.ua
LG.UA whois.lg.ua
OD.UA whois.od.ua
IN.UA whois.in.ua

В федоре whois является ссылкой на jwhois, а иногда попадается что whois является ссылкой и на pwhois.
pwhois/Net::Whois::Raw посмотрел — благодарю за ссылку.

Он работает так же, как и Ruby Whois: огромный конфигурационный файл с хардкодом на все случаи жизни (порядка 70КБ). На CPAN последнее обновление — август 2012 года.

Пробуем примеры из моей статьи:

$ ./pwhois 8.8.8.8
[whois.arin.net]

Level 3 Communications, Inc. LVLT-ORG-8-8 (NET-8-0-0-0-1) 8.0.0.0 - 8.255.255.255
Google Incorporated LVLT-GOOGL-1-8-8-8 (NET-8-8-8-0-1) 8.8.8.0 - 8.8.8.255

$ ./pwhois russia.edu.ru
[whois.ripn.net]

No entries found for the selected source(s).

Last updated on 2013.01.15 18:21:31 MSK

Всего не захардкодить.

Что меня заинтересовало: захардкоджено много сообщений с разных серверов о том, что «Lookup quota exceeded». В Ruby Whois они тоже есть, но там информация раскидана по разных файлам (для каждого whois сервера), и ее трудно найти, а тут все в одном месте. Получается, что пользователей банят не только RIPE и AfriNIC, но и целый ряд других whois серверов (на практике я с этим раньше не встречался):

our %exceed = (
    'whois.eu' => '(?:Excessive querying, grace period of|Still in grace period, wait)',
    'whois.dns.lu' => 'Excessive querying, grace period of',
    'whois.mynic.net.my' => 'Query limitation is',
    'whois.ripn.net' => 'exceeded allowed connection rate',
    'whois.domain-registry.nl' => 'too many requests',
    'whois.nic.uk' => 'and will be replenished',
    'whois.networksolutions.com' => 'contained within a list of IP addresses that may have failed',
    'whois.worldsite.ws' => 'You exceeded the maximum',
    'whois.tucows.com'  => '(?:Maximum Daily connection limit reached|exceeded maximum connection limit)',
    'whois.centralnic.com'  => 'Query rate of \\d+',
    'whois.pir.org'  => 'WHOIS LIMIT EXCEEDED',
    'whois.nic.ms'   => 'Look up quota exceeded',
    'whois.nic.gs'   => 'look up quota exceeded',
    'whois.nic.tl'   => 'Lookup quota exceeded',
    'whois.nic.mg'   => 'Lookup quota exceeded',
    'whois.nic.li'   => 'You have exceeded this limit',
    'whois.nic.ch'   => 'You have exceeded this limit',
);
> pwhois russia.edu.ru

Если написать автору, то или прислать патч, то будет весьма оперативно добавлено.
Мои правки там тоже есть, например те же .*.ua сервера.
Дописал в статью несколько слов про pwhois.
И ещё одно:
если под рукой нет whois утилиты, при этом Вы знаете whois сервер, но не хотите писать для опроса свой скрипт, то можно для запроса использовать telnet:
$ telnet whois.com.ua 43
Trying 217.12.194.25…
Connected to whois.com.ua.
Escape character is '^]'.
% request from 1.2.3.4
% This is the Ukrainian Whois query server #F.
% The Whois is subject to Terms of use
% See hostmaster.ua/services/
%

kiev.ua <=== тут вводится имя домена

% % .UA whois
% Domain Record:
% =============
domain: kiev.ua
admin-c: UADM15-UANIC
tech-c: HOST-UANIC
dom-public: YES
nserver: sns-pb.isc.org
nserver: ho1.ns.kiev.ua
nserver: k.ns.com.ua
nserver: ba1.ns.ua
nserver: nix.ns.ua
remark: Public domain
remark: Kiev, Ukraine
created: 0-UANIC 19921202000000
changed: ST101-UANIC 20120726111700
source: UANIC

% Glue Record:
Да, для работы с whois в «ручном» режиме, telnet — это все, что требуется.

Более того, некоторые whois серверы поддерживают специальные параметры, которые через Unix-овый whois или другую утилиту передать не удается. Так что остается только telnet.

Например, параметр "-B" позволяет whois.ripe.net выводить поля «notify», «changed» и «e-mail», которые по-умолчанию не выводятся:

$ telnet whois.ripe.net 43
Trying 193.0.6.135...
Connected to whois.ripe.net.
Escape character is '^]'.
% This is the RIPE Database query service.
% The objects are in RPSL format.
%
% The RIPE Database is subject to Terms and Conditions.
% See http://www.ripe.net/db/support/db-terms-conditions.pdf

-B 213.180.204.0                    <<<<< обратите внимание на "-B"
% Information related to '213.180.204.0 - 213.180.204.255'

inetnum:        213.180.204.0 - 213.180.204.255
netname:        YANDEX-213-180-204
descr:          Yandex enterprise network
country:        RU
admin-c:        YNDX1-RIPE
tech-c:         YNDX1-RIPE
remarks:        INFRA-AW
status:         ASSIGNED PA
mnt-by:         YANDEX-MNT
changed:        artem@yandex-team.ru 20091116          <<<<< дополнительное поле
source:         RIPE
...
Не будете ли вы столь щедры поделиться исходниками своего python модуля? Спасибо!
он же писал что код проприетарный. Лучше воспользоваться тем же Net::Whois::Raw. Там всё открыто. Строк больше, но и функций тоже.
Модуль писался для коммерческого проекта, поэтому код, к сожалению, проприетарный. Однако все, что в нем было, я постарался описать в статье.
Редкая статья на хабре нынче так радует. Было очень приятно почитать, спасибо.
rdap.org/ — частично многие данные можно уже получить в JSON формате. Это наработки WIERDS рабочей группы, которая разрабатывает замену WHOIS, используя restfull интерфейс.
Все-таки при поиске IP, лучше сразу опрашивать IANA, а не ARIN. Это из личного опыта. Тоже в свое время страдал этой проблемой, когда делал этот инструмент (IP whois only)
Возможно. Я первым спрашиваю ARIN из следующих соображений: 1. за большинство выделенных IP (и за подавляющее большинство IP, которые могут интересовать потенциальных пользователей нашего продукта) отвечает именно ARIN. 2. ARIN никого не банит.

Если бы сайт был в рунете (где за все IP адреса отвечает RIPE), вероятно, опрашивать ARIN первым имело бы меньше смысла.
IANA во всей иерархии — высший орган. Именно эта организация отвечает за распределение блоков региональным реестрам. ARIN лишь один из них. Поэтому запрос к whois IANA всегда будет возвращать реферал на нужный RIR. Проблем с баном пока не было.
Идея в том, чтобы минимизировать число возможных запросов (а значит и время ожидания пользователя).

Если я обращаюсь к ARIN, то (условно) в 75% случаев я получу требуемый результат с первого же запроса, в 24% случаев со второго (ARIN почти всегда указывает на правильный региональный сервер) и в 1% случаев с третьего или больше. Если же я обращаюсь к IANA, то мне всегда надо будет делать минимум два запроса. Минимум — потому что IANA тоже не всегда указывает на актуальный сервер. Например:

$ whois -h whois.iana.org 213.154.64.0

refer:        whois.ripe.net

inetnum:      213.0.0.0 - 213.255.255.255
organisation: RIPE NCC
status:       ALLOCATED

whois:        whois.ripe.net

changed:      1993-10
source:       IANA


Если теперь обратиться к RIPE, то окажется, что IP адрес переделегирован AfriNIC, о чем IANA не знала. Стоит отметить, что ARIN также указывает на RIPE.
Я понимаю, что вы так оптимизируете для своего частного случая. Я же говорю — в целом, имело бы смысл начинать с IANA, для общего случая. Комметнарии читают и другие и не все ориентируются именно на ARIN. Плюс ко всему, в APNIC делегирование происходит национальным регистрам — JPNIC, KRNIC и т.д. — их там довольно много, я еще сам у себя не все сделал. В целом, для общего случая, если речь идет о равности всех клиентов, то лучше начинать сверху и идти вниз, не взирая на лишний запрос.
Респект за статью. Давно хотел разобраться как же работает этот самый whois. Было много вопросов, но никак не было времени. Теперь все более менее понятно.
Есть ли возможность узнать количество всех записей (проданных доменов) в каком-либо домене верхнего уровня? (нужен домен .tv, сервер tvwhois.verisign-grs.com)
Через протокол whois — точно нет. Возможно, такая информация есть на сайтах некоторых регистраторов. Ну или кто-то достал такую статистику и еще где-то выложил.
Есть маленькая тулза для определения whois серверов доменных зон и whois произвольного домена в каждой из выбранных зон. Написана на PHP, может кому пригодится: github.com/noys/ianacheck
В чем именно была проблема с зоной .gr? Я уже точно не помню, но вроде бы 2.5 года назад (на момент написания статьи) ее не было. Хотя с некоторыми зонами они действительно были нерешаемые: если информация доступна только на вебе с каптчей, то вряд ли что-то можно придумать.

Благодарю!
Да, именно такая ситуация с gr — веб и каптча.

За статью спасибо, очень помогло )

ps. точнее решение есть, но надо становиться регистратором (вроде как). а это наверное слегка затратно.
Спасибо. Долго искал информацию про эту мудреную конструкцию:
$ whois -h whois.nic.name 'domain = d-n-s.name'
Статья очень интересная, как кто-то говорил выше — целый детектив

А может ли кто-то поделится информацией об этой теме с точки зрения регистратора?
Я так понимаю к регистраторам должны так же быть какие-то требования…
Может есть более простой подход?
Only those users with full accounts are able to leave comments. Log in, please.