ICANN закрывает WHOIS: что важно знать уже сейчас

ICANN закрывает WHOIS: что важно знать уже сейчас

Подробное руководство по переходу: примеры, скрипты и готовые решения.

image

Когда‑то WHOIS был главным способом узнать, кому принадлежит домен или IP‑подсеть. Однако время не щадит даже интернет‑протоколы: открытый текст, неоднородный синтаксис, отсутствие авторизации и полное игнорирование требований конфиденциальности в эпоху GDPR — вот лишь часть наследственных болей WHOIS. Новая глава началась 28 января 2025 года, когда ICANN официально объявила RDAP единственным обязательным механизмом доступа к регистрационным данным, а WHOIS отправила «на пенсию».

Эта статья — подробная инструкция: от эволюции идей до живых скриптов и встраивания RDAP в веб‑панель. Читается легко, но даёт достаточно фактуры, чтобы убедить даже строгого аудитора.

Введение: как WHOIS дошёл до жизни такой

WHOIS появился в 1982‑м, когда ARPANET нумеровали на салфетке. Формат не менялся десятилетиями: TCP‑порт 43, plain‑text‑вывод, каждый регистратор придумывал собственные подписи полей. С ростом интернета проблемы множились:

  • Несовместимость — поле Registrar: у одного, Sponsoring Org — у другого.
  • Отсутствие шифрования — TLS для порта 43 никто не прикручивал.
  • Сложность парсинга — регулярки ломались при каждом редизайне ответа.
  • GDPR — массово скрыли адреса и телефоны; структуировать данные стало невозможно.

На скриншоте ниже — типичный «хаос» WHOIS рядом с лаконичным JSON‑ответом RDAP. (Если читаете офлайн, попробуйте сами: whois nic.ru vs curl ‑s https://rdap.org/domain/nic.ru | jq.)

Что такое RDAP

Registration Data Access Protocol рождён рабочей группой IETF REGEXT в 2015 году и описан семейством RFC 7480‑7485. Ключевые идеи:

  • REST + HTTPS вместо порта 43.
  • Строгий JSON‑схема — элементарно валидируется, легко парсится.
  • Bootstrap‑файлы IANA — клиенту достаточно загрузить таблицу, чтобы понять, к какому серверу идти за .рф или ARIN‑овским IP.
  • Поддержка OAuth/JWT — можно отдать публичные данные всем, а расширенные — только проверенным партнёрам.
  • Расширяемость — через JSON‑расширения и HTTP‑заголовки без «ломания» старых клиентов.

Диаграмма маршрута RDAP‑клиента

1) Клиент запрашивает bootstrap‑файл IANA. 2) По TLD «.by» файл сообщает URL сервера https://rdap.cctld.by/. 3) Клиент делает стандартный GET /domain/example.by.

Bootstrap‑файлы хранятся публично и регулярно обновляются IANA.

Быстрый старт за 3 минуты

Нужны только 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 раз в сутки — и больше не пропускаем критическое продление.

Мониторинг NS‑записей

RDAP уже содержит блок nameservers; сравниваем с эталоном и шлём уведомление, если кто‑то тайно сменил NS.

Сценарии для сетевого инженера и аналитика безопасности

В расследованиях важно быстро понять: кто владелец IP‑сегмента? какой AS? куда жаловаться на абузу?

Python‑функция «IP → ASN → контакт»

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.

React‑сниппет «Проверка занятости домена»

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 vs RDAP

Критерий WHOIS RDAP
Транспорт TCP :43, без TLS HTTPS
Формат Plain text JSON
Авторизация Нет OAuth 2.0 / JWT
Поиск Глобального нет Предусмотрен фильтр search*
Пагинация link rel="next"
Расширяемость Только комментарии JSON‑Extensions

Интеграция и автоматизация

Большинство коммерческих регистратур ограничивает 60–100 запросов в мину‑ту. RDAP‑ответ содержит заголовок Retry‑After; уважаем его и кешируем ответы.

Мини‑API на Flask + Redis

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.

Комбинирование RDAP с DNSSEC и DNS over HTTPS

Сама по себе запись регистрации мало что значит, если злоумышленник подменил зону по дороге. Поэтому «цепочка доверия» выглядит так:

  1. Запрашиваем A‑запись домена через DoH — защищена HTTPS‑транспортом.
  2. Проверяем RRSIG по DNSSEC — убеждаемся, что запись не подменена.
  3. Достаём RDAP — убеждаемся, что домен действительно принадлежит ожидаемой компании.

Граф инцидента в SOAR‑системе легко строится: на входе подозрительный домен, на выходе — отчёт DoH + RRSIG + RDAP JSON. Подписываете PDF и к передаче в law enforcement!

Будущее и политика

Глобальные договора ICANN 2023 RA/RAA закрепили дату полного заката WHOIS ‑ 28 января 2025‑го.

Дальше обязательна только RDAP, а WHOIS — «по желанию». Для ccTLD процесс растянут:

  • .ru — пилот RDAP в Координационном центре заработал в конце 2024‑го; веб‑WHOIS останется до 2027 года как «чтение только».

  • .by / .бел — полнофунк‑циональный RDAP‑сервер rdap.cctld.by уже открыт, WHOIS планируют свернуть к 2026‑му.
  • .ua — RDAP опубликован на coordinator.ua/rdap, WHOIS закрывается по мере стабилизации инфраструктуры.

ICANN прогнозирует, что к концу 2027‑го все из 1 200+ TLD перейдут на RDAP как единственный источник регистрационных данных.

Заключение: чек‑лист перехода на RDAP

  • Поставьте curl и jq — убедитесь, что данные доступны в JSON.
  • Обновите monitoring‑скрипты: замените парсинг WHOIS на RDAP‑запросы.
  • Переведите внутренние сервисы на HTTPS + JWT, чтобы использовать авторизацию.
  • Кешируйте RDAP‑ответы (Redis, memcached) — сэкономите и уложитесь в rate‑limits.
  • Проверьте, поддерживает ли ваша ccTLD RDAP, и добавьте URL в bootstrap‑таблицу.
  • Зарегистрируйтесь на GitHub‑репо ICANN RDAP — там обновления схем и расширений.

29 мая в Москве — масштабное событие для тех, кто работает с Firebird.

Firebird Conf 2025 — одна из крупнейших конференций в своей сфере. Разработка, обмен опытом, обучение и живое общение.

Реклама.18+. ООО «РЕД СОФТ ЦЕНТР», ИНН 7727836231