Skip to content

About

A tool for scanning and resolving DNS names into IP addresses

Resources

Stars

837 stars

Watchers

23 watching

Forks

Repository files navigation

Domain Mapper

Что нового (нажать, чтобы открыть)
  • Новая агрегация IP-адресов вместо режимов 16, 24 и mix: exact склеивает соседние адреса без потерь, а лимит числа маршрутов (subnet = 1000) при том же числе строк захватывает в 2–5 раз меньше лишних адресов, чем прежний mix.
  • Списки доменов сервисов обновляются автоматически дважды в месяц из v2fly/domain-list-community и runetfreedom/russia-v2ray-rules-dat. Добавлен сервис Meta, WhatsApp переведён на собственный список.
  • Большое обновление:
    • Код переработан: общий пакет domainmapper, меньше потребление памяти, одинаковые домены из разных сервисов проверяются один раз.
    • Новый механизм ограничения запросов: общий лимит на все DNS-серверы (total_rate_limit), лимит на каждый сервер с автоматическим снижением частоты при таймаутах (rate_limit), повтор запросов, на которые сервер не ответил. Сбоев практически нет, а при выборе одного-двух серверов сканирование стало быстрее.
    • В отчёте домены без A-записи отделены от настоящих сбоев.
    • Новый прогресс-бар: обновляется непрерывно, показывает скорость, число сбоев и точную оценку оставшегося времени, подстраивается под ширину окна.
    • Обновлён список DNS-серверов. Добавлены сервисы Linkedin, Disney+, Eufy, Petlibro, TMDB.
    • Для Windows — готовая программа DomainMapper.exe, Python больше не нужен. Старые команды запуска через Win.bat продолжают работать и теперь скачивают DomainMapper.exe. Файлы настроек читаются и в UTF-8, и в кодировке Windows.
    • Docker-образ собирается на базе python:3.12-slim, результаты сохраняются в отдельную папку.
    • Утилита split удалена: большие файлы делит на части сам Domain Mapper.
  • Реворк работы с DNS серверами. Прогрессбар. Разделение файла на части для некоторых форматов. Обновлена утилита Convert.
  • Keenetic BAT формат сохранения. Небольшие изменения в интерфейсе. Некоторые доработки/улучшения.
  • Добавлены некоторые онлайн кинотеатры. Запрос @Andrey_schumacher
  • Добавлены списки от ITDog.
  • Добавлен сервис xBox. Запрос @Deni5c
  • Запуск в докере. Запрос @andrejs82git, Реализация @MrEagle123
  • Опция в config.ini: не добавлять comment="%SERVICE_NAME%" при сохранении IP-адресов в mikrotik формате. Запрос @ITNetSystem
  • Изменена кодировка файла результатов на UTF-8 без BOM. Запрос @Savanture
  • Конвертер маршрутов как отдельная утилита. Запрос @Andrey999r
  • Добавлен сервис Jetbrains. Запрос @SocketSomeone
  • Добавлен сервис Discord. Запрос @AHuMex
  • Комбинированный режим объединения IP-адресов в подсеть.
  • Возможность загрузки списков сервисов и DNS-серверов из локального файла. Запрос @Noksa
  • Вспомогательные утилиты для поиска субдоменов.
  • Добавлен сервис Twitch. Запрос @shevernitskiy
  • Добавлен Yandex DNS сервер. Запрос @Noksa
  • Опция в config.ini: отключить отображение сведений о загруженной конфигурации.
  • Передача имени конфигурационного файла ключом в терминале/командной строке. Запрос @Noksa
  • Добавлен сервис Github Copilot. Запрос @aspirisen
  • Keenetic CLI формат сохранения. Запрос @vchikalkin
  • Wireguard формат сохранения. Запрос @sanikroot
  • Агрегация маршрутов до /24, /16. Запрос @sergeeximius
  • OVPN формат сохранения. Запрос @SonyLo
  • Mikrotik формат сохранения. Запрос @Shaman2010

Описание: Инструмент на языке Python, предназначенный для разрешения DNS имен популярных веб-сервисов в IP-адреса и сохранения их в виде готовых маршрутов или списков для роутеров, VPN и операционных систем.

