Что нового (нажать, чтобы открыть)
- Новая агрегация 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
- Meta
- Openai
- Tik-Tok
- Netflix
- Bing
- Adobe
- Apple
- Torrent Trackers
- Search engines
- Github Copilot
- Twitch
- Discord
- Jetbrains
- Xbox
- Telegram
- 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».
-
Скачайте репозиторий и перейдите в его папку:
git clone https://github.com/Ground-Zerro/DomainMapper.git cd DomainMapper -
Установите зависимости:
pip install -r requirements.txt
-
При необходимости создайте
config.iniна основеconfig.ini.example:cp config.ini.example config.ini
-
Запустите скрипт:
python main.py
Без config.ini скрипт по очереди спросит:
- сервисы — номера через пробел,
0— все; - DNS-серверы — номера через пробел,
0— все; - исключать ли IP-адреса Cloudflare;
- нужно ли объединять IP-адреса в подсети;
- формат сохранения и, если формат этого требует, шлюз, интерфейс или имя списка.
Результат сохраняется в файл 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— проверка активности доменов.
Если проект оказался Вам полезен — можно поблагодарить автора: