**Описание:** Инструмент на языке Python, предназначенный для разрешения DNS имен популярных веб-сервисов в IP-адреса.
Имеется поддержка следующих сервисов:
<details>
<summary>Поддерживаемые сервисы (нажать, чтобы открыть)</summary>
- [Antifilter - community edition](https://community.antifilter.download/)
- Youtube
- Facebook
@@ -22,62 +42,108 @@
- Twitch
- Личный список
**Функции:**
- Скрипт использует списки доменных имен популярных сервисов и разрешает их в IP-адреса.
- Итоговый список содержит только уникальные IP-адреса исключая дубликаты, также фильтруются IP-адреса самих DNS-серверов, заглушки в виде редиректа на localhost и (по желанию) IP-адреса Cloudflare.
- Выбор между системным DNS сервером, популярными публичными, либо их комбинации.
- Разрешение DNS имени происходит используя каждый из указанных пользователем DNS серверов и не останавливается при первом же успешном получении его IP-адреса.
- Пользователь может создать свой список с DNS именами, необходимыми лично ему.
- Агрегация маршрутов до /16 (255.255.0.0), /24 (255.255.255.0).
**Автоматизация:**
Конфигурационный файл позволяет настроить работу скрипта в "молчаливом" режиме - без промтов к пользователю.
Так же в конфигурационном файле можно добавить выполнение кастомной команды в консоли для запуска другого скрипта или программы при завершении его работы.
**Зависимости:** Для работы Domain Mapper необходимо наличие следующих библиотек Python:
- Запустить с помощью Python. Для работы необходим только "main.py" и (по желанию) файл "config.ini".
**Работа с личным списком DNS:**
- Создать файл "custom-dns-list.txt", записать в него DNS имена (одна строчка - одно имя) и положить рядом со скриптом. Список будет подхвачен при запуске и отображен в меню как "Custom DNS list".
**Использование скрипта с кастомным конфигурационным файлом**
- Можно передавать путь к конфигурационному файлу при запуске скрипта с помощью опции `-c` (или `--config`). Если параметр не указан, по умолчанию будет использоваться файл config.ini.
Пример использования: `main.py -с myconfig.ini` или `python main.py -с config2.ini` или `main.py -с srv5.ini` и т.п.
**Кто не знает "как", но кому "очень нужно":**
- Загляните в директорию "Windows" репозитория.
<details>
<summary>Что нового</summary>
- Вспомагательные [утилиты](https://github.com/Ground-Zerro/DomainMapper/tree/main/utilities) для поиска субдоменов.
- Преобразование доменных имен популярных сервисов в IP-адреса.
- Агрегация маршрутов в /16 (255.255.0.0) и /24 (255.255.255.0) подсети. Комбинированный режим /24 + /32.
- Фильтрация IP-адресов Cloudflare (опционально).
- Восемь вариантов сохранения результатов.
**Ключевые особенности**
- Возможность выбора системного, публичного DNS-сервера или их комбинации.
- При разрешении доменного имени используется каждый из указанных DNS-серверов, при этом процесс продолжается до получения всех возможных IP-адресов, а не останавливается на первом успешном ответе.
- Автоматическое исключение дубликатов IP-адресов, а также "заглушек" (например, IP самих DNS-серверов, редиректов на `0.0.0.0` и `localhost`).
- Поддержка работы в "тихом" режиме без взаимодействия с пользователем, настройка через конфигурационный файл.
-В конфигурационном файле можно указать команду для автоматического запуска другого скрипта или программы по завершении работы.
### Использование:
1. Установите зависимости:
```bash
pip install -r requirements.txt
```
2. Отредактируйте `config.ini` под свои задачи (опционально)
3. Запустите скрипт:
```bash
python main.py
```
<details>
<summary>Локальный режим работы (нажать, чтобы открыть)</summary>
В этом режиме списки DNS-серверов и сервисов загружаются из локальных файлов в папке со скриптом, а не из сети.
Для включения загрузки списка сервисов из локального файла `platformdb`, укажите `localplatform = yes` в config.ini.
- Формат файла `platformdb`: название сервиса и путь к локальному файлу через двоеточие.
Поддерживается работа как с файлами на локальной машине, так и их загрузка из сети по http(s).
Для включения загрузки списка DNS-серверов из локального файла `dnsdb`, укажите `localdns = yes` в config.ini.
- Формат файла `dnsdb`: название DNS-сервера и его IP-адреса через двоеточие и пробел.
Важно - нужно обязательно указать два IP-адреса для каждого названия (можно один и тот же), это необходимо для правильной работы кода.
Пример:
```
SkyDNS: 77.88.8.8 77.88.8.8
Alternate DNS: 76.76.19.19 76.223.122.150
AdGuard DNS: 94.140.14.14 94.140.15.15
```
Важно: названия сервисов и нумерация DNS-серверов в config.ini должны соответствовать тем, что указаны в файлах `platformdb` и `dnsdb`.
- Формат файла с доменными именами: по одному домену на строку.
Пример:
```
ab.chatgpt.com
api.openai.com
arena.openai.com
```
Указание URL вместо доменного имени (например, `ab.chatgpt.com/login` вместо `ab.chatgpt.com`) приведет к ошибке.
</details>
<details>
<summary>Запуск скрипта с файлом конфигурации, отличным от `config.ini` (нажать, чтобы открыть)</summary>
- Указать путь к другому конфигурационному файлу при запуске скрипта можно с помощью опции `-c` (или `--config`). Если параметр не указан, по умолчанию будет использоваться файл `config.ini`.
Пример использования: `main.py -c myconfig.ini`, `python main.py -c config2.ini` или `main.py -c srv5.ini` и т.д.
</details>
<details>
<summary>Личный (локальный) список с доменными именами (нажать, чтобы открыть)</summary>
- Создайте файл `custom-dns-list.txt`, запишите в него доменные имена и разместите его рядом со скриптом. Список будет автоматически подхвачен при запуске и появится в меню как "Custom DNS list".
- Пример файла `custom-dns-list.txt`:
```
ab.chatgpt.com
api.openai.com
arena.openai.com
```
Указание URL вместо доменного имени (например, `ab.chatgpt.com/login` вместо `ab.chatgpt.com`) приведет к ошибке.
</details>
<details>
<summary>Для пользователей Windows, не знающих "как", но кому "очень нужно" (нажать, чтобы открыть)</summary>
- Загляните в директорию [Windows](https://github.com/Ground-Zerro/DomainMapper/tree/main/Windows) репозитория.
</details>
##### Протестировано в Ubuntu 20.04, macOS Sonoma и Windows 10/11
cfginfo=config.get('cfginfo')or'yes'# Не возвращаем его в main
ken_gateway=config.get('keenetic')or''
localplatform=config.get('localplatform')or''
localdns=config.get('localdns')or''
ifcfginfo=='yes':
ifcfginfoin['yes','y']:
print(f"{yellow(f'Загружена конфигурация из {cfg_file}:')}")
print(f"{Style.BRIGHT}Сервисы для проверки:{Style.RESET_ALL}{serviceifserviceelse'спросить у пользователя'}")
print(f"{Style.BRIGHT}Использовать DNS сервер:{Style.RESET_ALL}{dns_server_indicesifdns_server_indiceselse'спросить у пользователя'}")
print(f"{Style.BRIGHT}Количество одновременных запросов к одному DNS серверу:{Style.RESET_ALL}{request_limit}")
print(f"{Style.BRIGHT}Фильтрация IP-адресов Cloudflare:{Style.RESET_ALL}{'включена'ifcloudflarein['y','yes']else'вЫключена'ifcloudflarein['n','no']else'спросить у пользователя'}")
print(f"{Style.BRIGHT}Агрегация IP-адресов:{Style.RESET_ALL}{'до /16 подсети (255.255.0.0)'ifsubnet=='16'else'до /24 подсети (255.255.255.0)'ifsubnet=='24'else'вЫключена'ifsubnetin['n','no']else'спросить у пользователя'}")
print(f"{Style.BRIGHT}Формат сохранения:{Style.RESET_ALL}{'только IP'iffiletype=='ip'else'Linux route'iffiletype=='unix'else'CIDR-нотация'iffiletype=='cidr'else'Windows route'iffiletype=='win'else'Mikrotik CLI'iffiletype=='mikrotik'else'open vpn'iffiletype=='ovpn'else'Keenetic CLI'iffiletype=='keenetic'else'Wireguard'iffiletype=='wireguard'else'спросить у пользователя'}")
print(f"{Style.BRIGHT}Имя списка для Mikrotik firewall:{Style.RESET_ALL}{mk_list_nameifmk_list_nameelse'спросить у пользователя'}")
print(
f"{Style.BRIGHT}Сервисы для проверки:{Style.RESET_ALL}{serviceifserviceelse'спросить у пользователя'}")
print(
f"{Style.BRIGHT}Использовать DNS сервер:{Style.RESET_ALL}{dns_server_indicesifdns_server_indiceselse'спросить у пользователя'}")
print(
f"{Style.BRIGHT}Количество одновременных запросов к одному DNS серверу:{Style.RESET_ALL}{request_limit}")
print(
f"{Style.BRIGHT}Фильтрация IP-адресов Cloudflare:{Style.RESET_ALL}{'включена'ifcloudflarein['y','yes']else'вЫключена'ifcloudflarein['n','no']else'спросить у пользователя'}")
print(
f"{Style.BRIGHT}Агрегация IP-адресов:{Style.RESET_ALL}{'mix режим /24 (255.255.255.0) + /32 (255.255.255.255)'ifsubnet=='mix'else'до /16 подсети (255.255.0.0)'ifsubnet=='16'else'до /24 подсети (255.255.255.0)'ifsubnet=='24'else'вЫключена'ifsubnetin['n','no']else'спросить у пользователя'}")
print(
f"{Style.BRIGHT}Формат сохранения:{Style.RESET_ALL}{'только IP'iffiletype=='ip'else'Linux route'iffiletype=='unix'else'CIDR-нотация'iffiletype=='cidr'else'Windows route'iffiletype=='win'else'Mikrotik CLI'iffiletype=='mikrotik'else'open vpn'iffiletype=='ovpn'else'Keenetic CLI'iffiletype=='keenetic'else'Wireguard'iffiletype=='wireguard'else'спросить у пользователя'}")
iffiletypein['win','unix','']:
print(
f"{Style.BRIGHT}Шлюз/Имя интерфейса для Windows и Linux route:{Style.RESET_ALL}{gatewayifgatewayelse'спросить у пользователя'}")
iffiletypein['keenetic','']:
print(
f"{Style.BRIGHT}Шлюз/Имя интерфейса для Keenetic CLI:{Style.RESET_ALL}{ken_gatewayifken_gatewayelse'спросить у пользователя'}")
iffiletypein['mikrotik','']:
print(
f"{Style.BRIGHT}Имя списка для Mikrotik firewall:{Style.RESET_ALL}{mk_list_nameifmk_list_nameelse'спросить у пользователя'}")
print(f"{Style.BRIGHT}Сохранить результат в файл:{Style.RESET_ALL}{filename}")
print(f"{Style.BRIGHT}Выполнить по завершению:{Style.RESET_ALL}{run_commandifrun_commandelse'не указано'}")
print(
f"{Style.BRIGHT}Выполнить по завершению:{Style.RESET_ALL}{run_commandifrun_commandelse'не указано'}")
input_gateway=input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')}: ")
@@ -84,9 +111,11 @@ def gateway_input(gateway):
returngateway
# IP шлюза и имя интерфейса для keenetic
defken_gateway_input(ken_gateway):
ifnotken_gateway:
input_ken_gateway=input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')} или {green('IP шлюза')} и через пробел {green('имя интерфейса')}: ")
input_ken_gateway=input(
f"Укажите {green('IP шлюза')} или {green('имя интерфейса')} или {green('IP шлюза')} и через пробел {green('имя интерфейса')}: ")
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.