Поддерживаемые сервисы (нажать, чтобы открыть)

Названия указаны так, как они отображаются в меню. В config.ini их можно писать в любом регистре.

  • Antifilter community edition
  • ITDog Inside
  • ITDog Outside
  • Youtube
  • Anthropic
  • Linkedin
  • Facebook
  • Meta
  • Openai
  • Tik-Tok
  • Instagram
  • Twitter
  • Netflix
  • Bing
  • Adobe
  • Apple
  • Google
  • Torrent Trackers
  • Search engines
  • Github Copilot
  • Twitch
  • Discord
  • Jetbrains
  • Xbox
  • Telegram
  • WhatsApp
  • Online movie theaters
  • Windsurf
  • Roblox
  • Zscaler
  • Disney+
  • Eufy
  • Petlibro
  • TMDB
  • Custom DNS list — личный список (см. раздел «Личный список доменов»)
Используемые DNS-серверы (нажать, чтобы открыть)

Номер — это значение для параметра dnsserver в config.ini.

№ Сервер Адреса
0 Все перечисленные ниже —
1 Системный DNS из настроек ОС
2 Google Public DNS 8.8.8.8, 8.8.4.4
3 Quad9 9.9.9.9, 149.112.112.112
4 Cloudflare DNS 1.1.1.1, 1.0.0.1
5 OpenDNS 208.67.222.222, 208.67.220.220
6 AdGuard DNS (без фильтрации) 94.140.14.140, 94.140.14.141
7 Control D (без фильтрации) 76.76.2.0, 76.76.10.0
8 CleanBrowsing (Security) 185.228.168.9, 185.228.169.9
9 UltraDNS Public 64.6.64.6, 64.6.65.6
10 NextDNS 45.90.28.0, 45.90.30.0
11 Yandex DNS 77.88.8.8, 77.88.8.1

Список загружается из файла dnsdb этого репозитория (или с диска в локальном режиме).

Функции:

  • Преобразование доменных имен популярных сервисов в IP-адреса.
  • Агрегация маршрутов: склейка соседних адресов без потерь или ограничение числа маршрутов с минимальным захватом лишних адресов.
  • Фильтрация IP-адресов Cloudflare (опционально).
  • Множество форматов сохранения результата.
  • Разделение больших файлов на части для формата Keenetic BAT.

Ключевые особенности:

  • Возможность выбора системного, публичного DNS-сервера или их комбинации.
  • Каждое доменное имя разрешается через каждый из выбранных DNS-серверов, поэтому собираются все IP-адреса, которые отдают разные серверы, а не только первый успешный ответ.
  • Автоматическое исключение дубликатов IP-адресов, а также "заглушек": 0.0.0.0, 127.0.0.1 и IP-адресов самих DNS-серверов.
  • Бережная нагрузка на сеть: общий лимит запросов ко всем DNS-серверам, лимит на каждый сервер с автоматическим снижением частоты при таймаутах и повторный запрос доменов, на которые сервер не ответил.
  • В отчёте отдельно показаны домены без A-записи (это нормальный ответ DNS) и настоящие сбои.
  • Работа в "тихом" режиме без взаимодействия с пользователем — все ответы можно задать в конфигурационном файле.
  • Запуск команды или программы по завершении работы.

Использование

Требуется Python 3.10 или новее. Для Windows есть готовая программа без установки Python — см. раздел «Для пользователей Windows».

  1. Скачайте репозиторий и перейдите в его папку:

    git clone https://github.com/Ground-Zerro/DomainMapper.git
    cd DomainMapper
  2. Установите зависимости:

    pip install -r requirements.txt
  3. При необходимости создайте config.ini на основе config.ini.example:

    cp config.ini.example config.ini
  4. Запустите скрипт:

    python main.py

Без config.ini скрипт по очереди спросит:

  1. сервисы — номера через пробел, 0 — все;
  2. DNS-серверы — номера через пробел, 0 — все;
  3. исключать ли IP-адреса Cloudflare;
  4. нужно ли объединять IP-адреса в подсети;
  5. формат сохранения и, если формат этого требует, шлюз, интерфейс или имя списка.

