Подробное руководство по переходу: примеры, скрипты и готовые решения.
Когда‑то WHOIS был главным способом узнать, кому принадлежит домен или IP‑подсеть. Однако время не щадит даже интернет‑протоколы: открытый текст, неоднородный синтаксис, отсутствие авторизации и полное игнорирование требований конфиденциальности в эпоху GDPR — вот лишь часть наследственных болей WHOIS. Новая глава началась 28 января 2025 года, когда ICANN официально объявила RDAP единственным обязательным механизмом доступа к регистрационным данным, а WHOIS отправила «на пенсию».
Эта статья — подробная инструкция: от эволюции идей до живых скриптов и встраивания RDAP в веб‑панель. Читается легко, но даёт достаточно фактуры, чтобы убедить даже строгого аудитора.
WHOIS появился в 1982‑м, когда ARPANET нумеровали на салфетке. Формат не менялся десятилетиями: TCP‑порт 43, plain‑text‑вывод, каждый регистратор придумывал собственные подписи полей. С ростом интернета проблемы множились:
Registrar:
у одного, Sponsoring Org
— у другого.
На скриншоте ниже — типичный «хаос» WHOIS рядом с лаконичным JSON‑ответом RDAP. (Если читаете офлайн, попробуйте сами: whois nic.ru
vs curl ‑s https://rdap.org/domain/nic.ru | jq
.)
Registration Data Access Protocol рождён рабочей группой IETF REGEXT в 2015 году и описан семейством RFC 7480‑7485. Ключевые идеи:
1) Клиент запрашивает bootstrap‑файл IANA. 2) По TLD «.by» файл сообщает URL сервера https://rdap.cctld.by/
. 3) Клиент делает стандартный GET /domain/example.by
.
Bootstrap‑файлы хранятся публично и регулярно обновляются IANA.
Нужны только curl
и jq
(есть в каждом пакете). Вставьте в терминал:
sudo apt install -y jq
curl -s https://rdap.org/domain/google.com | jq '.entities[] | {role: .roles[], contact: .vcardArray[1][3][3]}'
За пару секунд увидите JSON‑словари с главными контактами. Расширяйте фильтр jq
как угодно — это обычный машинно‑читаемый вывод.
Нравится графический интерфейс? Поставьте расширение «RDAP Client» для Chrome или Firefox — кликаете по домену и сразу получаете структурированные данные.
Python‑фанатам проще:
from rdap import RDAPClient
print(RDAPClient().get_domain('example.org'))
Админы чаще всех держат руку на пульсе доменных продлений, смены NS и нештатных ситуаций. RDAP закрывает эти задачи без краулеров и парсинга текста.
#!/usr/bin/env bash
domain=$1
exp_date=$(curl -s https://rdap.org/domain/$domain | jq -r '
.events[] | select(.eventAction=="expiration") | .eventDate')
days_left=$(( ( $(date -d "$exp_date" +%s) - $(date +%s) ) / 86400 ))
if [[ $days_left -lt 30 ]]; then
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"⚠️ $domain expires in $days_left days ($exp_date)\"}" \
https://hooks.slack.com/services/T000/B000/KEY
fi
Скрипт добавляем в cron раз в сутки — и больше не пропускаем критическое продление.
RDAP уже содержит блок nameservers
; сравниваем с эталоном и шлём уведомление, если кто‑то тайно сменил NS.
В расследованиях важно быстро понять: кто владелец IP‑сегмента? какой AS? куда жаловаться на абузу?
import ipaddress, requests, sys
def enrich_ip(ip):
ip_obj = ipaddress.ip_address(ip)
rdap_url = f'https://rdap.org/ip/{ip_obj}'
data = requests.get(rdap_url, timeout=5).json()
asn = data.get('handle')
org = data.get('name')
abuse = next((e['vcardArray'][1][3][3]
for e in data['entities']
if 'abuse' in e['roles']), 'n/a')
return {'asn': asn, 'org': org, 'abuse': abuse}
print(enrich_ip(sys.argv[1]))
Код возвращает JSON вроде:
{"asn": "AS15169", "org": "GOOGLE", "abuse": "network-abuse@google.com"}
RDAP удобно встраивается в панели регистрации или CMS. Всё, что нужно, — обычный fetch
.
import {useState} from 'react';
export default function DomainCheck() {
const [name, setName] = useState('');
const [status, setStatus] = useState(null);
async function check() {
const res = await fetch(`https://rdap.org/domain/${name}`);
if (res.status === 404) {
setStatus('Свободен ????');
return;
}
const json = await res.json();
const s = json.status.includes('active') ? 'Занят ????' : json.status.join(', ');
setStatus(s);
}
return (
<div className="p-4 rounded-xl shadow-lg">
<input value={name} onChange={e=>setName(e.target.value)}
placeholder="example.by" className="border p-2"/>
<button onClick={check} className="ml-2 px-3 py-2 bg-blue-600 text-white rounded-lg">
Проверить
</button>
{status && <p className="mt-3">{status}</p>}
</div>
);
}
Критерий | WHOIS | RDAP |
---|---|---|
Транспорт | TCP :43, без TLS | HTTPS |
Формат | Plain text | JSON |
Авторизация | Нет | OAuth 2.0 / JWT |
Поиск | Глобального нет | Предусмотрен фильтр search* |
Пагинация | – |
link rel="next"
|
Расширяемость | Только комментарии | JSON‑Extensions |
Большинство коммерческих регистратур ограничивает 60–100 запросов в мину‑ту. RDAP‑ответ содержит заголовок Retry‑After
; уважаем его и кешируем ответы.
from flask import Flask, jsonify
import redis, requests, time
r = redis.Redis()
app = Flask(__name__)
@app.route('/rdap/<path:q>')
def proxy(q):
cache = r.get(q)
if cache:
return jsonify(eval(cache))
data = requests.get(f'https://rdap.org/{q}', timeout=5).json()
r.setex(q, 3600, repr(data))
return jsonify(data)
if __name__ == '__main__':
app.run()
Добавьте JWT‑проверку в декоратор — получаете внутренний микросервис, который вообще не зависит от формата WHOIS.
Сама по себе запись регистрации мало что значит, если злоумышленник подменил зону по дороге. Поэтому «цепочка доверия» выглядит так:
RRSIG
по DNSSEC — убеждаемся, что запись не подменена.Граф инцидента в SOAR‑системе легко строится: на входе подозрительный домен, на выходе — отчёт DoH + RRSIG + RDAP JSON. Подписываете PDF и к передаче в law enforcement!
Глобальные договора ICANN 2023 RA/RAA закрепили дату полного заката WHOIS ‑ 28 января 2025‑го.
Дальше обязательна только RDAP, а WHOIS — «по желанию». Для ccTLD процесс растянут:
rdap.cctld.by
уже открыт, WHOIS планируют свернуть к 2026‑му. coordinator.ua/rdap
, WHOIS закрывается по мере стабилизации инфраструктуры. ICANN прогнозирует, что к концу 2027‑го все из 1 200+ TLD перейдут на RDAP как единственный источник регистрационных данных.
curl
и jq
— убедитесь, что данные доступны в JSON.