Результат сохраняется в файл domain-ip-resolve.txt в текущей папке.

Параметры config.ini (нажать, чтобы открыть)

Все параметры находятся в секции [DomainMapper]. Пустое значение означает, что скрипт спросит его у пользователя. Для параметров вида да/нет принимаются значения yes, y, on и no, n, off.

Параметр Значения Описание
service названия через запятую, all, custom Сервисы для проверки. all — все сервисы, custom — личный список. Регистр не важен.
dnsserver номера через пробел DNS-серверы из раздела «Используемые DNS-серверы», 0 — все, 1 — системный.
rate_limit число, по умолчанию 100 Максимум запросов в секунду к одному DNS-серверу. При таймаутах частота к серверу снижается автоматически и затем восстанавливается.
total_rate_limit число, по умолчанию 200 Максимум запросов в секунду ко всем DNS-серверам вместе. Уменьшите, если сбоев много (слабый роутер, мобильный интернет); увеличивать обычно бесполезно — при перегрузке сети сканирование только замедляется.
cloudflare yes / no Исключить IP-адреса Cloudflare из результата.
subnet число или exact Агрегация IP-адресов: максимальное число маршрутов или exact — без ограничения, см. раздел «Агрегация IP-адресов».
filetype ip, win, unix, keenetic bat, keenetic cli, cidr, mikrotik, ovpn, wireguard, amnezia Формат сохранения результата.
gateway IP или имя интерфейса Шлюз для форматов win и unix.
keenetic IP и/или имя интерфейса через пробел Шлюз для формата keenetic cli.
listname строка Имя address-list для формата mikrotik.
mk_comment on / off Добавлять comment="..." с названиями сервисов в формате mikrotik.
filename имя файла, по умолчанию domain-ip-resolve.txt Файл для сохранения результата.
localplatform yes / no Локальный режим для списков сервисов.
localdns yes / no Локальный режим для списка DNS-серверов.
cfginfo yes / no Показывать загруженную конфигурацию при запуске.
run команда Выполнить команду или запустить программу после завершения.

Если значение subnet или filetype не распознано, скрипт сообщит об этом и спросит его у пользователя. Если файл не найден, в нём нет секции [DomainMapper] или числовой параметр указан неверно, используются настройки по умолчанию.

Пример для работы без вопросов:

[DomainMapper]
service = youtube, telegram, custom
dnsserver = 1 2 4
cloudflare = yes
subnet = 1000
filetype = mikrotik
listname = vpn-routes
mk_comment = off
rate_limit = 100
total_rate_limit = 200
cfginfo = no
Ход проверки и отчёт (нажать, чтобы открыть)

Во время проверки отображается строка прогресса:

[█████████░░░░░░░░░░░░░░░░░░░]  22.8% | 1255/5500 | сбоев:    0 |   199 запр/с | прошло 00:06 | осталось ~00:23
  • 1255/5500 — выполнено DNS-запросов из общего числа (число доменов × число выбранных DNS-серверов);
  • сбоев — запросы, на которые DNS-сервер так и не ответил после повтора;
  • запр/с — текущая скорость за последние секунды;
  • осталось — оценка по самому медленному из выбранных серверов.

После проверки выводится отчёт:

  • Разрешено уникальных IP-адресов — сколько адресов попадёт в результат.
  • Домен не существует или нет A-записи — нормальный ответ DNS, а не ошибка: в списках сервисов встречаются устаревшие имена и имена только с IPv6/CNAME.
  • Сбоев: DNS-сервер не ответил / отказал в ответе — запросы, которые не удалось выполнить и после повторной попытки. Если их много, уменьшите total_rate_limit в config.ini.
  • Исключено IP-адресов 'заглушек' / Cloudflare — адреса, отброшенные фильтрами.

Как ограничиваются запросы:

  • не больше total_rate_limit запросов в секунду ко всем серверам вместе (по умолчанию 200) — это защищает роутер и канал от перегрузки;
  • не больше rate_limit запросов в секунду к одному серверу (по умолчанию 100); если сервер начинает не отвечать, частота к нему автоматически снижается, а затем восстанавливается;
  • каждый запрос ждёт ответа до 2 секунд на попытку и до 6 секунд всего; не ответившие домены запрашиваются повторно в конце проверки.
Форматы сохранения (нажать, чтобы открыть)
filetype Пример строки
ip 1.2.3.4
win route add 1.2.3.4 mask 255.255.255.255 GATEWAY
unix ip route 1.2.3.4/32 GATEWAY
keenetic bat route add 1.2.3.4 mask 255.255.255.255 0.0.0.0
keenetic cli ip route 1.2.3.4/32 GATEWAY auto !Youtube,Telegram
cidr 1.2.3.4/32
mikrotik /ip/firewall/address-list add list=LIST_NAME comment="Youtube,Telegram" address=1.2.3.4/32
ovpn push "route 1.2.3.4 255.255.255.255"
wireguard 1.2.3.4/32, 5.6.7.8/32, ... (одной строкой)
amnezia {"hostname": "1.2.3.4/32", "ip": ""} — JSON-файл для AmneziaVPN, сохраняется с расширением .json
  • Маска и префикс у каждой строки свои и зависят от агрегации, например 1.2.3.4/32, 1.2.3.0/24 или mask 255.255.255.0.
  • В формате keenetic bat файл делится на части по 999 строк, если строк больше: domain-ip-resolve_p1.txt, domain-ip-resolve_p2.txt и т.д.
  • В форматах keenetic cli и mikrotik в комментарий записываются названия выбранных сервисов.
  • Формат amnezia импортируется в AmneziaVPN: «Настройки» → «Раздельное туннелирование» → «Сайты» → меню ⋮ → «Импорт» (добавить к списку или заменить его). Режим — «Только адреса из списка должны открываться через VPN». Файл сохраняется как domain-ip-resolve.json: окно импорта AmneziaVPN показывает только файлы .json.
Агрегация IP-адресов (нажать, чтобы открыть)
subnet Результат
exact Без потерь: соседние адреса склеиваются в общую подсеть, только если заполняют её целиком (например, 1.2.3.4 и 1.2.3.5 → 1.2.3.4/31). Покрываются ровно найденные адреса, строк меньше.
число, например 1000 Не более указанного числа маршрутов. Адреса объединяются в подсети так, чтобы захватить как можно меньше лишних адресов: плотные группы адресов одного сервиса объединяются в первую очередь, одиночные адреса остаются /32.
  • Подсети не расширяются шире /16 (255.255.0.0), чтобы в маршруты не попадали огромные чужие диапазоны. Если лимит нельзя соблюсти без этого, сохраняется минимально возможное число маршрутов и выводится предупреждение.
  • Если значение не задано, скрипт спросит максимальное число маршрутов; Enter — без ограничения (exact).
  • Подбирайте лимит под ограничения роутера или VPN-клиента: например, по числу статических маршрутов Keenetic или длине AllowedIPs в WireGuard.
Локальный режим (нажать, чтобы открыть)

По умолчанию списки сервисов, доменов и DNS-серверов загружаются из этого репозитория на GitHub. В локальном режиме они читаются из файлов в папке со скриптом — так можно использовать свои списки.

Список сервисов — localplatform = yes. Используется файл platformdb, а также сами списки доменов.

  • Формат platformdb: название сервиса и путь к файлу со списком доменов через двоеточие и пробел.
  • Относительные пути отсчитываются от папки со скриптом. В локальном режиме файл читается с диска, в обычном — загружается из репозитория на GitHub по тому же пути.
  • Полный адрес http(s) всегда загружается из сети.

Пример:

Torrent Trackers: platforms/dns-ttrackers.txt
Twitch: platforms/service/dns-twitch.txt
WhatsApp: https://raw.githubusercontent.com/HybridNetworks/whatsapp-cidr/main/WhatsApp/whatsapp_domainlist.txt

Список DNS-серверов — localdns = yes. Используется файл dnsdb.

  • Формат: название DNS-сервера и один или несколько IP-адресов через пробел.

Пример:

SkyDNS: 77.88.8.8
AdGuard DNS: 94.140.14.140 94.140.14.141

Если локальный файл platformdb или dnsdb не найден, он загружается из сети.

Названия сервисов и номера DNS-серверов в config.ini должны соответствовать файлам platformdb и dnsdb. Номер 1 всегда занимает системный DNS, поэтому первый сервер из dnsdb получает номер 2.

Формат списка доменов: по одному домену на строку, пустые строки и строки, начинающиеся с #, пропускаются.

ab.chatgpt.com
api.openai.com
arena.openai.com

Указывать нужно доменное имя, а не URL: ab.chatgpt.com/login не будет разрешено.

Личный список доменов (нажать, чтобы открыть)
  • Создайте файл custom-dns-list.txt в текущей папке (из которой запускается скрипт) и запишите в него доменные имена по одному на строку (формат описан в разделе «Локальный режим»).
  • Список автоматически появится в меню последним пунктом под названием "Custom DNS list". В config.ini его можно выбрать значением custom.

Пример файла custom-dns-list.txt:

ab.chatgpt.com
api.openai.com
arena.openai.com
Запуск с другим файлом конфигурации (нажать, чтобы открыть)

Путь к конфигурационному файлу задаётся опцией -c (или --config). Без неё используется config.ini из текущей папки.

python main.py -c myconfig.ini
python main.py --config /etc/domainmapper/srv5.ini
Запуск в Docker (нажать, чтобы открыть)
curl -L -s "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/dm-docker.sh" > /tmp/dm-docker.sh && chmod +x /tmp/dm-docker.sh && sh /tmp/dm-docker.sh

Скрипт:

  • при необходимости устанавливает Docker и git (для Debian/Ubuntu, требуются права root);
  • клонирует или обновляет репозиторий в папку DomainMapper текущей директории;
  • собирает образ из Dockerfile на базе python:3.12-slim и запускает контейнер;
  • после завершения удаляет сам себя.

Результаты сохраняются в папку domainmapper-output в текущей директории. В эту же папку можно положить config.ini и custom-dns-list.txt до запуска.

Запуск уже собранного образа вручную:

docker run --rm -it -v "$(pwd)/domainmapper-output:/data" domainmapper
Для пользователей Windows (нажать, чтобы открыть)

Готовая программа DomainMapper.exe — Python устанавливать не нужно.

Запуск одной командой (программа скачивается в папку Загрузки и сразу запускается; результаты и config.ini — в той же папке):

  • в PowerShell:
$ProgressPreference='SilentlyContinue'; irm https://github.com/Ground-Zerro/DomainMapper/raw/refs/heads/main/Windows/DomainMapper.exe -OutFile "$HOME\Downloads\DomainMapper.exe"; cd "$HOME\Downloads"; .\DomainMapper.exe
  • в командной строке (cmd):
powershell -NoProfile -Command "$ProgressPreference='SilentlyContinue'; irm https://github.com/Ground-Zerro/DomainMapper/raw/refs/heads/main/Windows/DomainMapper.exe -OutFile '%USERPROFILE%\Downloads\DomainMapper.exe'" && cd /d "%USERPROFILE%\Downloads" && DomainMapper.exe

Повторный запуск той же командой скачивает актуальную версию программы.

Подробности в директории Windows репозитория.

Вспомогательные утилиты (нажать, чтобы открыть)

В директории utilities:

  • convert — конвертер готового списка IP-адресов в маршруты (те же форматы и агрегация, что и в Domain Mapper);
  • extract_apex_domains — извлечение доменов первого уровня из списков сервисов;
  • subdomain — поиск субдоменов через rapiddns.io;
  • verified — проверка активности доменов.

☕ Поддержка

Если проект оказался Вам полезен — можно поблагодарить автора:

About

A tool for scanning and resolving DNS names into IP addresses

Resources

Stars

837 stars

Watchers

23 watching

Forks

Releases

Packages

Used by

Contributors

Languages