mirror of
https://github.com/Ground-Zerro/DomainMapper.git
synced 2025-12-10 01:47:18 +07:00
Compare commits
188 Commits
0.1.1
...
b8ec267ae3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b8ec267ae3 | ||
|
|
dca5e107b4 | ||
|
|
02970393f6 | ||
|
|
4251bd3e3c | ||
|
|
60dc6d7ae1 | ||
|
|
4568e426a7 | ||
|
|
d673d30498 | ||
|
|
8b25b5c28e | ||
|
|
0921e326f4 | ||
|
|
527cc4aae8 | ||
|
|
a527bf8f8a | ||
|
|
27d525ae60 | ||
|
|
c631c4cf44 | ||
|
|
03c18c52fc | ||
|
|
7b3190a00a | ||
|
|
b5f8aeb65f | ||
|
|
bba8015ae5 | ||
|
|
94b523c85f | ||
|
|
78f2bf93e8 | ||
|
|
ff0e50f790 | ||
|
|
f937106d52 | ||
|
|
a6caea23e3 | ||
|
|
535f01a2c0 | ||
|
|
1a8476a1e5 | ||
|
|
92b70ea00e | ||
|
|
9219ba8edb | ||
|
|
83eee42275 | ||
|
|
e449c45fa9 | ||
|
|
723144ce41 | ||
|
|
f6fccaf791 | ||
|
|
b77daee426 | ||
|
|
980ec67d2f | ||
|
|
4a0acfa4ae | ||
|
|
9b91d6f9df | ||
|
|
55d9b424d2 | ||
|
|
1f07c468a2 | ||
|
|
dd21223b61 | ||
|
|
1834ffee26 | ||
|
|
9085e59067 | ||
|
|
d8945f1ecf | ||
|
|
bed4db1926 | ||
|
|
21c77cc79d | ||
|
|
15599dffa0 | ||
|
|
0654f45125 | ||
|
|
d638d707de | ||
|
|
4d894d7fa4 | ||
|
|
30f596b74a | ||
|
|
89c390a887 | ||
|
|
8df4921e5c | ||
|
|
09866c704b | ||
|
|
94a09b4670 | ||
|
|
46565ce2ab | ||
|
|
a15aba7963 | ||
|
|
fbe369f62d | ||
|
|
675ca12691 | ||
|
|
80a4a40bfc | ||
|
|
29763414d6 | ||
|
|
3f64f5ab8f | ||
|
|
6d75bcb5fa | ||
|
|
c5cb415a7d | ||
|
|
ba72a0460e | ||
|
|
98e7df3e14 | ||
|
|
71b6159536 | ||
|
|
cffef549c4 | ||
|
|
122a6701ad | ||
|
|
d1582c7fc8 | ||
|
|
3a264b3cf9 | ||
|
|
6bb9b4eef9 | ||
|
|
804c71a013 | ||
|
|
559194db07 | ||
|
|
a4e0ac2d22 | ||
|
|
6d7729e0f4 | ||
|
|
3e281539db | ||
|
|
749f2c8327 | ||
|
|
de091d2e6e | ||
|
|
165cc69889 | ||
|
|
d0ed146bf0 | ||
|
|
b0f9dab1d5 | ||
|
|
4ae22f7163 | ||
|
|
083502b3e6 | ||
|
|
b45de91236 | ||
|
|
80b8f0e42d | ||
|
|
3f640db79d | ||
|
|
fdc4968ba6 | ||
|
|
b2f90fe690 | ||
|
|
310c43be95 | ||
|
|
df0c74deb9 | ||
|
|
5ef44a1f17 | ||
|
|
c46f7a8f33 | ||
|
|
7b8b594eaf | ||
|
|
bb44ee2f51 | ||
|
|
7f0dceb632 | ||
|
|
43d7a85913 | ||
|
|
f09e1175e9 | ||
|
|
c299efc6bf | ||
|
|
4474a7ef8d | ||
|
|
9d9c6a5806 | ||
|
|
f0915de5fb | ||
|
|
bba67b421f | ||
|
|
cbebcdb522 | ||
|
|
5c6c2a3f8c | ||
|
|
2be0d6be75 | ||
|
|
d74be5cc50 | ||
|
|
e25a1119e4 | ||
|
|
30f46bdc5d | ||
|
|
b671c670ce | ||
|
|
d59374bc38 | ||
|
|
96a6800f9f | ||
|
|
ff34677dc8 | ||
|
|
ff378007ad | ||
|
|
151897083d | ||
|
|
b85b0287dd | ||
|
|
6d15e0d508 | ||
|
|
908ae1cc61 | ||
|
|
3981241720 | ||
|
|
336d64777a | ||
|
|
a89ac22e86 | ||
|
|
cecef30c58 | ||
|
|
fd5e408100 | ||
|
|
676e76ab9d | ||
|
|
a298294f3e | ||
|
|
87ca85ad23 | ||
|
|
fc2377c097 | ||
|
|
3bf41ae20d | ||
|
|
99f5ec19dc | ||
|
|
3e7161190e | ||
|
|
9ad361ae8e | ||
|
|
4e33e6d31d | ||
|
|
4f9d3dc5ec | ||
|
|
0df8cdc8e8 | ||
|
|
9891a874df | ||
|
|
e33ff83da4 | ||
|
|
c77fe5e250 | ||
|
|
4c0eb40d17 | ||
|
|
919d53b458 | ||
|
|
00f72e5690 | ||
|
|
ebc21747a6 | ||
|
|
6750b06eb8 | ||
|
|
eb415925ab | ||
|
|
48c15018c9 | ||
|
|
870a805d96 | ||
|
|
bd601b3b0f | ||
|
|
095cee5d09 | ||
|
|
886ab88a1c | ||
|
|
1ec006a4a7 | ||
|
|
62093763ff | ||
|
|
8e4d3e3348 | ||
|
|
b88b1505ab | ||
|
|
47184b4128 | ||
|
|
423d402f98 | ||
|
|
ebb5a405db | ||
|
|
e9a6930711 | ||
|
|
a332a2c3a5 | ||
|
|
c74bbc6e97 | ||
|
|
6283d2d872 | ||
|
|
42856a4b31 | ||
|
|
496454eb03 | ||
|
|
e3794dff97 | ||
|
|
966e996160 | ||
|
|
ae95c589bb | ||
|
|
1193ae11a5 | ||
|
|
31eeb55792 | ||
|
|
eb234e261b | ||
|
|
567bef6a58 | ||
|
|
db6c7fd811 | ||
|
|
dfe73df66a | ||
|
|
7cc7815fb3 | ||
|
|
cd060dcee3 | ||
|
|
eba22848ee | ||
|
|
0edc4b5193 | ||
|
|
906e95cbc4 | ||
|
|
41b2d62647 | ||
|
|
67ab4758ed | ||
|
|
7b51669140 | ||
|
|
471400e27f | ||
|
|
e8f1f58474 | ||
|
|
ec2bc3eeb3 | ||
|
|
ed4b35dbd6 | ||
|
|
80c6106aa1 | ||
|
|
854d559f59 | ||
|
|
8a46dce764 | ||
|
|
1979b77567 | ||
|
|
1c333426b4 | ||
|
|
9ee7ae7e0d | ||
|
|
9890368164 | ||
|
|
9ce98ce052 | ||
|
|
0bf247a225 | ||
|
|
4291f321f5 |
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
* text=auto
|
||||
*.bat text eol=crlf
|
||||
*.cmd text eol=crlf
|
||||
209
README.md
209
README.md
@@ -1,10 +1,42 @@
|
||||
## Domain Mapper
|
||||
<details>
|
||||
<summary>Что нового (нажать, чтобы открыть)</summary>
|
||||
|
||||
- Keenetic BAT формат сохранения. Небольшие изменения в интерфейсе. Некоторые доработки/улучшения.
|
||||
- Доабвлены некоторые [оналйн кинотеатры](https://github.com/Ground-Zerro/DomainMapper/blob/main/platforms/dns-onlinetheater.txt). Запрос @Andrey_schumacher
|
||||
- Добавлены списки от [ITDog](https://t.me/itdoginfo/36).
|
||||
- Добавлен сервис xBox. Запрос @Deni5c
|
||||
- Запуск в докере. Запрос [Запрос @andrejs82git](https://github.com/Ground-Zerro/DomainMapper/issues/21), [Реализация @MrEagle123](https://github.com/Ground-Zerro/DomainMapper/issues/21#issuecomment-2509565392)
|
||||
- Опция в config.ini: не добавлять comment="%SERVICE_NAME%" при сохранении IP-адресов в mikrotik формате. [Запрос @ITNetSystem](https://github.com/Ground-Zerro/DomainMapper/issues/45)
|
||||
- Изменена кодиовка файла результатов на UTF-8 без BOM. [Запрос @Savanture](https://github.com/Ground-Zerro/DomainMapper/issues/54)
|
||||
- [Конвертер маршутов](https://github.com/Ground-Zerro/DomainMapper/tree/main/utilities) как отдельная утилита. [Запрос @Andrey999r](https://github.com/Ground-Zerro/DomainMapper/discussions/43)
|
||||
- Добавлен сервис Jetbrains. [Запрос @SocketSomeone](https://github.com/Ground-Zerro/DomainMapper/issues/40)
|
||||
- Добавлен сервис Discord. [Запрос @AHuMex](https://github.com/Ground-Zerro/DomainMapper/issues/38)
|
||||
- [Комбинированный режим объединения IP-адресов в подсеть.](https://github.com/Ground-Zerro/DomainMapper/issues/36)
|
||||
- Возможность загрузки списков сервисов и DNS-серверов из локального файла. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/26)
|
||||
- Вспомагательные [утилиты](https://github.com/Ground-Zerro/DomainMapper/tree/main/utilities) для поиска субдоменов.
|
||||
- Добавлен сервис Twitch. [Запрос @shevernitskiy](https://github.com/Ground-Zerro/DomainMapper/issues/31)
|
||||
- Добавлен Yandex DNS сервер. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/26)
|
||||
- Опция в config.ini: Отключить отображение сведений о загруженой конфигурации.
|
||||
- Передача имени конфигурационного файла ключом в терминале/командной строке. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/25)
|
||||
- Добавлен сервис Github Copilot. [Запрос @aspirisen](https://github.com/Ground-Zerro/DomainMapper/issues/23)
|
||||
- Keenetic CLI формат сохранения. [Запрос @vchikalkin](https://github.com/Ground-Zerro/DomainMapper/pull/20)
|
||||
- Wireguard формат сохранения. [Запрос @sanikroot](https://github.com/Ground-Zerro/DomainMapper/issues/18)
|
||||
- Агрегация маршрутов до /24, /16. [Запрос @sergeeximius](https://github.com/Ground-Zerro/DomainMapper/issues/8)
|
||||
- OVPN формат сохранения. [Запрос @SonyLo](https://github.com/Ground-Zerro/DomainMapper/pull/13)
|
||||
- Mikrotik формат сохранения. [Запрос @Shaman2010](https://github.com/Ground-Zerro/DomainMapper/pull/9)
|
||||
|
||||
</details>
|
||||
|
||||
**Описание:** Инструмент на языке Python, предназначенный для разрешения DNS имен популярных веб-сервисов в IP-адреса.
|
||||
|
||||
Имеется поддержка следующих сервисов:
|
||||
|
||||
<details>
|
||||
<summary>Поддерживаемые сервисы (нажать, чтобы открыть)</summary>
|
||||
|
||||
- [Antifilter - community edition](https://community.antifilter.download/)
|
||||
- [ITDog Inside](https://github.com/itdoginfo/allow-domains)
|
||||
- [ITDog Outside](https://github.com/itdoginfo/allow-domains)
|
||||
- Youtube
|
||||
- Facebook
|
||||
- Openai
|
||||
@@ -16,68 +48,131 @@
|
||||
- Adobe
|
||||
- Apple
|
||||
- Google
|
||||
- Torrent Truckers
|
||||
- Torrent Trackers
|
||||
- Search engines
|
||||
- [Github сopilot](https://github.com/features/copilot)
|
||||
- Twitch
|
||||
- Discord
|
||||
- Jetbrains
|
||||
- Xbox
|
||||
- Telegram
|
||||
- Личный список
|
||||
|
||||
|
||||
**Функции:**
|
||||
- Скрипт использует списки доменных имен популярных сервисов и разрешает их в 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:
|
||||
- configparser, ipaddress, dnspython, httpx, colorama.
|
||||
|
||||
*Не забудьте установить их перед запуском:*
|
||||
```
|
||||
pip3 install -r requirements.txt
|
||||
```
|
||||
|
||||
|
||||
**Использование:**
|
||||
- Запустить с помощью 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) для поиска субдоменов.
|
||||
- Добавлен сервис Twitch. [Запрос @shevernitskiy](https://github.com/Ground-Zerro/DomainMapper/issues/31)
|
||||
- Добавлен Yandex DNS сервер. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/26)
|
||||
- Опция в config.ini: Отключить отображение сведений о загруженой конфигурации.
|
||||
- Кастомное имя конфигурационного файла. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/25)
|
||||
- Добавлен сервис Github Copilot. [Запрос @aspirisen](https://github.com/Ground-Zerro/DomainMapper/issues/23)
|
||||
- Keenetic CLI формат сохранения. [Запрос @vchikalkin](https://github.com/Ground-Zerro/DomainMapper/pull/20)
|
||||
- Wireguard формат сохранения. [Запрос @sanikroot](https://github.com/Ground-Zerro/DomainMapper/issues/18)
|
||||
- Агрегация маршрутов до /24, /16. [Запрос @sergeeximius](https://github.com/Ground-Zerro/DomainMapper/issues/8)
|
||||
- OVPN формат сохранения. [Запрос @SonyLo](https://github.com/Ground-Zerro/DomainMapper/pull/13)
|
||||
- Mikrotik формат сохранения.[Запрос @Shaman2010](https://github.com/Ground-Zerro/DomainMapper/pull/9)
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Функции:**
|
||||
- Преобразование доменных имен популярных сервисов в IP-адреса.
|
||||
- Агрегация маршрутов в /16 (255.255.0.0) и /24 (255.255.255.0) подсети. Комбинированный режим /24 + /32.
|
||||
- Фильтрация IP-адресов Cloudflare (опционально).
|
||||
- Множество форматов сохранения результата.
|
||||
|
||||
##### Протестировано в Ubuntu 20.04, macOS Sonoma и Windows 10/11
|
||||
|
||||
**Ключевые особенности**
|
||||
- Возможность выбора системного, публичного 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).
|
||||
Пример:
|
||||
```
|
||||
Torrent Truckers: platforms/dns-ttruckers.lst
|
||||
Search engines: dns-search-engines.txt
|
||||
Twitch: platforms/service/dns-twitch.txt
|
||||
Adobe: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-adobe.txt
|
||||
```
|
||||
|
||||
Для включения загрузки списка 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>Запуск в Docker (нажать, чтобы открыть)</summary>
|
||||
|
||||
```
|
||||
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
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
<details>
|
||||
<summary>Для пользователей Windows (нажать, чтобы открыть)</summary>
|
||||
|
||||
- Загляните в директорию [Windows](https://github.com/Ground-Zerro/DomainMapper/tree/main/Windows) репозитория.
|
||||
</details>
|
||||
|
||||
|
||||
# ☕ Поддержка
|
||||
|
||||
Если проект оказался Вам полезен — можно поддержать автора:
|
||||
|
||||
- [Поддержать на Boosty](https://boosty.to/ground_zerro)
|
||||
|
||||
@@ -91,6 +91,6 @@ move /y domain-ip-resolve.txt %UserProfile%\Desktop\domain-ip-resolve.txt
|
||||
echo Программа завершена.
|
||||
del /q /f main.py
|
||||
endlocal
|
||||
echo файл скопирован в %UserProfile%\Desktop\domain-ip-resolve.txt
|
||||
pause
|
||||
exit /b 0
|
||||
|
||||
::То-ли при выгрузке на github, то-ли при скачивании с него, в файл как-то попадает BOM... Как это починить я ХЗ.
|
||||
|
||||
110
config.ini
110
config.ini
@@ -1,109 +1,41 @@
|
||||
[DomainMapper]
|
||||
# Имена сервисов, разделенные запятыми, для разрешения доменных имен в IP-адреса без запроса у пользователя
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# all - проверить все сервисы
|
||||
# Antifilter community edition - список заблокированных DNS имен формируемый сообществом
|
||||
# Youtube
|
||||
# Facebook
|
||||
# Openai
|
||||
# Tik-Tok
|
||||
# Instagram
|
||||
# Twitter
|
||||
# Netflix
|
||||
# Bing
|
||||
# Adobe
|
||||
# Apple
|
||||
# Google
|
||||
# Torrent Truckers - торрент трекеры
|
||||
# Search engines - поисковые системы
|
||||
# Github Copilot - ИИ помощник от github
|
||||
# Twitch
|
||||
# custom - Custom DNS list, это файл "custom-dns-list.txt" расположенный в одном каталоге со скриптом
|
||||
# Локальный режим загрузки (yes/no)
|
||||
localplatform = no
|
||||
localdns = no
|
||||
|
||||
# Сервисы для проверки (например: all, youtube, google, telegram, custom и т.д.)
|
||||
service =
|
||||
|
||||
# DNS сервера (номер), разделенные пробелом, которые будут использоваться для разрешения доменных имен
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# 0 - использовать все доступные DNS серверы
|
||||
# 1 - Системный DNS
|
||||
# 2 - Google Public DNS
|
||||
# 3 - Quad9
|
||||
# 4 - Cloudflare DNS
|
||||
# 5 - OpenDNS
|
||||
# 6 - Cisco Umbrella
|
||||
# 7 - DNS.Watch
|
||||
# 8 - Dyn
|
||||
# 9 - CleanBrowsing
|
||||
# 10 - Alternate DNS
|
||||
# 11 - AdGuard DNS
|
||||
# 12 - Control D
|
||||
# 13 - Yandex (основной)
|
||||
# Список DNS серверов по номерам (0 - все, 1 - системный, 2 - google, 3 - quad9 и т.д.)
|
||||
dnsserver =
|
||||
|
||||
# Включить фильтрацию IP-адресов cloudflare и не записывать их в файл результатов
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# yes - исключить IP адреса cloudflare из итогового списка
|
||||
# no - оставить IP адреса cloudflare в итоговом списке
|
||||
# Исключить Cloudflare IP (yes/no)
|
||||
cloudflare =
|
||||
|
||||
# Сгруппировать подсети
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# 16 - группировка подсетей до /16 (255.255.0.0)
|
||||
# 24 - группировка подсетей до /24 (255.255.255.0)
|
||||
# no - оставить как есть
|
||||
# Агрегация подсетей (16, 24, mix, no)
|
||||
subnet =
|
||||
|
||||
# Имя конечного файла
|
||||
# опции:
|
||||
# пустое значение - "domain-ip-resolve.txt" в каталоге со скриптом
|
||||
# имя_файла - файл с указанным именем будет сохранени в каталоге со скриптом
|
||||
# полный_путь/имя_файла - файл будет сохранен с указанным именем в указанной каталоге
|
||||
filename =
|
||||
# Имя выходного файла
|
||||
filename = domain-ip-resolve.txt
|
||||
|
||||
# Количество потоков сканирования, если не указано - будет использоваться 20 потоков
|
||||
# Количество потоков (по умолчанию 20)
|
||||
threads =
|
||||
|
||||
# Формат сохранения файла результатов
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# ip - только IP адрес
|
||||
# unix - ip rote %IP%/32 %gateway%
|
||||
# cidr - %IP%/32
|
||||
# win - rote add %IP% mask 255.255.255.255 %gateway%
|
||||
# mikrotik - /ip/firewall/address-list add list=%LIST_NAME% comment=%SERVICE_NAME% address=%IP%/32
|
||||
# ovpn - push "route %IP% 255.255.255.255"
|
||||
# wireguard - %IP%/32, и т.д...
|
||||
# keenetic - ip route %IP%/32 %gateway% auto !%LIST_NAME%
|
||||
# Формат результата (ip, unix, win, mikrotik, ovpn, wireguard, cidr, keenetic bat и т.д.)
|
||||
filetype =
|
||||
|
||||
# адрес шлюза или имя интерфейса - используется при сохранении IP-адресов в 'win' и 'unix' формате
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведен запрос с подсказкой
|
||||
# укажите IP-адрес шлюза или имя интерфейса
|
||||
# Параметры для форматов:
|
||||
## для win/unix — IP шлюза или имя интерфейса
|
||||
gateway =
|
||||
|
||||
# адрес шлюза или имя интерфейса - используется при сохранении IP-адресов в 'keenetic' формате
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведен запрос с подсказкой
|
||||
# укажите IP-адрес шлюза или имя интерфейса или IP-адрес шлюза и через пробел имя интерфейса
|
||||
## для keenetic — IP шлюза или имя интерфейса, можно оба через пробел
|
||||
keenetic =
|
||||
|
||||
# имя списка - используется при сохранении IP-адресов в 'mikrotik' формате
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведен запрос с подсказкой
|
||||
# укажите имя
|
||||
## для mikrotik — имя списка address-list
|
||||
listname =
|
||||
## для mikrotik - добавить или убирать "comment=%SERVICE_NAME%" в правилах Mikrotik (on/off)
|
||||
mk_comment = off
|
||||
|
||||
# Показывать сведения о загруженной конфигурации при запуске скрипта
|
||||
# опции:
|
||||
# yes или пустое значение - показывать
|
||||
# no - скрыть
|
||||
# Показывать конфигурацию при запуске (yes/no)
|
||||
cfginfo = yes
|
||||
|
||||
# Команда для консоли после завершения скриптом всех операций, может быть полезно для автоматизации и комбинирования с другим скриптом, кодом или программой
|
||||
# опции:
|
||||
# исполняемая_команда_для_консоли
|
||||
run =
|
||||
# Выполнить команду или запустить приложение после завершения (команда/полный путь к приложению)
|
||||
run =
|
||||
116
dm-docker.sh
Normal file
116
dm-docker.sh
Normal file
@@ -0,0 +1,116 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Функция для проверки наличия Docker
|
||||
check_docker() {
|
||||
if command -v docker >/dev/null 2>&1; then
|
||||
echo "Docker уже установлен. Версия: $(docker --version)"
|
||||
return 0 # Docker установлен
|
||||
else
|
||||
echo "Docker не найден. Устанавливаем Docker..."
|
||||
return 1 # Docker не установлен
|
||||
fi
|
||||
}
|
||||
|
||||
# Проверяем и устанавливаем Docker, если его нет
|
||||
if ! check_docker; then
|
||||
echo "Обновляем список пакетов и устанавливаем необходимые компоненты..."
|
||||
apt update && apt install -y git curl
|
||||
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sh ./get-docker.sh
|
||||
rm get-docker.sh # Удаляем установочный скрипт после установки
|
||||
fi
|
||||
|
||||
# Клонируем репозиторий, если его нет
|
||||
if [ ! -d "./DomainMapper" ]; then
|
||||
echo "Клонируем репозиторий DomainMapper..."
|
||||
git clone https://github.com/Ground-Zerro/DomainMapper.git
|
||||
else
|
||||
echo "Репозиторий DomainMapper уже клонирован."
|
||||
fi
|
||||
|
||||
# Проверяем наличие Docker образа
|
||||
if ! docker image inspect domainmapper >/dev/null 2>&1; then
|
||||
echo "Docker образ не найден. Собираем новый образ..."
|
||||
|
||||
echo "Устанавливаем только необходимые для работы компоненты..."
|
||||
apt update && apt install -y software-properties-common wget build-essential libssl-dev zlib1g-dev \
|
||||
libbz2-dev libreadline-dev libsqlite3-dev libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev \
|
||||
liblzma-dev tzdata && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Создаём Dockerfile с исправлениями
|
||||
echo "Создаём Dockerfile..."
|
||||
cat > Dockerfile <<EOL
|
||||
FROM ubuntu:jammy
|
||||
|
||||
# Устанавливаем необходимые пакеты для сборки Python
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV TZ=Etc/UTC
|
||||
RUN apt-get update && \
|
||||
apt-get install -y wget build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev tzdata && \
|
||||
ln -fs /usr/share/zoneinfo/\$TZ /etc/localtime && \
|
||||
echo \$TZ > /etc/timezone && \
|
||||
dpkg-reconfigure --frontend noninteractive tzdata && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Скачиваем и устанавливаем Python 3.12
|
||||
RUN wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz && \
|
||||
tar -xvf Python-3.12.0.tgz && \
|
||||
cd Python-3.12.0 && \
|
||||
./configure --enable-optimizations && \
|
||||
make -j$(nproc) && \
|
||||
make altinstall && \
|
||||
cd .. && \
|
||||
rm -rf Python-3.12.0 Python-3.12.0.tgz
|
||||
|
||||
# Устанавливаем pip для Python 3.12
|
||||
RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.12
|
||||
|
||||
WORKDIR /app
|
||||
ADD ./DomainMapper /app
|
||||
|
||||
# Устанавливаем зависимости проекта, если они указаны
|
||||
RUN if [ -f "requirements.txt" ]; then \
|
||||
python3.12 -m pip install --upgrade pip && \
|
||||
python3.12 -m pip install -r requirements.txt; \
|
||||
fi
|
||||
|
||||
CMD ["python3.12", "main.py"]
|
||||
EOL
|
||||
|
||||
# Создаём файл domain-ip-resolve.txt, если его нет
|
||||
if [ ! -f "./domain-ip-resolve.txt" ]; then
|
||||
echo "Создаём файл domain-ip-resolve.txt..."
|
||||
touch domain-ip-resolve.txt
|
||||
echo "Файл domain-ip-resolve.txt создан."
|
||||
else
|
||||
echo "Файл domain-ip-resolve.txt уже существует."
|
||||
fi
|
||||
|
||||
# Собираем Docker образ
|
||||
echo "Собираем Docker образ..."
|
||||
docker build -t domainmapper .
|
||||
|
||||
# Очищаем кеш Docker после сборки
|
||||
echo "Очищаем build cache Docker..."
|
||||
docker builder prune -f
|
||||
else
|
||||
echo "Docker образ domainmapper уже существует."
|
||||
fi
|
||||
|
||||
# Проверяем наличие контейнера и запускаем main.py из существующего контейнера
|
||||
if docker ps -a | grep -q domainmapper_container; then
|
||||
echo "Контейнер уже существует. Запускаем main.py..."
|
||||
docker start -i domainmapper_container
|
||||
else
|
||||
echo "Создаем и запускаем новый контейнер..."
|
||||
docker run --name domainmapper_container -v "$(pwd)/domain-ip-resolve.txt:/app/domain-ip-resolve.txt" -it domainmapper
|
||||
fi
|
||||
|
||||
# Сообщаем пользователю о местонахождении файла
|
||||
echo "Контейнер завершил работу. Файл domain-ip-resolve.txt находится в $(pwd)/domain-ip-resolve.txt"
|
||||
|
||||
# Удаляем скрипт после выполнения
|
||||
echo "Скрипт завершен."
|
||||
rm -- "$0"
|
||||
712
main.py
712
main.py
@@ -5,12 +5,12 @@ import ipaddress
|
||||
import os
|
||||
from asyncio import Semaphore
|
||||
from collections import defaultdict
|
||||
from typing import Dict, List, Set, Tuple, Optional
|
||||
|
||||
import dns.asyncresolver
|
||||
import httpx
|
||||
from colorama import Fore, Style, init
|
||||
|
||||
# Цвета
|
||||
init(autoreset=True)
|
||||
|
||||
def yellow(text):
|
||||
@@ -31,16 +31,36 @@ def magneta(text):
|
||||
def blue(text):
|
||||
return f"{Fore.BLUE}{text}{Style.RESET_ALL}"
|
||||
|
||||
# Читаем конфигурацию
|
||||
http_client = None
|
||||
dns_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/dnsdb"
|
||||
platform_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platformdb"
|
||||
|
||||
async def get_http_client():
|
||||
global http_client
|
||||
if http_client is None:
|
||||
http_client = httpx.AsyncClient(
|
||||
timeout=20.0,
|
||||
limits=httpx.Limits(max_connections=50, max_keepalive_connections=10),
|
||||
follow_redirects=True
|
||||
)
|
||||
return http_client
|
||||
|
||||
async def cleanup_http_client():
|
||||
global http_client
|
||||
if http_client:
|
||||
await http_client.aclose()
|
||||
http_client = None
|
||||
|
||||
def read_config(cfg_file):
|
||||
try:
|
||||
config = configparser.ConfigParser()
|
||||
with open(cfg_file, 'r', encoding='utf-8-sig') as file:
|
||||
with open(cfg_file, 'r', encoding='utf-8') as file:
|
||||
config.read_file(file)
|
||||
if 'DomainMapper' in config:
|
||||
config = config['DomainMapper']
|
||||
|
||||
service = config.get('service') or ''
|
||||
request_limit = int(config.get('threads') or 20)
|
||||
request_limit = int(config.get('threads') or 15)
|
||||
filename = config.get('filename') or 'domain-ip-resolve.txt'
|
||||
cloudflare = config.get('cloudflare') or ''
|
||||
filetype = config.get('filetype') or ''
|
||||
@@ -51,30 +71,36 @@ def read_config(cfg_file):
|
||||
subnet = config.get('subnet') or ''
|
||||
cfginfo = config.get('cfginfo') or 'yes'
|
||||
ken_gateway = config.get('keenetic') or ''
|
||||
localplatform = config.get('localplatform') or ''
|
||||
localdns = config.get('localdns') or ''
|
||||
mk_comment = config.get('mk_comment') or 'off'
|
||||
|
||||
if cfginfo == 'yes':
|
||||
if cfginfo in ['yes', 'y']:
|
||||
print(f"{yellow(f'Загружена конфигурация из {cfg_file}:')}")
|
||||
print(f"{Style.BRIGHT}Сервисы для проверки:{Style.RESET_ALL} {service if service else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Использовать DNS сервер:{Style.RESET_ALL} {dns_server_indices if dns_server_indices else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Количество одновременных запросов к одному DNS серверу:{Style.RESET_ALL} {request_limit}")
|
||||
print(f"{Style.BRIGHT}Фильтрация IP-адресов Cloudflare:{Style.RESET_ALL} {'включена' if cloudflare in ['y', 'yes'] else 'вЫключена' if cloudflare in ['n', 'no'] else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Агрегация IP-адресов:{Style.RESET_ALL} {'до /16 подсети (255.255.0.0)' if subnet == '16' else 'до /24 подсети (255.255.255.0)' if subnet == '24' else 'вЫключена' if subnet in ['n', 'no'] else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Фильтрация IP-адресов Cloudflare:{Style.RESET_ALL} {'включена' if cloudflare in ['y', 'yes'] else 'выключена' if cloudflare in ['n', 'no'] else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Агрегация IP-адресов:{Style.RESET_ALL} {'mix режим /24 (255.255.255.0) + /32 (255.255.255.255)' if subnet == 'mix' else 'до /16 подсети (255.255.0.0)' if subnet == '16' else 'до /24 подсети (255.255.255.0)' if subnet == '24' else 'выключена' if subnet in ['n', 'no'] else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Формат сохранения:{Style.RESET_ALL} {'только IP' if filetype == 'ip' else 'Linux route' if filetype == 'unix' else 'CIDR-нотация' if filetype == 'cidr' else 'Windows route' if filetype == 'win' else 'Mikrotik CLI' if filetype == 'mikrotik' else 'open vpn' if filetype == 'ovpn' else 'Keenetic CLI' if filetype == 'keenetic' else 'Wireguard' if filetype == 'wireguard' else 'спросить у пользователя'}")
|
||||
if filetype not in ['ip', 'cidr', 'mikrotik', 'ovpn', 'wireguard', 'keenetic']:
|
||||
|
||||
if filetype in ['win', 'unix', '']:
|
||||
print(f"{Style.BRIGHT}Шлюз/Имя интерфейса для Windows и Linux route:{Style.RESET_ALL} {gateway if gateway else 'спросить у пользователя'}")
|
||||
if filetype not in ['ip', 'unix', 'cidr', 'win', 'mikrotik', 'ovpn', 'wireguard']:
|
||||
if filetype in ['keenetic', '']:
|
||||
print(f"{Style.BRIGHT}Шлюз/Имя интерфейса для Keenetic CLI:{Style.RESET_ALL} {ken_gateway if ken_gateway else 'спросить у пользователя'}")
|
||||
if filetype not in ['ip', 'unix', 'cidr', 'win', 'ovpn', 'wireguard', 'keenetic']:
|
||||
if filetype in ['mikrotik', '']:
|
||||
print(f"{Style.BRIGHT}Имя списка для Mikrotik firewall:{Style.RESET_ALL} {mk_list_name if mk_list_name else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}'comment=' в Mikrotik firewall:{Style.RESET_ALL} {'выключен' if mk_comment == 'off' else 'включен'}")
|
||||
print(f"{Style.BRIGHT}Сохранить результат в файл:{Style.RESET_ALL} {filename}")
|
||||
print(f"{Style.BRIGHT}Выполнить по завершению:{Style.RESET_ALL} {run_command if run_command else 'не указано'}")
|
||||
print(f"{Style.BRIGHT}Локальный список платформ:{Style.RESET_ALL} {'включен' if str(localplatform).strip().lower() in ('yes', 'y') else 'выключен'}")
|
||||
print(f"{Style.BRIGHT}Локальный список DNS серверов:{Style.RESET_ALL} {'включен' if str(localdns).strip().lower() in ('yes', 'y') else 'выключен'}")
|
||||
|
||||
return service, request_limit, filename, cloudflare, filetype, gateway, run_command, dns_server_indices, mk_list_name, subnet, ken_gateway
|
||||
return service, request_limit, filename, cloudflare, filetype, gateway, run_command, dns_server_indices, mk_list_name, subnet, ken_gateway, localplatform, localdns, mk_comment
|
||||
|
||||
except Exception as e:
|
||||
print(f"{yellow(f'Ошибка загрузки {cfg_file}:')} {e}\n{Style.BRIGHT}Используются настройки 'по умолчанию'.{Style.RESET_ALL}")
|
||||
return '', 20, 'domain-ip-resolve.txt', '', '', '', '', [], '', '', ''
|
||||
|
||||
return '', 20, 'domain-ip-resolve.txt', '', '', '', '', [], '', '', '', '', '', 'off'
|
||||
|
||||
def gateway_input(gateway):
|
||||
if not gateway:
|
||||
@@ -83,7 +109,6 @@ def gateway_input(gateway):
|
||||
else:
|
||||
return gateway
|
||||
|
||||
|
||||
def ken_gateway_input(ken_gateway):
|
||||
if not ken_gateway:
|
||||
input_ken_gateway = input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')} или {green('IP шлюза')} и через пробел {green('имя интерфейса')}: ")
|
||||
@@ -91,126 +116,185 @@ def ken_gateway_input(ken_gateway):
|
||||
else:
|
||||
return ken_gateway
|
||||
|
||||
|
||||
# Ограничение числа запросов
|
||||
def get_semaphore(request_limit):
|
||||
return defaultdict(lambda: Semaphore(request_limit))
|
||||
|
||||
|
||||
# Инициализация semaphore для ограничения запросов
|
||||
def init_semaphores(request_limit):
|
||||
return get_semaphore(request_limit)
|
||||
|
||||
|
||||
async def load_urls(url):
|
||||
async def load_urls(url: str) -> Dict[str, str]:
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(url)
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
lines = text.split('\n')
|
||||
urls = {}
|
||||
for line in lines:
|
||||
if line.strip():
|
||||
service, url = line.split(': ', 1)
|
||||
urls[service.strip()] = url.strip()
|
||||
return urls
|
||||
client = await get_http_client()
|
||||
response = await client.get(url)
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
lines = text.split('\n')
|
||||
urls = {}
|
||||
for line in lines:
|
||||
if line.strip() and ': ' in line:
|
||||
service, url_val = line.split(': ', 1)
|
||||
urls[service.strip()] = url_val.strip()
|
||||
return urls
|
||||
except Exception as e:
|
||||
print(f"Ошибка при загрузке списка платформ: {e}")
|
||||
return {}
|
||||
|
||||
|
||||
# Загрузка списка DNS серверов
|
||||
async def load_dns_servers(url):
|
||||
async def load_urls_from_file() -> Dict[str, str]:
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(url)
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
lines = text.split('\n')
|
||||
dns_servers = {}
|
||||
for line in lines:
|
||||
if line.strip():
|
||||
service, servers = line.split(': ', 1)
|
||||
dns_servers[service.strip()] = servers.strip().split()
|
||||
return dns_servers
|
||||
with open('platformdb', 'r', encoding='utf-8') as file:
|
||||
urls = {}
|
||||
for line in file:
|
||||
if line.strip() and ': ' in line:
|
||||
service, url = line.split(': ', 1)
|
||||
urls[service.strip()] = url.strip()
|
||||
return urls
|
||||
except Exception as e:
|
||||
print(f"\n{red('Локальный список сервисов не найден - загружаем из сети.')}")
|
||||
urls = await load_urls(platform_db_url)
|
||||
return urls
|
||||
|
||||
async def load_dns_servers(url: str) -> Dict[str, List[str]]:
|
||||
try:
|
||||
client = await get_http_client()
|
||||
response = await client.get(url)
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
lines = text.split('\n')
|
||||
dns_servers = {}
|
||||
for line in lines:
|
||||
if line.strip() and ': ' in line:
|
||||
service, servers = line.split(': ', 1)
|
||||
dns_servers[service.strip()] = servers.strip().split()
|
||||
return dns_servers
|
||||
except Exception as e:
|
||||
print(f"Ошибка при загрузке списка DNS серверов: {e}")
|
||||
return {}
|
||||
|
||||
|
||||
# Загрузка IP-адресов cloudflare
|
||||
async def get_cloudflare_ips():
|
||||
async def load_dns_from_file() -> Dict[str, List[str]]:
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get("https://www.cloudflare.com/ips-v4/")
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
cloudflare_ips = set()
|
||||
for line in text.splitlines():
|
||||
line = line.strip()
|
||||
if '/' in line:
|
||||
try:
|
||||
ip_network = ipaddress.ip_network(line)
|
||||
for ip in ip_network:
|
||||
cloudflare_ips.add(str(ip))
|
||||
except ValueError:
|
||||
continue
|
||||
return cloudflare_ips
|
||||
with open('dnsdb', 'r') as file:
|
||||
dns_servers = {}
|
||||
for line in file:
|
||||
if line.strip() and ': ' in line:
|
||||
service, servers = line.split(': ', 1)
|
||||
dns_servers[service.strip()] = servers.strip().split()
|
||||
return dns_servers
|
||||
except Exception as e:
|
||||
print(f"\n{red('Локальный список DNS серверов не найден - загружаем из сети.')}")
|
||||
dns_servers = await load_dns_servers(dns_db_url)
|
||||
return dns_servers
|
||||
|
||||
async def get_cloudflare_ips() -> Set[str]:
|
||||
try:
|
||||
client = await get_http_client()
|
||||
response = await client.get("https://www.cloudflare.com/ips-v4/")
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
cloudflare_ips = set()
|
||||
|
||||
for line in text.splitlines():
|
||||
line = line.strip()
|
||||
if '/' in line:
|
||||
try:
|
||||
network = ipaddress.ip_network(line)
|
||||
for ip in network:
|
||||
cloudflare_ips.add(str(ip))
|
||||
except ValueError:
|
||||
continue
|
||||
return cloudflare_ips
|
||||
except Exception as e:
|
||||
print("Ошибка при получении IP адресов Cloudflare:", e)
|
||||
return set()
|
||||
|
||||
|
||||
async def resolve_domain(domain, resolver, semaphore, dns_server_name, null_ips_count, cloudflare_ips, cloudflare_ips_count, total_domains_processed, include_cloudflare):
|
||||
async with semaphore:
|
||||
async def load_dns_names(url_or_file: str) -> List[str]:
|
||||
if url_or_file.startswith("http"):
|
||||
client = await get_http_client()
|
||||
try:
|
||||
total_domains_processed[0] += 1
|
||||
response = await resolver.resolve(domain)
|
||||
ips = [ip.address for ip in response]
|
||||
filtered_ips = []
|
||||
for ip_address in ips:
|
||||
if ip_address in ('127.0.0.1', '0.0.0.0') or ip_address in resolver.nameservers:
|
||||
null_ips_count[0] += 1
|
||||
elif include_cloudflare and ip_address in cloudflare_ips:
|
||||
cloudflare_ips_count[0] += 1
|
||||
else:
|
||||
filtered_ips.append(ip_address)
|
||||
print(f"{Fore.BLUE}{domain} IP-адрес: {ip_address} - {dns_server_name}{Style.RESET_ALL}")
|
||||
return filtered_ips
|
||||
except Exception as e: # Ловим все ошибки чтобы код не прервался
|
||||
print(f"{Fore.RED}Не удалось получить IP-адрес: {domain} - {dns_server_name}{Style.RESET_ALL}")
|
||||
response = await client.get(url_or_file)
|
||||
response.raise_for_status()
|
||||
return [line.strip() for line in response.text.splitlines() if line.strip()]
|
||||
except httpx.HTTPStatusError as e:
|
||||
print(f"Ошибка при загрузке DNS имен: {e}")
|
||||
return []
|
||||
else:
|
||||
try:
|
||||
with open(url_or_file, 'r', encoding='utf-8') as file:
|
||||
return [line.strip() for line in file.readlines() if line.strip()]
|
||||
except Exception as e:
|
||||
print(f"Ошибка при чтении файла {url_or_file}: {e}")
|
||||
return []
|
||||
|
||||
async def resolve_domain_batch(domains: List[str], resolver: dns.asyncresolver.Resolver,
|
||||
semaphore: Semaphore, dns_server_name: str,
|
||||
stats: Dict[str, int], cloudflare_ips: Set[str],
|
||||
include_cloudflare: bool) -> List[str]:
|
||||
async with semaphore:
|
||||
resolved_ips = []
|
||||
for domain in domains:
|
||||
try:
|
||||
stats['total_domains_processed'] += 1
|
||||
response = await resolver.resolve(domain)
|
||||
ips = [ip.address for ip in response]
|
||||
|
||||
for ip_address in ips:
|
||||
if ip_address in ('127.0.0.1', '0.0.0.0') or ip_address in resolver.nameservers:
|
||||
stats['null_ips_count'] += 1
|
||||
elif include_cloudflare and ip_address in cloudflare_ips:
|
||||
stats['cloudflare_ips_count'] += 1
|
||||
else:
|
||||
resolved_ips.append(ip_address)
|
||||
print(f"{Fore.BLUE}{domain} IP-адрес: {ip_address} - {dns_server_name}{Style.RESET_ALL}")
|
||||
|
||||
except Exception:
|
||||
stats['domain_errors'] += 1
|
||||
|
||||
return resolved_ips
|
||||
|
||||
async def resolve_dns(service, dns_names, dns_servers, cloudflare_ips, unique_ips_all_services, semaphore, null_ips_count, cloudflare_ips_count, total_domains_processed, include_cloudflare):
|
||||
async def resolve_dns_optimized(service: str, dns_names: List[str],
|
||||
dns_servers: List[Tuple[str, List[str]]],
|
||||
cloudflare_ips: Set[str], unique_ips_all_services: Set[str],
|
||||
semaphore_dict: Dict, stats: Dict[str, int],
|
||||
include_cloudflare: bool, batch_size: int = 50) -> str:
|
||||
try:
|
||||
print(f"{Fore.YELLOW}Анализ DNS имен платформы {service}...{Style.RESET_ALL}")
|
||||
|
||||
print(f"{Fore.YELLOW}Загрузка DNS имен платформы {service}...{Style.RESET_ALL}")
|
||||
|
||||
domain_batches = [dns_names[i:i + batch_size] for i in range(0, len(dns_names), batch_size)]
|
||||
|
||||
tasks = []
|
||||
for server_name, servers in dns_servers:
|
||||
resolver = dns.asyncresolver.Resolver()
|
||||
resolver.nameservers = servers
|
||||
for domain in dns_names:
|
||||
domain = domain.strip()
|
||||
if domain:
|
||||
tasks.append(resolve_domain(domain, resolver, semaphore[server_name], server_name, null_ips_count, cloudflare_ips, cloudflare_ips_count, total_domains_processed, include_cloudflare))
|
||||
|
||||
results = await asyncio.gather(*tasks)
|
||||
|
||||
|
||||
for batch in domain_batches:
|
||||
for server_name, servers in dns_servers:
|
||||
resolver = dns.asyncresolver.Resolver()
|
||||
resolver.nameservers = servers
|
||||
|
||||
tasks.append(resolve_domain_batch(
|
||||
batch, resolver, semaphore_dict[server_name],
|
||||
server_name, stats, cloudflare_ips, include_cloudflare
|
||||
))
|
||||
|
||||
max_concurrent_tasks = min(len(tasks), 100)
|
||||
|
||||
results = []
|
||||
for i in range(0, len(tasks), max_concurrent_tasks):
|
||||
batch_tasks = tasks[i:i + max_concurrent_tasks]
|
||||
batch_results = await asyncio.gather(*batch_tasks, return_exceptions=True)
|
||||
|
||||
for result in batch_results:
|
||||
if not isinstance(result, Exception):
|
||||
results.extend(result)
|
||||
|
||||
unique_ips_current_service = set()
|
||||
for result in results:
|
||||
for ip_address in result:
|
||||
if ip_address not in unique_ips_all_services:
|
||||
unique_ips_current_service.add(ip_address)
|
||||
unique_ips_all_services.add(ip_address)
|
||||
|
||||
return '\n'.join(unique_ips_current_service) + '\n'
|
||||
for ip_address in results:
|
||||
if ip_address not in unique_ips_all_services:
|
||||
unique_ips_current_service.add(ip_address)
|
||||
unique_ips_all_services.add(ip_address)
|
||||
|
||||
return '\n'.join(sorted(unique_ips_current_service)) + '\n' if unique_ips_current_service else ''
|
||||
|
||||
except Exception as e:
|
||||
print(f"Не удалось сопоставить IP адреса {service} его доменным именам.", e)
|
||||
print(f"Не удалось сопоставить IP адреса {service} его доменным именам: {e}")
|
||||
return ""
|
||||
|
||||
|
||||
def check_service_config(service, urls, local_dns_names):
|
||||
if service:
|
||||
services = [s.strip() for s in service.split(',')]
|
||||
@@ -230,8 +314,8 @@ def check_service_config(service, urls, local_dns_names):
|
||||
while True:
|
||||
print(f"\n{yellow('Выберите сервисы:')}")
|
||||
print("0. Выбрать все")
|
||||
for idx, (service, url) in enumerate(urls.items(), 1):
|
||||
print(f"{idx}. {service.capitalize()}")
|
||||
for idx, (service_name, url) in enumerate(urls.items(), 1):
|
||||
print(f"{idx}. {service_name.capitalize()}")
|
||||
if local_dns_names:
|
||||
print(f"{len(urls) + 1}. Custom DNS list")
|
||||
|
||||
@@ -251,40 +335,38 @@ def check_service_config(service, urls, local_dns_names):
|
||||
break
|
||||
return services
|
||||
|
||||
|
||||
def check_include_cloudflare(cloudflare):
|
||||
if cloudflare.lower() == 'yes':
|
||||
return True
|
||||
elif cloudflare.lower() == 'no':
|
||||
return False
|
||||
else:
|
||||
return input(f"\n{yellow('Исключить IP адреса Cloudflare из итогового списка?')}"
|
||||
f"\n{green('yes')} - исключить"
|
||||
f"\n{green('Enter')} - оставить: ").strip().lower() == "yes"
|
||||
if cloudflare in ['yes', 'y', 'no', 'n']:
|
||||
return cloudflare in ['yes', 'y']
|
||||
|
||||
user_input = input(
|
||||
f"\n{yellow('Исключить IP адреса Cloudflare из итогового списка?')}"
|
||||
f"\n1. исключить"
|
||||
f"\n{green('Enter')} - оставить"
|
||||
f"\nВаш выбор: "
|
||||
).strip()
|
||||
|
||||
if user_input == '1':
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def check_dns_servers(dns_servers, dns_server_indices):
|
||||
# Получение системных DNS серверов
|
||||
system_dns_servers = dns.asyncresolver.Resolver().nameservers
|
||||
|
||||
# Формирование списка всех доступных серверов
|
||||
dns_server_options = [('Системный DNS', system_dns_servers)] + list(dns_servers.items())
|
||||
|
||||
selected_dns_servers = []
|
||||
|
||||
# Если указаны индексы серверов в конфиге
|
||||
if dns_server_indices:
|
||||
if 0 in dns_server_indices: # Если указано 0, выбираем все доступные DNS серверы
|
||||
if 0 in dns_server_indices:
|
||||
selected_dns_servers = dns_server_options
|
||||
else:
|
||||
for idx in dns_server_indices:
|
||||
if 1 <= idx <= len(dns_server_options): # Корректируем индекс на 1 меньше, чтобы соответствовать списку
|
||||
if 1 <= idx <= len(dns_server_options):
|
||||
selected_dns_servers.append(dns_server_options[idx - 1])
|
||||
return selected_dns_servers
|
||||
|
||||
# Если индексы не указаны, запрашиваем у пользователя выбор серверов
|
||||
while True:
|
||||
print(f"\n{yellow('Какие DNS сервера использовать?')}")
|
||||
print(f"\n{yellow('Какие DNS серверы использовать?')}")
|
||||
print("0. Выбрать все")
|
||||
for idx, (name, servers) in enumerate(dns_server_options, 1):
|
||||
print(f"{idx}. {name}: {', '.join(servers)}")
|
||||
@@ -305,8 +387,6 @@ def check_dns_servers(dns_servers, dns_server_indices):
|
||||
|
||||
return selected_dns_servers
|
||||
|
||||
|
||||
# microtik ввод комментария для firewall
|
||||
def mk_list_name_input(mk_list_name):
|
||||
if not mk_list_name:
|
||||
input_mk_list_name = input(f"Введите {green('LIST_NAME')} для Mikrotik firewall: ")
|
||||
@@ -314,148 +394,167 @@ def mk_list_name_input(mk_list_name):
|
||||
else:
|
||||
return mk_list_name
|
||||
|
||||
|
||||
# Для mikrotik уплотняем имена сервисов
|
||||
def mk_comment(selected_service):
|
||||
def comment(selected_service):
|
||||
return ",".join(["".join(word.title() for word in s.split()) for s in selected_service])
|
||||
|
||||
def subnet_input(subnet):
|
||||
if not subnet:
|
||||
choice = input(
|
||||
f"\n{yellow('Объединить IP-адреса в подсети?')}"
|
||||
f"\n1. сократить до {green('/16')} (255.255.0.0)"
|
||||
f"\n2. сократить до {green('/24')} (255.255.255.0)"
|
||||
f"\n3. сократить до {green('/24')} + {green('/32')} (255.255.255.0 и 255.255.255.255)"
|
||||
f"\n{green('Enter')} - пропустить"
|
||||
f"\nВаш выбор: "
|
||||
).strip()
|
||||
|
||||
# Выбор формата сохранения списка разрешенных DNS имен
|
||||
def subnetting(subnet):
|
||||
if subnet.lower() == '': # Если значение пустое, запрашиваем ввод от пользователя
|
||||
subnet = input(f"\n{yellow('Объединить IP-адреса в подсети?')} "
|
||||
f"\n{green('16')} - сократить до /16 (255.255.0.0)"
|
||||
f"\n{green('24')} - сократить до /24 (255.255.255.0)"
|
||||
f"\n{green('Enter')} - пропустить: ").strip().lower()
|
||||
if choice == '1':
|
||||
subnet = '16'
|
||||
elif choice == '2':
|
||||
subnet = '24'
|
||||
elif choice == '3':
|
||||
subnet = 'mix'
|
||||
else:
|
||||
subnet = '32'
|
||||
|
||||
# Обрабатываем ввод или параметр
|
||||
if subnet == '16':
|
||||
return "16", "255.255.0.0"
|
||||
elif subnet == '24':
|
||||
return "24", "255.255.255.0"
|
||||
else:
|
||||
return "32", "255.255.255.255"
|
||||
return subnet if subnet in {'16', '24', 'mix'} else '32'
|
||||
|
||||
|
||||
def group_ips_in_subnets(filename, submask):
|
||||
def group_ips_in_subnets_optimized(filename: str, subnet: str):
|
||||
try:
|
||||
# Чтение всех IP-адресов из файла
|
||||
with open(filename, 'r', encoding='utf-8-sig') as file:
|
||||
ips = {line.strip() for line in file if line.strip()} # Собираем уникальные IP адреса
|
||||
with open(filename, 'r', encoding='utf-8') as file:
|
||||
ips = {line.strip() for line in file if line.strip()}
|
||||
|
||||
# Обработка подсетей в зависимости от маски
|
||||
if submask == "24":
|
||||
# Множество для хранения всех подсетей /24
|
||||
subnets = set()
|
||||
subnets = set()
|
||||
|
||||
# Преобразование всех IP в их подсети /24
|
||||
if subnet == "16":
|
||||
for ip in ips:
|
||||
try:
|
||||
# Преобразуем IP в сеть /24 (маска 255.255.255.0)
|
||||
network_24 = ipaddress.ip_network(f"{ip}/24", strict=False)
|
||||
subnets.add(str(network_24.network_address))
|
||||
except ValueError as e:
|
||||
print(f"{red('Ошибка в IP адресе:')} {ip} - {e}")
|
||||
network = ipaddress.IPv4Network(f"{ip}/16", strict=False)
|
||||
subnets.add(str(network.network_address))
|
||||
except ValueError:
|
||||
continue
|
||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до /16 подсети{Style.RESET_ALL}")
|
||||
|
||||
# Перезаписываем файл с уникальными подсетями /24
|
||||
with open(filename, 'w', encoding='utf-8-sig') as file:
|
||||
for subnet in sorted(subnets):
|
||||
file.write(subnet + '\n')
|
||||
|
||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до /{submask} подсети{Style.RESET_ALL}")
|
||||
|
||||
elif submask == "16":
|
||||
# Множество для хранения всех объединенных подсетей /16
|
||||
subnets = set()
|
||||
|
||||
# Преобразование всех IP в их подсети /16
|
||||
elif subnet == "24":
|
||||
for ip in ips:
|
||||
try:
|
||||
# Преобразуем IP в сеть /16 (маска 255.255.0.0)
|
||||
network_16 = ipaddress.ip_network(f"{ip}/16", strict=False)
|
||||
subnets.add(str(network_16.network_address))
|
||||
except ValueError as e:
|
||||
print(f"{red('Ошибка в IP адресе:')} {ip} - {e}")
|
||||
network = ipaddress.IPv4Network(f"{ip}/24", strict=False)
|
||||
subnets.add(str(network.network_address))
|
||||
except ValueError:
|
||||
continue
|
||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до /24 подсети{Style.RESET_ALL}")
|
||||
|
||||
# Перезаписываем файл с уникальными подсетями /16
|
||||
with open(filename, 'w', encoding='utf-8-sig') as file:
|
||||
for subnet in sorted(subnets):
|
||||
file.write(subnet + '\n')
|
||||
elif subnet == "mix":
|
||||
octet_groups = defaultdict(list)
|
||||
for ip in ips:
|
||||
key = '.'.join(ip.split('.')[:3])
|
||||
octet_groups[key].append(ip)
|
||||
|
||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до /{submask} подсети{Style.RESET_ALL}")
|
||||
for key, group in octet_groups.items():
|
||||
if len(group) > 1:
|
||||
subnets.add(key + '.0')
|
||||
else:
|
||||
subnets.update(group)
|
||||
|
||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до масок /24 и /32{Style.RESET_ALL}")
|
||||
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
for subnet_ip in sorted(subnets, key=lambda x: ipaddress.IPv4Address(x.split('/')[0])):
|
||||
file.write(subnet_ip + '\n')
|
||||
|
||||
except Exception as e:
|
||||
print(f"{red('Ошибка при обработке файла:')} {e}")
|
||||
print(f"Ошибка при обработке файла: {e}")
|
||||
|
||||
|
||||
def process_file_format(filename, filetype, gateway, selected_service, mk_list_name, submask, ken_gateway):
|
||||
def process_file_format(filename, filetype, gateway, selected_service, mk_list_name, mk_comment, subnet, ken_gateway):
|
||||
def read_file(filename):
|
||||
try:
|
||||
with open(filename, 'r', encoding='utf-8-sig') as file:
|
||||
with open(filename, 'r', encoding='utf-8') as file:
|
||||
return file.readlines()
|
||||
except Exception as e:
|
||||
print(f"Ошибка чтения файла: {e}")
|
||||
return None
|
||||
|
||||
def write_file(filename, ips, formatter):
|
||||
if filetype.lower() == 'wireguard':
|
||||
formatted_ips = [formatter(ip.strip()) for ip in ips]
|
||||
with open(filename, 'w', encoding='utf-8-sig') as file:
|
||||
file.write(', '.join(formatted_ips)) # Join with ", " to include a space after each comma
|
||||
else:
|
||||
with open(filename, 'w', encoding='utf-8-sig') as file:
|
||||
for ip in ips:
|
||||
file.write(formatter(ip.strip()) + '\n')
|
||||
formatted_ips = [formatter(ip.strip()) for ip in ips]
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
if filetype.lower() == 'wireguard':
|
||||
file.write(', '.join(formatted_ips))
|
||||
else:
|
||||
file.write('\n'.join(formatted_ips))
|
||||
|
||||
# Определение маски подсети для отображения пользователю и ее корректной записи в файл
|
||||
display_submask = "255.255.0.0" if submask == "16" else "255.255.255.0" if submask == "24" else "255.255.255.255"
|
||||
net_mask = subnet if subnet == "mix" else "255.255.0.0" if subnet == "16" else "255.255.255.0" if subnet == "24" else "255.255.255.255"
|
||||
|
||||
if not filetype:
|
||||
filetype = input(f"""
|
||||
user_input = input(f"""
|
||||
{yellow('В каком формате сохранить файл?')}
|
||||
{green('win')} - route add {cyan('IP')} mask {display_submask} {cyan('GATEWAY')}
|
||||
{green('unix')} - ip route {cyan('IP')}/{submask} {cyan('GATEWAY')}
|
||||
{green('keenetic')} - ip route {cyan('IP')}/{submask} {cyan('GATEWAY GATEWAY_NAME')} auto !{mk_comment(selected_service)}
|
||||
{green('cidr')} - {cyan('IP')}/{submask}
|
||||
{green('mikrotik')} - /ip/firewall/address-list add list={cyan("LIST_NAME")} comment="{mk_comment(selected_service)}" address={cyan("IP")}/{submask}
|
||||
{green('ovpn')} - push "route {cyan('IP')} {display_submask}"
|
||||
{green('wireguard')} - {cyan('IP')}/{submask}, {cyan('IP')}/{submask}, и т.д...
|
||||
1. {green('win')} - route add {cyan('IP')} mask {net_mask} {cyan('GATEWAY')}
|
||||
2. {green('unix')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY')}
|
||||
3. {green('keenetic bat')} - route add {cyan('IP')} mask {net_mask} 0.0.0.0
|
||||
4. {green('keenetic cli')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY GATEWAY_NAME')} auto !{comment(selected_service)}
|
||||
5. {green('cidr')} - {cyan('IP')}/{subnet}
|
||||
6. {green('mikrotik')} - /ip/firewall/address-list add list={cyan("LIST_NAME")}{f' comment="{comment(selected_service)}"' if mk_comment != "off" else ""} address={cyan("IP")}/{subnet}
|
||||
7. {green('ovpn')} - push "route {cyan('IP')} {net_mask}"
|
||||
8. {green('wireguard')} - {cyan('IP')}/{subnet}, {cyan('IP')}/{subnet}, и т.д...
|
||||
{green('Enter')} - {cyan('IP')}
|
||||
Ваш выбор: """)
|
||||
Ваш выбор: """).strip()
|
||||
|
||||
mapping = {
|
||||
'1': 'win',
|
||||
'2': 'unix',
|
||||
'3': 'keenetic bat',
|
||||
'4': 'keenetic cli',
|
||||
'5': 'cidr',
|
||||
'6': 'mikrotik',
|
||||
'7': 'ovpn',
|
||||
'8': 'wireguard'
|
||||
}
|
||||
filetype = mapping.get(user_input, '')
|
||||
|
||||
ips = read_file(filename)
|
||||
if not ips:
|
||||
return
|
||||
|
||||
# Запрашиваем IP шлюза для win и unix
|
||||
if filetype.lower() in ['win', 'unix']:
|
||||
if filetype in ['win', 'unix']:
|
||||
gateway = gateway_input(gateway)
|
||||
|
||||
# Запрашиваем IP шлюза и Имя интерфейса для keenetic
|
||||
if filetype.lower() in ['keenetic']:
|
||||
elif filetype == 'keenetic cli':
|
||||
ken_gateway = ken_gateway_input(ken_gateway)
|
||||
|
||||
# Запрашиваем mk_list_name для Mikrotik
|
||||
if filetype.lower() == 'mikrotik':
|
||||
elif filetype == 'mikrotik':
|
||||
mk_list_name = mk_list_name_input(mk_list_name)
|
||||
|
||||
formatters = {
|
||||
'win': lambda ip: f"route add {ip} mask {display_submask} {gateway}",
|
||||
'unix': lambda ip: f"ip route {ip}/{submask} {gateway}",
|
||||
'keenetic': lambda ip: f"ip route {ip}/{submask} {ken_gateway} auto !{mk_comment(selected_service)}",
|
||||
'cidr': lambda ip: f"{ip}/{submask}",
|
||||
'ovpn': lambda ip: f'push "route {ip} {display_submask}"',
|
||||
'mikrotik': lambda ip: f'/ip/firewall/address-list add list={mk_list_name} comment="{mk_comment(selected_service)}" address={ip}/{submask}',
|
||||
'wireguard': lambda ip: f"{ip}/{submask}"
|
||||
'win': lambda ip: f"route add {ip} mask {net_mask} {gateway}",
|
||||
'unix': lambda ip: f"ip route {ip}/{subnet} {gateway}",
|
||||
'keenetic bat': lambda ip: f"route add {ip} mask {net_mask} 0.0.0.0",
|
||||
'keenetic cli': lambda ip: f"ip route {ip}/{subnet} {ken_gateway} auto !{comment(selected_service)}",
|
||||
'cidr': lambda ip: f"{ip}/{subnet}",
|
||||
'ovpn': lambda ip: f'push "route {ip} {net_mask}"',
|
||||
'mikrotik': lambda ip: f'/ip/firewall/address-list add list={mk_list_name}' + (f' comment="{comment(selected_service)}"' if mk_comment != "off" else "") + f' address={ip}/{subnet}',
|
||||
'wireguard': lambda ip: f"{ip}/{subnet}"
|
||||
}
|
||||
|
||||
if subnet == "mix":
|
||||
if filetype in ['win', 'keenetic bat']:
|
||||
mix_formatter = lambda ip: f"{ip.strip()} mask 255.255.255.0" if ip.endswith('.0') else f"{ip.strip()} mask 255.255.255.255"
|
||||
elif filetype.lower() == 'ovpn':
|
||||
mix_formatter = lambda ip: f"{ip.strip()} 255.255.255.0" if ip.endswith('.0') else f"{ip.strip()} 255.255.255.255"
|
||||
else:
|
||||
mix_formatter = lambda ip: f"{ip.strip()}/24" if ip.endswith('.0') else f"{ip.strip()}/32"
|
||||
|
||||
formatters.update({
|
||||
'win': lambda ip: f"route add {mix_formatter(ip)} {gateway}",
|
||||
'unix': lambda ip: f"ip route {mix_formatter(ip)} {gateway}",
|
||||
'keenetic bat': lambda ip: f"route add {mix_formatter(ip)} 0.0.0.0",
|
||||
'keenetic cli': lambda ip: f"ip route {mix_formatter(ip)} {ken_gateway} auto !{comment(selected_service)}",
|
||||
'cidr': lambda ip: f"{mix_formatter(ip)}",
|
||||
'ovpn': lambda ip: f'push "route {mix_formatter(ip)}"',
|
||||
'mikrotik': lambda ip: f'/ip/firewall/address-list add list={mk_list_name}' + (f' comment="{comment(selected_service)}"' if mk_comment != "off" else "") + f' address={mix_formatter(ip)}',
|
||||
'wireguard': lambda ip: f"{mix_formatter(ip)}"
|
||||
})
|
||||
|
||||
if filetype.lower() in formatters:
|
||||
write_file(filename, ips, formatters[filetype.lower()])
|
||||
|
||||
|
||||
# Стартуем
|
||||
async def main():
|
||||
# Парсинг аргументов командной строки
|
||||
parser = argparse.ArgumentParser(description="DNS resolver script with custom config file.")
|
||||
parser.add_argument(
|
||||
'-c', '--config',
|
||||
@@ -465,87 +564,114 @@ async def main():
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
# Инициализация настроек из переданного конфигурационного файла
|
||||
config_file = args.config
|
||||
service, request_limit, filename, cloudflare, filetype, gateway, run_command, dns_server_indices, mk_list_name, subnet, ken_gateway = read_config(config_file)
|
||||
try:
|
||||
config_file = args.config
|
||||
(service, request_limit, filename, cloudflare, filetype, gateway, run_command,
|
||||
dns_server_indices, mk_list_name, subnet, ken_gateway, localplatform,
|
||||
localdns, mk_comment) = read_config(config_file)
|
||||
|
||||
# Load URLs
|
||||
platform_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platformdb"
|
||||
urls = await load_urls(platform_db_url)
|
||||
|
||||
# Load local DNS names from "custom-dns-list.txt" if it exists
|
||||
local_dns_names = []
|
||||
if os.path.exists('custom-dns-list.txt'):
|
||||
with open('custom-dns-list.txt', 'r', encoding='utf-8-sig') as file:
|
||||
local_dns_names = [line.strip() for line in file if line.strip()]
|
||||
|
||||
# Выбор платформ
|
||||
selected_services = check_service_config(service, urls, local_dns_names)
|
||||
|
||||
# Загрузка списка DNS-серверов
|
||||
dns_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/dnsdb"
|
||||
dns_servers = await load_dns_servers(dns_db_url)
|
||||
|
||||
# Выбор DNS-серверов
|
||||
selected_dns_servers = check_dns_servers(dns_servers, dns_server_indices)
|
||||
|
||||
# Инициализация IP-адресов Cloudflare
|
||||
cloudflare_ips = await get_cloudflare_ips()
|
||||
|
||||
# Фильтр Cloudflare
|
||||
include_cloudflare = check_include_cloudflare(cloudflare)
|
||||
|
||||
unique_ips_all_services = set()
|
||||
semaphore = init_semaphores(request_limit)
|
||||
null_ips_count = [0]
|
||||
cloudflare_ips_count = [0]
|
||||
total_domains_processed = [0]
|
||||
tasks = []
|
||||
|
||||
for service in selected_services:
|
||||
if service == 'Custom DNS list':
|
||||
tasks.append(resolve_dns(service, local_dns_names, selected_dns_servers, cloudflare_ips,
|
||||
unique_ips_all_services, semaphore, null_ips_count, cloudflare_ips_count,
|
||||
total_domains_processed, include_cloudflare))
|
||||
if localplatform in ['yes', 'y']:
|
||||
urls = await load_urls_from_file()
|
||||
else:
|
||||
dns_names_url = urls[service]
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(dns_names_url)
|
||||
response.raise_for_status()
|
||||
dns_names = response.text.splitlines()
|
||||
tasks.append(resolve_dns(service, dns_names, selected_dns_servers, cloudflare_ips, unique_ips_all_services,
|
||||
semaphore, null_ips_count, cloudflare_ips_count, total_domains_processed,
|
||||
include_cloudflare))
|
||||
urls = await load_urls(platform_db_url)
|
||||
|
||||
results = await asyncio.gather(*tasks)
|
||||
local_dns_names = []
|
||||
if os.path.exists('custom-dns-list.txt'):
|
||||
with open('custom-dns-list.txt', 'r', encoding='utf-8') as file:
|
||||
local_dns_names = [line.strip() for line in file if line.strip()]
|
||||
|
||||
with open(filename, 'w', encoding='utf-8-sig') as file:
|
||||
for result in results:
|
||||
file.write(result)
|
||||
selected_services = check_service_config(service, urls, local_dns_names)
|
||||
|
||||
print(f"\n{yellow('Проверка завершена.')}")
|
||||
print(f"{Style.BRIGHT}Использовались DNS сервера:{Style.RESET_ALL} " + ', '.join(
|
||||
[f'{pair[0]} ({", ".join(pair[1])})' for pair in selected_dns_servers]))
|
||||
print(f"{Style.BRIGHT}Всего обработано DNS имен:{Style.RESET_ALL} {total_domains_processed[0]}")
|
||||
if include_cloudflare:
|
||||
print(f"{Style.BRIGHT}Исключено IP-адресов Cloudflare:{Style.RESET_ALL} {cloudflare_ips_count[0]}")
|
||||
print(f"{Style.BRIGHT}Исключено IP-адресов 'заглушек':{Style.RESET_ALL} {null_ips_count[0]}")
|
||||
print(f"{Style.BRIGHT}Разрешено IP-адресов из DNS имен:{Style.RESET_ALL} {len(unique_ips_all_services)}")
|
||||
if localdns in ['yes', 'y']:
|
||||
dns_servers = await load_dns_from_file()
|
||||
else:
|
||||
dns_servers = await load_dns_servers(dns_db_url)
|
||||
|
||||
# Группировка IP-адресов в подсети
|
||||
submask, _ = subnetting(subnet)
|
||||
group_ips_in_subnets(filename, submask)
|
||||
selected_dns_servers = check_dns_servers(dns_servers, dns_server_indices)
|
||||
|
||||
process_file_format(filename, filetype, gateway, selected_services, mk_list_name, submask, ken_gateway)
|
||||
include_cloudflare = check_include_cloudflare(cloudflare)
|
||||
if include_cloudflare:
|
||||
cloudflare_ips = await get_cloudflare_ips()
|
||||
else:
|
||||
cloudflare_ips = set()
|
||||
|
||||
if run_command:
|
||||
print("\nВыполнение команды после завершения скрипта...")
|
||||
os.system(run_command)
|
||||
else:
|
||||
print(f"\n{Style.BRIGHT}Результаты сохранены в файл:{Style.RESET_ALL}", filename)
|
||||
if os.name == 'nt':
|
||||
input(f"Нажмите {green('Enter')} для выхода...")
|
||||
unique_ips_all_services = set()
|
||||
semaphore = init_semaphores(request_limit)
|
||||
|
||||
stats = {
|
||||
'null_ips_count': 0,
|
||||
'cloudflare_ips_count': 0,
|
||||
'total_domains_processed': 0,
|
||||
'domain_errors': 0
|
||||
}
|
||||
|
||||
tasks = []
|
||||
|
||||
for service_name in selected_services:
|
||||
if service_name == 'Custom DNS list':
|
||||
tasks.append(resolve_dns_optimized(
|
||||
service_name, local_dns_names, selected_dns_servers,
|
||||
cloudflare_ips, unique_ips_all_services, semaphore,
|
||||
stats, include_cloudflare
|
||||
))
|
||||
else:
|
||||
url_or_file = urls[service_name]
|
||||
dns_names = await load_dns_names(url_or_file)
|
||||
if dns_names:
|
||||
tasks.append(resolve_dns_optimized(
|
||||
service_name, dns_names, selected_dns_servers,
|
||||
cloudflare_ips, unique_ips_all_services, semaphore,
|
||||
stats, include_cloudflare
|
||||
))
|
||||
|
||||
if tasks:
|
||||
results = await asyncio.gather(*tasks, return_exceptions=True)
|
||||
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
for result in results:
|
||||
if isinstance(result, str) and result.strip():
|
||||
file.write(result)
|
||||
else:
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
pass
|
||||
|
||||
print(f"\n{yellow('Проверка завершена.')}")
|
||||
print(f"{Style.BRIGHT}Всего обработано DNS имен:{Style.RESET_ALL} {stats['total_domains_processed']}")
|
||||
print(f"{Style.BRIGHT}Разрешено IP-адресов из DNS имен:{Style.RESET_ALL} {len(unique_ips_all_services)}")
|
||||
print(f"{Style.BRIGHT}Ошибок разрешения доменов:{Style.RESET_ALL} {stats['domain_errors']}")
|
||||
if stats['null_ips_count'] > 0:
|
||||
print(f"{Style.BRIGHT}Исключено IP-адресов 'заглушек':{Style.RESET_ALL} {stats['null_ips_count']}")
|
||||
if include_cloudflare:
|
||||
print(f"{Style.BRIGHT}Исключено IP-адресов Cloudflare:{Style.RESET_ALL} {stats['cloudflare_ips_count']}")
|
||||
print(f"{Style.BRIGHT}Использовались DNS серверы:{Style.RESET_ALL} " + ', '.join(
|
||||
[f'{pair[0]} ({", ".join(pair[1])})' for pair in selected_dns_servers]))
|
||||
|
||||
|
||||
subnet = subnet_input(subnet)
|
||||
if subnet != '32':
|
||||
group_ips_in_subnets_optimized(filename, subnet)
|
||||
|
||||
process_file_format(filename, filetype, gateway, selected_services, mk_list_name, mk_comment, subnet, ken_gateway)
|
||||
|
||||
if run_command:
|
||||
print("\nВыполнение команды после завершения скрипта...")
|
||||
os.system(run_command)
|
||||
else:
|
||||
print(f"\n{Style.BRIGHT}Результаты сохранены в файл:{Style.RESET_ALL}", filename)
|
||||
if os.name == 'nt':
|
||||
input(f"Нажмите {green('Enter')} для выхода...")
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print(f"\n{red('Программа прервана пользователем')}")
|
||||
except Exception as e:
|
||||
print(f"\n{red('Критическая ошибка:')} {e}")
|
||||
finally:
|
||||
await cleanup_http_client()
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
try:
|
||||
asyncio.run(main())
|
||||
except KeyboardInterrupt:
|
||||
print(f"\n{red('Программа прервана пользователем')}")
|
||||
except Exception as e:
|
||||
print(f"\n{red('Критическая ошибка:')} {e}")
|
||||
|
||||
130
old/config.ini
Normal file
130
old/config.ini
Normal file
@@ -0,0 +1,130 @@
|
||||
[DomainMapper]
|
||||
# Локальный режим - загружать список сервисов и/или DNS серверов из локального файла
|
||||
# yes - включить
|
||||
# no или пусто - выключить
|
||||
localplatform = yes
|
||||
localdns = yes
|
||||
|
||||
# Имена сервисов, разделенные запятыми, для разрешения доменных имен в IP-адреса без запроса у пользователя
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# all - проверить все сервисы
|
||||
# Antifilter community edition - список заблокированных DNS имен формируемый сообществом
|
||||
# ITDog Inside - ресурсы, в том числе зарубежные, которые блокируются или сами блокируют доступ из России.
|
||||
# ITDog Outside - ресурсы, которые доступны только внутри России и блокируют доступ из-за рубежа.
|
||||
# Youtube
|
||||
# Facebook
|
||||
# Openai
|
||||
# Tik-Tok
|
||||
# Instagram
|
||||
# Twitter
|
||||
# Netflix
|
||||
# Bing
|
||||
# Adobe
|
||||
# Apple
|
||||
# Google
|
||||
# Torrent Trackers - торрент трекеры
|
||||
# Search engines - поисковые системы
|
||||
# Github Copilot - ИИ помощник от github
|
||||
# Twitch
|
||||
# Discord
|
||||
# Jetbrains
|
||||
# Xbox
|
||||
# Telegram
|
||||
# Online movie theaters - некоторые из популярных оналйн кинотеатров
|
||||
# custom - Custom DNS list, это файл "custom-dns-list.txt" расположенный в одном каталоге со скриптом
|
||||
service =
|
||||
|
||||
# DNS сервера (номер), разделенные пробелом, которые будут использоваться для разрешения доменных имен
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# 0 - использовать все доступные DNS серверы
|
||||
# 1 - Системный DNS
|
||||
# 2 - Google Public DNS
|
||||
# 3 - Quad9
|
||||
# 4 - Cloudflare DNS
|
||||
# 5 - OpenDNS
|
||||
# 6 - Cisco Umbrella
|
||||
# 7 - DNS.Watch
|
||||
# 8 - Dyn
|
||||
# 9 - CleanBrowsing
|
||||
# 10 - Alternate DNS
|
||||
# 11 - AdGuard DNS
|
||||
# 12 - Control D
|
||||
# 13 - Yandex (основной)
|
||||
dnsserver =
|
||||
|
||||
# Включить фильтрацию IP-адресов cloudflare и не записывать их в файл результатов
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# yes - исключить IP адреса cloudflare из итогового списка
|
||||
# no - оставить IP адреса cloudflare в итоговом списке
|
||||
cloudflare =
|
||||
|
||||
# Сгруппировать подсети
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# 16 - группировка подсетей до /16 (255.255.0.0)
|
||||
# 24 - группировка подсетей до /24 (255.255.255.0)
|
||||
# mix - /24 и /32 в одном файле
|
||||
# no - оставить как есть
|
||||
subnet =
|
||||
|
||||
# Имя конечного файла
|
||||
# опции:
|
||||
# пустое значение - "domain-ip-resolve.txt" в каталоге со скриптом
|
||||
# имя_файла - файл с указанным именем будет сохранен в каталоге со скриптом
|
||||
# полный_путь/имя_файла - файл будет сохранен с указанным именем в указанной каталоге
|
||||
filename =
|
||||
|
||||
# Количество потоков сканирования, если не указано - будет использоваться 20 потоков
|
||||
threads = 5
|
||||
|
||||
# Формат сохранения файла результатов
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведено меню выбора
|
||||
# ip - только IP адрес
|
||||
# unix - ip rote %IP%/32 %gateway%
|
||||
# cidr - %IP%/32
|
||||
# win - rote add %IP% mask 255.255.255.255 %gateway%
|
||||
# mikrotik - /ip/firewall/address-list add list=%LIST_NAME% comment=%SERVICE_NAME% address=%IP%/32
|
||||
# ovpn - push "route %IP% 255.255.255.255"
|
||||
# wireguard - %IP%/32, и т.д...
|
||||
# keenetic - ip route %IP%/32 %gateway% auto !%LIST_NAME%
|
||||
filetype =
|
||||
|
||||
# адрес шлюза или имя интерфейса - используется при сохранении IP-адресов в 'win' и 'unix' формате
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведен запрос с подсказкой
|
||||
# укажите IP-адрес шлюза или имя интерфейса
|
||||
gateway =
|
||||
|
||||
# адрес шлюза или имя интерфейса - используется при сохранении IP-адресов в 'keenetic' формате
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведен запрос с подсказкой
|
||||
# укажите IP-адрес шлюза или имя интерфейса или IP-адрес шлюза и через пробел имя интерфейса
|
||||
keenetic =
|
||||
|
||||
# имя списка - используется при сохранении IP-адресов в 'mikrotik' формате
|
||||
# опции:
|
||||
# пустое значение - пользователю будет выведен запрос с подсказкой
|
||||
# укажите имя
|
||||
listname =
|
||||
|
||||
# комментарий - используется при сохранении IP-адресов в 'mikrotik' формате
|
||||
# опции:
|
||||
# on - если вам нужен comment=%SERVICE_NAME% в строке
|
||||
# off - убрать comment=%SERVICE_NAME% из строки
|
||||
mk_comment = off
|
||||
|
||||
|
||||
# Показывать сведения о загруженной конфигурации при запуске скрипта
|
||||
# опции:
|
||||
# yes или пустое значение - показывать
|
||||
# no - скрыть
|
||||
cfginfo = yes
|
||||
|
||||
# Команда для консоли после завершения скриптом всех операций, может быть полезно для автоматизации и комбинирования с другим скриптом, кодом или программой
|
||||
# опции:
|
||||
# исполняемая_команда_для_консоли
|
||||
run =
|
||||
641
old/main.py
Normal file
641
old/main.py
Normal file
@@ -0,0 +1,641 @@
|
||||
import argparse
|
||||
import asyncio
|
||||
import configparser
|
||||
import ipaddress
|
||||
import os
|
||||
from asyncio import Semaphore
|
||||
from collections import defaultdict
|
||||
|
||||
import dns.asyncresolver
|
||||
import httpx
|
||||
from colorama import Fore, Style, init
|
||||
|
||||
# Цвета
|
||||
init(autoreset=True)
|
||||
|
||||
|
||||
def yellow(text):
|
||||
return f"{Fore.YELLOW}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def green(text):
|
||||
return f"{Fore.GREEN}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def cyan(text):
|
||||
return f"{Fore.CYAN}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def red(text):
|
||||
return f"{Fore.RED}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def magneta(text):
|
||||
return f"{Fore.MAGENTA}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def blue(text):
|
||||
return f"{Fore.BLUE}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
# Читаем конфигурацию
|
||||
def read_config(cfg_file):
|
||||
try:
|
||||
config = configparser.ConfigParser()
|
||||
with open(cfg_file, 'r', encoding='utf-8') as file:
|
||||
config.read_file(file)
|
||||
if 'DomainMapper' in config:
|
||||
config = config['DomainMapper']
|
||||
service = config.get('service') or ''
|
||||
request_limit = int(config.get('threads') or 20)
|
||||
filename = config.get('filename') or 'domain-ip-resolve.txt'
|
||||
cloudflare = config.get('cloudflare') or ''
|
||||
filetype = config.get('filetype') or ''
|
||||
gateway = config.get('gateway') or ''
|
||||
run_command = config.get('run') or ''
|
||||
dns_server_indices = list(map(int, config.get('dnsserver', '').split())) if config.get('dnsserver') else []
|
||||
mk_list_name = config.get('listname') or ''
|
||||
subnet = config.get('subnet') or ''
|
||||
cfginfo = config.get('cfginfo') or 'yes' # Не возвращаем его в main
|
||||
ken_gateway = config.get('keenetic') or ''
|
||||
localplatform = config.get('localplatform') or ''
|
||||
localdns = config.get('localdns') or ''
|
||||
mk_comment = config.get('mk_comment') or 'off'
|
||||
|
||||
if cfginfo in ['yes', 'y']:
|
||||
print(f"{yellow(f'Загружена конфигурация из {cfg_file}:')}")
|
||||
print(f"{Style.BRIGHT}Сервисы для проверки:{Style.RESET_ALL} {service if service else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Использовать DNS сервер:{Style.RESET_ALL} {dns_server_indices if dns_server_indices else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Количество одновременных запросов к одному DNS серверу:{Style.RESET_ALL} {request_limit}")
|
||||
print(f"{Style.BRIGHT}Фильтрация IP-адресов Cloudflare:{Style.RESET_ALL} {'включена' if cloudflare in ['y', 'yes'] else 'вЫключена' if cloudflare in ['n', 'no'] else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Агрегация IP-адресов:{Style.RESET_ALL} {'mix режим /24 (255.255.255.0) + /32 (255.255.255.255)' if subnet == 'mix' else 'до /16 подсети (255.255.0.0)' if subnet == '16' else 'до /24 подсети (255.255.255.0)' if subnet == '24' else 'вЫключена' if subnet in ['n', 'no'] else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}Формат сохранения:{Style.RESET_ALL} {'только IP' if filetype == 'ip' else 'Linux route' if filetype == 'unix' else 'CIDR-нотация' if filetype == 'cidr' else 'Windows route' if filetype == 'win' else 'Mikrotik CLI' if filetype == 'mikrotik' else 'open vpn' if filetype == 'ovpn' else 'Keenetic CLI' if filetype == 'keenetic' else 'Wireguard' if filetype == 'wireguard' else 'спросить у пользователя'}")
|
||||
if filetype in ['win', 'unix', '']:
|
||||
print(f"{Style.BRIGHT}Шлюз/Имя интерфейса для Windows и Linux route:{Style.RESET_ALL} {gateway if gateway else 'спросить у пользователя'}")
|
||||
if filetype in ['keenetic', '']:
|
||||
print(f"{Style.BRIGHT}Шлюз/Имя интерфейса для Keenetic CLI:{Style.RESET_ALL} {ken_gateway if ken_gateway else 'спросить у пользователя'}")
|
||||
if filetype in ['mikrotik', '']:
|
||||
print(f"{Style.BRIGHT}Имя списка для Mikrotik firewall:{Style.RESET_ALL} {mk_list_name if mk_list_name else 'спросить у пользователя'}")
|
||||
print(f"{Style.BRIGHT}'comment=' в Mikrotik firewall:{Style.RESET_ALL} {'вЫключен' if mk_comment == 'off' else 'включен'}")
|
||||
print(f"{Style.BRIGHT}Сохранить результат в файл:{Style.RESET_ALL} {filename}")
|
||||
print(f"{Style.BRIGHT}Выполнить по завершению:{Style.RESET_ALL} {run_command if run_command else 'не указано'}")
|
||||
if localplatform in ['yes', 'y'] or localdns in ['yes', 'y']:
|
||||
print(f"\n{red('!!! Включен локальный режим !!!')}")
|
||||
print(f"{Style.BRIGHT}Список сервисов будет загружен из:{Style.RESET_ALL} {'файла platformdb' if localplatform in ['yes', 'y'] else 'сети'}")
|
||||
print(f"{Style.BRIGHT}Список DNS серверов будет загружен из:{Style.RESET_ALL} {'файла dnsdb' if localdns in ['yes', 'y'] else 'сети'}")
|
||||
|
||||
return service, request_limit, filename, cloudflare, filetype, gateway, run_command, dns_server_indices, mk_list_name, subnet, ken_gateway, localplatform, localdns, mk_comment
|
||||
|
||||
except Exception as e:
|
||||
print(f"{yellow(f'Ошибка загрузки {cfg_file}:')} {e}\n{Style.BRIGHT}Используются настройки 'по умолчанию'.{Style.RESET_ALL}")
|
||||
return '', 20, 'domain-ip-resolve.txt', '', '', '', '', [], '', '', '', '', '', 'off'
|
||||
|
||||
|
||||
# IP шлюза для win и unix
|
||||
def gateway_input(gateway):
|
||||
if not gateway:
|
||||
input_gateway = input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')}: ")
|
||||
return input_gateway.strip() if input_gateway else None
|
||||
else:
|
||||
return gateway
|
||||
|
||||
|
||||
# IP шлюза и имя интерфейса для keenetic
|
||||
def ken_gateway_input(ken_gateway):
|
||||
if not ken_gateway:
|
||||
input_ken_gateway = input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')} или {green('IP шлюза')} и через пробел {green('имя интерфейса')}: ")
|
||||
return input_ken_gateway.strip() if input_ken_gateway else None
|
||||
else:
|
||||
return ken_gateway
|
||||
|
||||
|
||||
# Ограничение числа запросов
|
||||
def get_semaphore(request_limit):
|
||||
return defaultdict(lambda: Semaphore(request_limit))
|
||||
|
||||
|
||||
# Инициализация semaphore для ограничения запросов
|
||||
def init_semaphores(request_limit):
|
||||
return get_semaphore(request_limit)
|
||||
|
||||
|
||||
# Загрузка списка платформ из сети
|
||||
async def load_urls(url):
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(url)
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
lines = text.split('\n')
|
||||
urls = {}
|
||||
for line in lines:
|
||||
if line.strip():
|
||||
service, url = line.split(': ', 1)
|
||||
urls[service.strip()] = url.strip()
|
||||
return urls
|
||||
except Exception as e:
|
||||
print(f"Ошибка при загрузке списка платформ: {e}")
|
||||
return {}
|
||||
|
||||
|
||||
# Загрузка списка платформ из локального файла
|
||||
async def load_urls_from_file():
|
||||
try:
|
||||
with open('platformdb', 'r', encoding='utf-8') as file:
|
||||
urls = {}
|
||||
for line in file:
|
||||
if line.strip():
|
||||
service, url = line.split(': ', 1)
|
||||
urls[service.strip()] = url.strip()
|
||||
return urls
|
||||
except Exception as e:
|
||||
print(f"Ошибка при загрузке списка платформ: {e}")
|
||||
return {}
|
||||
|
||||
|
||||
# Загрузка списка DNS серверов
|
||||
async def load_dns_servers(url):
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(url)
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
lines = text.split('\n')
|
||||
dns_servers = {}
|
||||
for line in lines:
|
||||
if line.strip():
|
||||
service, servers = line.split(': ', 1)
|
||||
dns_servers[service.strip()] = servers.strip().split()
|
||||
return dns_servers
|
||||
except Exception as e:
|
||||
print(f"Ошибка при загрузке списка DNS серверов: {e}")
|
||||
return {}
|
||||
|
||||
|
||||
# Загрузка списка DNS серверов из локального файла
|
||||
async def load_dns_from_file():
|
||||
try:
|
||||
with open('dnsdb', 'r') as file:
|
||||
dns_servers = {}
|
||||
for line in file:
|
||||
if line.strip():
|
||||
service, servers = line.split(': ', 1)
|
||||
dns_servers[service.strip()] = servers.strip().split()
|
||||
return dns_servers
|
||||
except Exception as e:
|
||||
print(f"Ошибка при загрузке списка DNS серверов: {e}")
|
||||
return {}
|
||||
|
||||
|
||||
# Загрузка IP-адресов cloudflare
|
||||
async def get_cloudflare_ips():
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get("https://www.cloudflare.com/ips-v4/")
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
cloudflare_ips = set()
|
||||
for line in text.splitlines():
|
||||
line = line.strip()
|
||||
if '/' in line:
|
||||
try:
|
||||
ip_network = ipaddress.ip_network(line)
|
||||
for ip in ip_network:
|
||||
cloudflare_ips.add(str(ip))
|
||||
except ValueError:
|
||||
continue
|
||||
return cloudflare_ips
|
||||
except Exception as e:
|
||||
print("Ошибка при получении IP адресов Cloudflare:", e)
|
||||
return set()
|
||||
|
||||
|
||||
# Загрузка списков DNS имен из сети и локальных файлов
|
||||
async def load_dns_names(url_or_file):
|
||||
if url_or_file.startswith("http"):
|
||||
async with httpx.AsyncClient() as client:
|
||||
try:
|
||||
response = await client.get(url_or_file)
|
||||
response.raise_for_status()
|
||||
return response.text.splitlines()
|
||||
except httpx.HTTPStatusError as e:
|
||||
print(f"Ошибка при загрузке DNS имен: {e}")
|
||||
return []
|
||||
else:
|
||||
# Локальный файл
|
||||
with open(url_or_file, 'r', encoding='utf-8') as file:
|
||||
return file.read().splitlines()
|
||||
|
||||
|
||||
async def resolve_domain(domain, resolver, semaphore, dns_server_name, null_ips_count, cloudflare_ips,
|
||||
cloudflare_ips_count, total_domains_processed, include_cloudflare):
|
||||
async with semaphore:
|
||||
try:
|
||||
total_domains_processed[0] += 1
|
||||
response = await resolver.resolve(domain)
|
||||
ips = [ip.address for ip in response]
|
||||
filtered_ips = []
|
||||
for ip_address in ips:
|
||||
if ip_address in ('127.0.0.1', '0.0.0.0') or ip_address in resolver.nameservers:
|
||||
null_ips_count[0] += 1
|
||||
elif include_cloudflare and ip_address in cloudflare_ips:
|
||||
cloudflare_ips_count[0] += 1
|
||||
else:
|
||||
filtered_ips.append(ip_address)
|
||||
print(f"{Fore.BLUE}{domain} IP-адрес: {ip_address} - {dns_server_name}{Style.RESET_ALL}")
|
||||
return filtered_ips
|
||||
except Exception as e: # Ловим все ошибки чтобы код не прервался
|
||||
print(f"{Fore.RED}Не удалось получить IP-адрес: {domain} - {dns_server_name}{Style.RESET_ALL}")
|
||||
return []
|
||||
|
||||
|
||||
async def resolve_dns(service, dns_names, dns_servers, cloudflare_ips, unique_ips_all_services, semaphore,
|
||||
null_ips_count, cloudflare_ips_count, total_domains_processed, include_cloudflare):
|
||||
try:
|
||||
print(f"{Fore.YELLOW}Загрузка DNS имен платформы {service}...{Style.RESET_ALL}")
|
||||
|
||||
tasks = []
|
||||
for server_name, servers in dns_servers:
|
||||
resolver = dns.asyncresolver.Resolver()
|
||||
resolver.nameservers = servers
|
||||
for domain in dns_names:
|
||||
domain = domain.strip()
|
||||
if domain:
|
||||
tasks.append(resolve_domain(domain, resolver, semaphore[server_name], server_name, null_ips_count,
|
||||
cloudflare_ips, cloudflare_ips_count, total_domains_processed,
|
||||
include_cloudflare))
|
||||
|
||||
results = await asyncio.gather(*tasks)
|
||||
|
||||
unique_ips_current_service = set()
|
||||
for result in results:
|
||||
for ip_address in result:
|
||||
if ip_address not in unique_ips_all_services:
|
||||
unique_ips_current_service.add(ip_address)
|
||||
unique_ips_all_services.add(ip_address)
|
||||
|
||||
return '\n'.join(unique_ips_current_service) + '\n'
|
||||
except Exception as e:
|
||||
print(f"Не удалось сопоставить IP адреса {service} его доменным именам.", e)
|
||||
return ""
|
||||
|
||||
|
||||
def check_service_config(service, urls, local_dns_names):
|
||||
if service:
|
||||
services = [s.strip() for s in service.split(',')]
|
||||
if "custom" in services:
|
||||
services.remove("custom")
|
||||
if local_dns_names:
|
||||
services.append("Custom DNS list")
|
||||
if "all" in services:
|
||||
services = list(urls.keys())
|
||||
if local_dns_names and "Custom DNS list" not in services:
|
||||
services.append("Custom DNS list")
|
||||
elif not services:
|
||||
services = list(urls.keys())
|
||||
if local_dns_names and "Custom DNS list" not in services:
|
||||
services.append("Custom DNS list")
|
||||
else:
|
||||
while True:
|
||||
print(f"\n{yellow('Выберите сервисы:')}")
|
||||
print("0. Выбрать все")
|
||||
for idx, (service, url) in enumerate(urls.items(), 1):
|
||||
print(f"{idx}. {service.capitalize()}")
|
||||
if local_dns_names:
|
||||
print(f"{len(urls) + 1}. Custom DNS list")
|
||||
|
||||
selection = input(f"\nУкажите {green('номера')} платформ через пробел и нажмите {green('Enter')}: ")
|
||||
if selection.strip():
|
||||
selections = selection.split()
|
||||
if '0' in selections:
|
||||
services = list(urls.keys())
|
||||
if local_dns_names and "Custom DNS list" not in services:
|
||||
services.append('Custom DNS list')
|
||||
break
|
||||
else:
|
||||
services = [list(urls.keys())[int(sel) - 1] for sel in selections if sel.isdigit()
|
||||
and 1 <= int(sel) <= len(urls)]
|
||||
if str(len(urls) + 1) in selections and local_dns_names:
|
||||
services.append('Custom DNS list')
|
||||
break
|
||||
return services
|
||||
|
||||
|
||||
# Промт cloudflare фильтр
|
||||
def check_include_cloudflare(cloudflare):
|
||||
if cloudflare in ['yes', 'y', 'no', 'n']:
|
||||
return cloudflare in ['yes', 'y']
|
||||
return input(f"\n{yellow('Исключить IP адреса Cloudflare из итогового списка?')}"
|
||||
f"\n{green('yes')} - исключить"
|
||||
f"\n{green('Enter')} - оставить: ").strip().lower() in ['yes', 'y']
|
||||
|
||||
def check_dns_servers(dns_servers, dns_server_indices):
|
||||
# Получение системных DNS серверов
|
||||
system_dns_servers = dns.asyncresolver.Resolver().nameservers
|
||||
|
||||
# Формирование списка всех доступных серверов
|
||||
dns_server_options = [('Системный DNS', system_dns_servers)] + list(dns_servers.items())
|
||||
|
||||
selected_dns_servers = []
|
||||
|
||||
# Если указаны индексы серверов в конфиге
|
||||
if dns_server_indices:
|
||||
if 0 in dns_server_indices: # Если указано 0, выбираем все доступные DNS серверы
|
||||
selected_dns_servers = dns_server_options
|
||||
else:
|
||||
for idx in dns_server_indices:
|
||||
if 1 <= idx <= len(dns_server_options): # Корректируем индекс на 1 меньше, чтобы соответствовать списку
|
||||
selected_dns_servers.append(dns_server_options[idx - 1])
|
||||
return selected_dns_servers
|
||||
|
||||
# Если индексы не указаны, запрашиваем у пользователя выбор серверов
|
||||
while True:
|
||||
print(f"\n{yellow('Какие DNS сервера использовать?')}")
|
||||
print("0. Выбрать все")
|
||||
for idx, (name, servers) in enumerate(dns_server_options, 1):
|
||||
print(f"{idx}. {name}: {', '.join(servers)}")
|
||||
|
||||
selection = input(f"\nУкажите {green('номера')} DNS серверов через пробел и нажмите {green('Enter')}: ")
|
||||
if selection.strip():
|
||||
selections = selection.split()
|
||||
if '0' in selections:
|
||||
selected_dns_servers = dns_server_options
|
||||
break
|
||||
else:
|
||||
for sel in selections:
|
||||
if sel.isdigit():
|
||||
sel = int(sel)
|
||||
if 1 <= sel <= len(dns_server_options):
|
||||
selected_dns_servers.append(dns_server_options[sel - 1])
|
||||
break
|
||||
|
||||
return selected_dns_servers
|
||||
|
||||
|
||||
# комментарй для microtik firewall
|
||||
def mk_list_name_input(mk_list_name):
|
||||
if not mk_list_name:
|
||||
input_mk_list_name = input(f"Введите {green('LIST_NAME')} для Mikrotik firewall: ")
|
||||
return input_mk_list_name.strip() if input_mk_list_name else None
|
||||
else:
|
||||
return mk_list_name
|
||||
|
||||
|
||||
# Уплотняем имена сервисов
|
||||
def comment(selected_service):
|
||||
return ",".join(["".join(word.title() for word in s.split()) for s in selected_service])
|
||||
|
||||
|
||||
# Промт на объединение IP в подсети
|
||||
def subnet_input(subnet):
|
||||
if not subnet: # Проверяем, является ли значение пустым
|
||||
subnet = input(
|
||||
f"\n{yellow('Объединить IP-адреса в подсети?')} "
|
||||
f"\n{green('16')} - сократить до /16 (255.255.0.0)"
|
||||
f"\n{green('24')} - сократить до /24 (255.255.255.0)"
|
||||
f"\n{green('mix')} - сократить до /24 (255.255.255.0) и /32 (255.255.255.255)"
|
||||
f"\n{green('Enter')} - пропустить: "
|
||||
).strip().lower()
|
||||
|
||||
return subnet if subnet in {'16', '24', 'mix'} else '32'
|
||||
|
||||
|
||||
# Агрегация маршрутов
|
||||
def group_ips_in_subnets(filename, subnet):
|
||||
try:
|
||||
with open(filename, 'r', encoding='utf-8') as file:
|
||||
ips = {line.strip() for line in file if line.strip()} # Собираем уникальные IP адреса
|
||||
|
||||
subnets = set()
|
||||
|
||||
def process_ips(subnet):
|
||||
for ip in ips:
|
||||
try:
|
||||
if subnet == "16":
|
||||
# Преобразуем в /16 (два последних октета заменяются на 0.0)
|
||||
network = ipaddress.IPv4Network(f"{ip}/16", strict=False)
|
||||
subnets.add(f"{network.network_address}")
|
||||
elif subnet == "24":
|
||||
# Преобразуем в /24 (последний октет заменяется на 0)
|
||||
network = ipaddress.IPv4Network(f"{ip}/24", strict=False)
|
||||
subnets.add(f"{network.network_address}")
|
||||
except ValueError as e:
|
||||
print(f"Ошибка в IP адресе: {ip} - {e}")
|
||||
|
||||
if subnet in ["24", "16"]:
|
||||
process_ips(subnet)
|
||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до /{subnet} подсети{Style.RESET_ALL}")
|
||||
|
||||
elif subnet == "mix":
|
||||
octet_groups = {}
|
||||
for ip in ips:
|
||||
key = '.'.join(ip.split('.')[:3]) # Группировка по первым трем октетам
|
||||
if key not in octet_groups:
|
||||
octet_groups[key] = []
|
||||
octet_groups[key].append(ip)
|
||||
|
||||
# IP-адреса с совпадающими первыми тремя октетами
|
||||
network_24 = {key + '.0' for key, group in octet_groups.items() if
|
||||
len(group) > 1} # Базовый IP для /24 подсетей
|
||||
# Удаляем IP с совпадающими первыми тремя октетами из множества
|
||||
ips -= {ip for group in octet_groups.values() if len(group) > 1 for ip in group}
|
||||
# Оставляем только IP без указания маски для /24 и одиночных IP
|
||||
subnets.update(ips) # IP без маски для одиночных IP
|
||||
subnets.update(network_24) # Базовые IP для /24 подсетей
|
||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до масок /24 и /32{Style.RESET_ALL}")
|
||||
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
for subnet in sorted(subnets):
|
||||
file.write(subnet + '\n')
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка при обработке файла: {e}")
|
||||
|
||||
|
||||
# Выбор формата сохранения результатов
|
||||
def process_file_format(filename, filetype, gateway, selected_service, mk_list_name, mk_comment, subnet, ken_gateway):
|
||||
def read_file(filename):
|
||||
try:
|
||||
with open(filename, 'r', encoding='utf-8') as file:
|
||||
return file.readlines()
|
||||
except Exception as e:
|
||||
print(f"Ошибка чтения файла: {e}")
|
||||
return None
|
||||
|
||||
def write_file(filename, ips, formatter):
|
||||
formatted_ips = [formatter(ip.strip()) for ip in ips]
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
if filetype.lower() == 'wireguard':
|
||||
file.write(', '.join(formatted_ips))
|
||||
else:
|
||||
file.write('\n'.join(formatted_ips))
|
||||
|
||||
# Определение маски подсети
|
||||
net_mask = subnet if subnet == "mix" else "255.255.0.0" if subnet == "16" else "255.255.255.0" if subnet == "24" else "255.255.255.255"
|
||||
|
||||
if not filetype:
|
||||
filetype = input(f"""
|
||||
{yellow('В каком формате сохранить файл?')}
|
||||
{green('win')} - route add {cyan('IP')} mask {net_mask} {cyan('GATEWAY')}
|
||||
{green('unix')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY')}
|
||||
{green('keenetic')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY GATEWAY_NAME')} auto !{comment(selected_service)}
|
||||
{green('cidr')} - {cyan('IP')}/{subnet}
|
||||
{green('mikrotik')} - /ip/firewall/address-list add list={cyan("LIST_NAME")}{f' comment="{comment(selected_service)}"' if mk_comment != "off" else ""} address={cyan("IP")}/{subnet}
|
||||
{green('ovpn')} - push "route {cyan('IP')} {net_mask}"
|
||||
{green('wireguard')} - {cyan('IP')}/{subnet}, {cyan('IP')}/{subnet}, и т.д...
|
||||
{green('Enter')} - {cyan('IP')}
|
||||
Ваш выбор: """)
|
||||
|
||||
ips = read_file(filename)
|
||||
if not ips:
|
||||
return
|
||||
|
||||
# Дополнительные запросы в зависимости от формата файла
|
||||
if filetype in ['win', 'unix']: # Запрашиваем IP шлюза для win и unix
|
||||
gateway = gateway_input(gateway)
|
||||
elif filetype == 'keenetic': # Запрашиваем IP шлюза и имя интерфейса для keenetic
|
||||
ken_gateway = ken_gateway_input(ken_gateway)
|
||||
elif filetype == 'mikrotik': # Запрашиваем ввод комментария для microtik firewall
|
||||
mk_list_name = mk_list_name_input(mk_list_name)
|
||||
|
||||
# обычный формат
|
||||
formatters = {
|
||||
'win': lambda ip: f"route add {ip} mask {net_mask} {gateway}",
|
||||
'unix': lambda ip: f"ip route {ip}/{subnet} {gateway}",
|
||||
'keenetic': lambda ip: f"ip route {ip}/{subnet} {ken_gateway} auto !{comment(selected_service)}",
|
||||
'cidr': lambda ip: f"{ip}/{subnet}",
|
||||
'ovpn': lambda ip: f'push "route {ip} {net_mask}"',
|
||||
'mikrotik': lambda ip: f'/ip/firewall/address-list add list={mk_list_name}' + (f' comment="{comment(selected_service)}"' if mk_comment != "off" else "") + f' address={ip}/{subnet}',
|
||||
'wireguard': lambda ip: f"{ip}/{subnet}"
|
||||
}
|
||||
|
||||
# mix формат
|
||||
if subnet == "mix":
|
||||
if filetype.lower() == 'win': # Обработка для win
|
||||
mix_formatter = lambda ip: f"{ip.strip()} mask 255.255.255.0" if ip.endswith(
|
||||
'.0') else f"{ip.strip()} mask 255.255.255.255"
|
||||
elif filetype.lower() == 'ovpn': # Обработка для ovpn
|
||||
mix_formatter = lambda ip: f"{ip.strip()} 255.255.255.0" if ip.endswith(
|
||||
'.0') else f"{ip.strip()} 255.255.255.255"
|
||||
else: # Обработка для остальных форматов
|
||||
mix_formatter = lambda ip: f"{ip.strip()}/24" if ip.endswith('.0') else f"{ip.strip()}/32"
|
||||
|
||||
formatters.update({
|
||||
'win': lambda ip: f"route add {mix_formatter(ip)} {gateway}",
|
||||
'unix': lambda ip: f"ip route {mix_formatter(ip)} {gateway}",
|
||||
'keenetic': lambda ip: f"ip route {mix_formatter(ip)} {ken_gateway} auto !{comment(selected_service)}",
|
||||
'cidr': lambda ip: f"{mix_formatter(ip)}",
|
||||
'ovpn': lambda ip: f'push "route {mix_formatter(ip)}"',
|
||||
'mikrotik': lambda ip: f'/ip/firewall/address-list add list={mk_list_name}' + (f' comment="{comment(selected_service)}"' if mk_comment != "off" else "") + f' address={mix_formatter(ip)}',
|
||||
'wireguard': lambda ip: f"{mix_formatter(ip)}"
|
||||
})
|
||||
|
||||
# Запись в файл
|
||||
if filetype.lower() in formatters:
|
||||
write_file(filename, ips, formatters[filetype.lower()])
|
||||
|
||||
|
||||
# Стартуем
|
||||
async def main():
|
||||
# Парсинг аргументов командной строки
|
||||
parser = argparse.ArgumentParser(description="DNS resolver script with custom config file.")
|
||||
parser.add_argument(
|
||||
'-c', '--config',
|
||||
type=str,
|
||||
default='config.ini',
|
||||
help='Путь к конфигурационному файлу (по умолчанию: config.ini)'
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
# Инициализация настроек из переданного конфигурационного файла
|
||||
config_file = args.config
|
||||
(service, request_limit, filename, cloudflare, filetype, gateway, run_command, dns_server_indices, mk_list_name, subnet, ken_gateway, localplatform, localdns, mk_comment) = read_config(config_file)
|
||||
|
||||
# Загрузка списка платформ
|
||||
if localplatform in ['yes', 'y']:
|
||||
urls = await load_urls_from_file()
|
||||
|
||||
else:
|
||||
platform_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platformdb"
|
||||
urls = await load_urls(platform_db_url)
|
||||
|
||||
# Подхват "custom-dns-list.txt" если существует
|
||||
local_dns_names = []
|
||||
if os.path.exists('custom-dns-list.txt'):
|
||||
with open('custom-dns-list.txt', 'r', encoding='utf-8') as file:
|
||||
local_dns_names = [line.strip() for line in file if line.strip()]
|
||||
|
||||
# Выбор платформ
|
||||
selected_services = check_service_config(service, urls, local_dns_names)
|
||||
|
||||
# Загрузка списка DNS-серверов
|
||||
if localdns in ['yes', 'y']:
|
||||
dns_servers = await load_dns_from_file()
|
||||
|
||||
else:
|
||||
dns_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/dnsdb"
|
||||
dns_servers = await load_dns_servers(dns_db_url)
|
||||
|
||||
# Выбор DNS-серверов
|
||||
selected_dns_servers = check_dns_servers(dns_servers, dns_server_indices)
|
||||
|
||||
# Фильтр Cloudflare
|
||||
include_cloudflare = check_include_cloudflare(cloudflare)
|
||||
if include_cloudflare: # Загрузка IP-адресов Cloudflare
|
||||
cloudflare_ips = await get_cloudflare_ips()
|
||||
else:
|
||||
cloudflare_ips = set()
|
||||
|
||||
unique_ips_all_services = set()
|
||||
semaphore = init_semaphores(request_limit)
|
||||
null_ips_count = [0]
|
||||
cloudflare_ips_count = [0]
|
||||
total_domains_processed = [0]
|
||||
tasks = []
|
||||
|
||||
for service in selected_services:
|
||||
if service == 'Custom DNS list':
|
||||
tasks.append(resolve_dns(service, local_dns_names, selected_dns_servers, cloudflare_ips,
|
||||
unique_ips_all_services, semaphore, null_ips_count, cloudflare_ips_count,
|
||||
total_domains_processed, include_cloudflare))
|
||||
|
||||
else:
|
||||
url_or_file = urls[service]
|
||||
dns_names = await load_dns_names(url_or_file)
|
||||
tasks.append(resolve_dns(service, dns_names, selected_dns_servers, cloudflare_ips, unique_ips_all_services,
|
||||
semaphore, null_ips_count, cloudflare_ips_count, total_domains_processed,
|
||||
include_cloudflare))
|
||||
|
||||
results = await asyncio.gather(*tasks)
|
||||
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
for result in results:
|
||||
file.write(result)
|
||||
|
||||
print(f"\n{yellow('Проверка завершена.')}")
|
||||
print(f"{Style.BRIGHT}Использовались DNS сервера:{Style.RESET_ALL} " + ', '.join(
|
||||
[f'{pair[0]} ({", ".join(pair[1])})' for pair in selected_dns_servers]))
|
||||
print(f"{Style.BRIGHT}Всего обработано DNS имен:{Style.RESET_ALL} {total_domains_processed[0]}")
|
||||
if include_cloudflare:
|
||||
print(f"{Style.BRIGHT}Исключено IP-адресов Cloudflare:{Style.RESET_ALL} {cloudflare_ips_count[0]}")
|
||||
print(f"{Style.BRIGHT}Исключено IP-адресов 'заглушек':{Style.RESET_ALL} {null_ips_count[0]}")
|
||||
print(f"{Style.BRIGHT}Разрешено IP-адресов из DNS имен:{Style.RESET_ALL} {len(unique_ips_all_services)}")
|
||||
|
||||
# Группировка IP-адресов в подсети
|
||||
subnet = subnet_input(subnet)
|
||||
if subnet != '32': # Если не '32', вызываем функцию для агрегации
|
||||
group_ips_in_subnets(filename, subnet)
|
||||
|
||||
process_file_format(filename, filetype, gateway, selected_services, mk_list_name, mk_comment, subnet, ken_gateway)
|
||||
|
||||
if run_command:
|
||||
print("\nВыполнение команды после завершения скрипта...")
|
||||
os.system(run_command)
|
||||
else:
|
||||
print(f"\n{Style.BRIGHT}Результаты сохранены в файл:{Style.RESET_ALL}", filename)
|
||||
if os.name == 'nt':
|
||||
input(f"Нажмите {green('Enter')} для выхода...")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
38
platformdb
38
platformdb
@@ -1,16 +1,24 @@
|
||||
Antifilter community edition: https://community.antifilter.download/list/domains.lst
|
||||
Youtube: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-youtube.txt
|
||||
Facebook: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-facebook.txt
|
||||
Openai: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-openai.txt
|
||||
Tik-Tok: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-tiktok.txt
|
||||
Instagram: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-instagram.txt
|
||||
Twitter: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-twitter.txt
|
||||
Netflix: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-netflix.txt
|
||||
Bing: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-bing.txt
|
||||
Adobe: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-adobe.txt
|
||||
Apple: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-apple.txt
|
||||
Google: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-google.txt
|
||||
Torrent Truckers: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-ttruckers.txt
|
||||
Search engines: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-search-engines.txt
|
||||
Github Copilot: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-github-сopilot.txt
|
||||
Twitch: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-twitch.txt
|
||||
ITDog Inside: https://raw.githubusercontent.com/itdoginfo/allow-domains/main/Russia/inside-raw.lst
|
||||
ITDog Outside: https://raw.githubusercontent.com/itdoginfo/allow-domains/main/Russia/outside-raw.lst
|
||||
Youtube: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-youtube.txt
|
||||
Facebook: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-facebook.txt
|
||||
Openai: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-openai.txt
|
||||
Tik-Tok: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-tiktok.txt
|
||||
Instagram: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-instagram.txt
|
||||
Twitter: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-twitter.txt
|
||||
Netflix: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-netflix.txt
|
||||
Bing: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-bing.txt
|
||||
Adobe: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-adobe.txt
|
||||
Apple: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-apple.txt
|
||||
Google: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-google.txt
|
||||
Torrent Trackers: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-ttrackers.txt
|
||||
Search engines: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-search-engines.txt
|
||||
Github Copilot: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-github-pilot.txt
|
||||
Twitch: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-twitch.txt
|
||||
Discord: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-discord.txt
|
||||
Jetbrains: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-jetbrains.txt
|
||||
Xbox: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-xbox.txt
|
||||
Telegram: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-telegram.txt
|
||||
Online movie theaters: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-onlinetheater.txt
|
||||
Windsurf: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-windsurf.txt
|
||||
|
||||
109
platforms/disneyplus_notfull.txt
Normal file
109
platforms/disneyplus_notfull.txt
Normal file
@@ -0,0 +1,109 @@
|
||||
aeng.mlb.prod.us-east-1.bamgrid.com
|
||||
artoo.vpe.bamgrid.com
|
||||
assets.adobedtm.com
|
||||
bam.nr-data.net
|
||||
cd-bbd-rd.bamgrid.com
|
||||
cd-bbd-rd2.bamgrid.com
|
||||
cdn.registerdisney.go.com
|
||||
click.mail.disneyplus.com
|
||||
cloud.mail.disneyplus.com
|
||||
cnbl-cdn-dev.bamgrid.com
|
||||
cnbl-cdn.bamgrid.com
|
||||
cws.conviva.com
|
||||
d9.flashtalking.com
|
||||
default-aeng-bamtech-prod.us-east-1.bamgrid.com
|
||||
default-aeng-bamtech-prod.us-west-2.bamgrid.com
|
||||
default.backstage-portal.mmdev.bamtech.prod.us-east-1.bamgrid.com
|
||||
default.partner-portal-graphql-api.partnerint.bamtech.prod.us-east-1.bamgrid.com
|
||||
default.partner-portal-graphql-api.partnerint.bamtech.qa.us-east-1.bamgrid.com
|
||||
default.proxy-errors.cdo.bamtech.dev.us-east-1.bamgrid.com
|
||||
default.web-ui.adtech.bamtech.prod.us-east-1.bamgrid.com
|
||||
dev-eu-central-1-ripcut-origin.bamgrid.com
|
||||
dev-eu-west-1-ripcut-origin.bamgrid.com
|
||||
dev-us-east-1-ripcut-origin.bamgrid.com
|
||||
dev-us-east-2-ripcut-origin.bamgrid.com
|
||||
dev-us-west-2-ripcut-origin.bamgrid.com
|
||||
device-farm.qateam.bamgrid.com
|
||||
disney-portal.my.onetrust.com
|
||||
disneyplus.bn5x.net
|
||||
disneyplus.com
|
||||
eu-central-1.edge.bamgrid.com
|
||||
eu-west-1.edge.bamgrid.com
|
||||
eu-west-1.origin.edge.bamgrid.com
|
||||
eu.origin.edge.bamgrid.com
|
||||
fed-espnpluscom-redirect.bamgrid.com
|
||||
guidgenerator-prod-us-east-1.bamgrid.com
|
||||
guidgenerator-prod-us.bamgrid.com
|
||||
js-agent.newrelic.com
|
||||
mail.disneyplus.com
|
||||
mlb.edge.bamgrid.com
|
||||
mlb.playback.edge.bamgrid.com
|
||||
mta10.mail.disneyplus.com
|
||||
mta11.mail.disneyplus.com
|
||||
mta12.mail.disneyplus.com
|
||||
mta13.mail.disneyplus.com
|
||||
mta14.mail.disneyplus.com
|
||||
mta15.mail.disneyplus.com
|
||||
mta17.mail.disneyplus.com
|
||||
mta18.mail.disneyplus.com
|
||||
mta19.mail.disneyplus.com
|
||||
mta2.mail.disneyplus.com
|
||||
mta20.mail.disneyplus.com
|
||||
mta21.mail.disneyplus.com
|
||||
mta22.mail.disneyplus.com
|
||||
mta23.mail.disneyplus.com
|
||||
mta24.mail.disneyplus.com
|
||||
mta25.mail.disneyplus.com
|
||||
mta26.mail.disneyplus.com
|
||||
mta27.mail.disneyplus.com
|
||||
mta3.mail.disneyplus.com
|
||||
mta4.mail.disneyplus.com
|
||||
mta5.mail.disneyplus.com
|
||||
mta6.mail.disneyplus.com
|
||||
mta7.mail.disneyplus.com
|
||||
mta8.mail.disneyplus.com
|
||||
mta9.mail.disneyplus.com
|
||||
oss-drone.bamgrid.com
|
||||
prod-eu-central-1-ripcut-origin.bamgrid.com
|
||||
prod-us-east-1-ripcut-origin.bamgrid.com
|
||||
prod-us-west-2-ripcut-origin.bamgrid.com
|
||||
qa-eu-central-1-ripcut-origin.bamgrid.com
|
||||
qa-us-east-1-ripcut-origin.bamgrid.com
|
||||
qa-us-west-2-ripcut-origin.bamgrid.com
|
||||
qa.us-east-1.origin.edge.bamgrid.com
|
||||
qa.us-west-2.origin.edge.bamgrid.com
|
||||
runbook-slack.us-east-1.bamgrid.com
|
||||
skynet-prod-nhl-recon-frontend-web-nginx-lb-742465481554.us-east-1.bamgrid.com
|
||||
sslproxy-prod.adobedtm.com
|
||||
us-east-1.edge.bamgrid.com
|
||||
us-east-1.origin.edge.bamgrid.com
|
||||
us-west-2.edge.bamgrid.com
|
||||
us-west-2.origin.edge.bamgrid.com
|
||||
view.mail.disneyplus.com
|
||||
vod-ftc-na-central-1.media.dssott.com
|
||||
vpe-static-dev.bamgrid.com
|
||||
vpe-static-stage.bamgrid.com
|
||||
vpe-static.bamgrid.com
|
||||
waf-elb-default-prod-bamtech-us-east-1.bamgrid.com
|
||||
waf-elb-default-qa-bamtech-us-east-1.bamgrid.com
|
||||
search-api-disney.bamgrid.com
|
||||
disney-plus.net
|
||||
dssott.com
|
||||
dssedge.com
|
||||
ecs01.jfk1.net.dssedge.com
|
||||
ecs02.jfk1.net.dssedge.com
|
||||
esw01.jfk1.net.dssedge.com
|
||||
esw02.jfk1.net.dssedge.com
|
||||
tr.jfk3.dev.dssedge.com
|
||||
tr.tr.na-east-1.qa.dssedge.com
|
||||
tr01-c01-ewr1-dss.prod.dssedge.com
|
||||
tr01-c01-jfk1-dss.prod.dssedge.com
|
||||
tr01-c02-bog1-dss.prod.dssedge.com
|
||||
tr01-c02-eze1-dss.prod.dssedge.com
|
||||
tr01-c02-scl1-dss.prod.dssedge.com
|
||||
cookielaw.org
|
||||
cdn-cf.cookielaw.org
|
||||
cdn.cookielaw.org
|
||||
cmp-cdn.cookielaw.org
|
||||
cookielaw.org
|
||||
www.cookielaw.org
|
||||
@@ -56,5 +56,4 @@ uk-adobe.com
|
||||
upload.adobe.io
|
||||
user.adobe.io
|
||||
watch.adobe.io
|
||||
web.adobe.io
|
||||
www.adobe.com
|
||||
web.adobe.io
|
||||
@@ -1,211 +1,209 @@
|
||||
a.ns.apple.com,
|
||||
ab.apple.com.akadns.net,
|
||||
aidc.apple.com,
|
||||
albert.apple.com,
|
||||
amp-api.apps.apple.com,
|
||||
amp-api.apps.apple.com.edgekey.net,
|
||||
amp-api.books.apple.com.edgekey.net,
|
||||
amp-api.fitness.apple.com,
|
||||
amp-api.media.apple.com,
|
||||
amp-api.music.apple.com,
|
||||
amp-api.podcasts.apple.com,
|
||||
amp-api.videos.apple.com,
|
||||
aod.itunes.apple.com,
|
||||
api.apple-cloudkit.com,
|
||||
api.apple-cloudkit.fe.apple-dns.net,
|
||||
api.apple-cloudkit.fe2.apple-dns.net,
|
||||
api.apps.apple.com,
|
||||
api.smoot.apple.com,
|
||||
api-adservices.apple.com,
|
||||
apple.co,
|
||||
apple.com,
|
||||
apple.com.cn,
|
||||
appleid.apple.com,
|
||||
appleid.cdn-apple.com,
|
||||
appleid.idms-apple.com,
|
||||
apple-mapkit.com,
|
||||
appleseedcdn.apple.com,
|
||||
apps.apple.com,
|
||||
auth.itunes.apple.com,
|
||||
ax.itunes.apple.com.edgesuite.net,
|
||||
bag.itunes.apple.com,
|
||||
bag-cdn.itunes-apple.com.akadns.net,
|
||||
basejumper.apple.com,
|
||||
bcrw.apple.com,
|
||||
beta.music.apple.com.edgesuite.net,
|
||||
big.itunes.apple.com,
|
||||
bookkeeper.itunes.apple.com,
|
||||
books.apple.com.edgekey.net,
|
||||
bpapi.apple.com,
|
||||
buy.itunes.apple.com,
|
||||
buylite.itunes.apple.com,
|
||||
c.apple.news,
|
||||
ca.iadsdk.apple.com,
|
||||
captive.apple.com,
|
||||
carrierbundle.itunes.apple.com,
|
||||
cdn.apple.com.c.footprint.net,
|
||||
cdn.apple-cloudkit.com,
|
||||
cdn.apple-mapkit.com,
|
||||
cdn-apple.com,
|
||||
cds.apple.com,
|
||||
ce.apple-dns.net,
|
||||
certs.apple.com,
|
||||
cf.iadsdk.apple.com,
|
||||
challenge.gc.apple.com,
|
||||
cl1.apple.com,
|
||||
cl2.apple.com,
|
||||
cl3.apple.com,
|
||||
cl4.apple.com,
|
||||
cl5.apple.com,
|
||||
classical.music.apple.com.edgesuite.net,
|
||||
client-api.itunes.apple.com,
|
||||
clientflow.apple.com,
|
||||
comm-cohort.ess.apple.com,
|
||||
communities.apple.com,
|
||||
configuration.apple.com,
|
||||
courier-ab-vs.push.apple.com,
|
||||
cssubmissions.apple.com,
|
||||
cstat.cdn-apple.com,
|
||||
d.ns.apple.com,
|
||||
dejavu.apple.com,
|
||||
device-config.pcms.apple.com,
|
||||
discussions.apple.com.edgekey.net,
|
||||
dns.apple.com,
|
||||
docs-assets.developer.apple.com,
|
||||
doh.dns.apple.com,
|
||||
downloaddispatch.itunes.apple.com,
|
||||
edge.apple,
|
||||
entitlements.itunes.apple.com,
|
||||
ess.apple.com,
|
||||
euro.apple.com,
|
||||
experiments.apple.com,
|
||||
fides-pol.apple.com,
|
||||
finance-app.itunes.apple.com,
|
||||
forums.developer.apple.com,
|
||||
fpinit.itunes.apple.com,
|
||||
friend.gc.apple.com,
|
||||
g.apple.com,
|
||||
gc.apple.com,
|
||||
gdmf.apple.com,
|
||||
genius-3.itunes.apple.com.edgekey.net,
|
||||
geo.itunes.apple.com,
|
||||
gs.apple.com,
|
||||
gsa.apple.com,
|
||||
gsas.apple.com,
|
||||
gs-loc.apple.com,
|
||||
gsp10-ssl.apple.com,
|
||||
gsp36-ssl.ls.apple.com,
|
||||
gsp47-ssl.ls.apple.com,
|
||||
gsp51-ssl.ls.apple.com,
|
||||
gsp57-ssl-background.ls.apple.com,
|
||||
gsp64-ssl.ls.apple.com,
|
||||
gsp85-ssl.ls.apple.com,
|
||||
gspe11-ssl.ls.apple.com.edgekey.net,
|
||||
gspe19-ssl.ls.apple.com,
|
||||
gspe21-ssl.ls.apple.com,
|
||||
gspe35-ssl.ls.apple.com,
|
||||
gspe72-ssl.ls.apple.com.akamaized.net,
|
||||
guzzoni.apple.com,
|
||||
help.apple.com,
|
||||
hls-svod.itunes.apple.com,
|
||||
iadcontent.apple.com.edgekey.net,
|
||||
iadsdk.apple.com,
|
||||
identity.apple.com,
|
||||
inappcheck.itunes.apple.com,
|
||||
init.ess.apple.com,
|
||||
init.gc.apple.com,
|
||||
init.itunes.apple.com,
|
||||
init.push.apple.com,
|
||||
iphone-ld.apple.com,
|
||||
iphonesubmissions.apple.com,
|
||||
itunes.apple.com,
|
||||
js-cdn.music.apple.com,
|
||||
km.support.apple.com,
|
||||
kt-prod.ess.apple.com,
|
||||
lcdn-locator.apple.com,
|
||||
librarydaap.itunes.apple.com,
|
||||
linkmaker.itunes.apple.com.edgekey.net,
|
||||
lookup-api.apple.com,
|
||||
ls.apple.com,
|
||||
ma-albert-prod.apple.com,
|
||||
ma-sq-device.apple.com,
|
||||
me.apple-dns.net,
|
||||
mesu.apple.com,
|
||||
ml.cdn-apple.com,
|
||||
mobileapp.apple.com.edgekey.net,
|
||||
musicstatus.itunes.apple.com,
|
||||
mzstorekit.itunes.apple.com,
|
||||
nc-pod2-smp-device-asset.apple.com,
|
||||
news-assets.apple.com,
|
||||
news-client-search.apple.com,
|
||||
news-edge.apple.com,
|
||||
news-events.apple.com,
|
||||
newsletter-edge.apple.com,
|
||||
northamerica-1.object-storage.apple.com,
|
||||
notes-analytics-events.apple.com,
|
||||
ocsp.apple.com,
|
||||
odr.itunes.apple.com,
|
||||
ontology.health.apple.com,
|
||||
osxapps.itunes.apple.com,
|
||||
p16-buy.itunes.apple.com,
|
||||
p24-buy.itunes.apple.com,
|
||||
p26-buy.itunes.apple.com,
|
||||
p50-buy.itunes.apple.com,
|
||||
p6-buy.itunes.apple.com,
|
||||
pancake.apple.com,
|
||||
partiality.itunes.apple.com,
|
||||
pba.apple.com,
|
||||
pd.itunes.apple.com,
|
||||
play.itunes.apple.com,
|
||||
podcasts.apple.com.edgekey.net,
|
||||
portal-repair-uat-apple.com,
|
||||
profile.ess.apple.com,
|
||||
pr-pod1-smp-device-asset.apple.com,
|
||||
publicassets.cdn-apple.com,
|
||||
push.apple.com,
|
||||
query.ess.apple.com,
|
||||
quid-apple.com,
|
||||
radarsubmissions.apple.com,
|
||||
radio.itunes.apple.com,
|
||||
rn-albert-prod.apple.com,
|
||||
safebrowsing.apple,
|
||||
safety-alert.apple.com,
|
||||
sandbox.itunes.apple.com,
|
||||
sas.pcms.apple.com,
|
||||
sb.music.apple.com,
|
||||
se2.itunes.apple.com,
|
||||
seed.siri.apple.com,
|
||||
sequoia.cdn-apple.com,
|
||||
sf-api-token-service.itunes.apple.com,
|
||||
sgp-albert-prod.apple.com,
|
||||
shazam-insights.cdn-apple.com,
|
||||
shop-apple.com,
|
||||
siri.apple.com,
|
||||
smoot.apple.com,
|
||||
smp-device-content.apple.com,
|
||||
speedysub.itunes.apple.com,
|
||||
sps-media.apple.com,
|
||||
static.cdn-apple.com.edgekey.net,
|
||||
stats.gc.apple.com,
|
||||
stocks-data-service.apple.com,
|
||||
store.storeimages.cdn-apple.com.edgekey.net,
|
||||
streamingaudio.itunes.apple.com,
|
||||
su.itunes.apple.com,
|
||||
support.apple.com,
|
||||
swscan.apple.com,
|
||||
sync.itunes.apple.com,
|
||||
testflight.apple.com,
|
||||
time.apple.com,
|
||||
tr.iadsdk.apple.com,
|
||||
unlinkability.apple.com,
|
||||
updates.cdn-apple.com,
|
||||
upp.itunes.apple.com,
|
||||
us-courier.push.apple.com,
|
||||
use1-tdm-prod.apple.com,
|
||||
weather-data.apple.com,
|
||||
websitereview.corp.apple.com,
|
||||
wps.apple.com,
|
||||
wu.apple.com.akadns.net,
|
||||
www.apple.com,
|
||||
www.apple.com.cn,
|
||||
a.ns.apple.com
|
||||
ab.apple.com.akadns.net
|
||||
aidc.apple.com
|
||||
albert.apple.com
|
||||
amp-api.apps.apple.com
|
||||
amp-api.apps.apple.com.edgekey.net
|
||||
amp-api.books.apple.com.edgekey.net
|
||||
amp-api.fitness.apple.com
|
||||
amp-api.media.apple.com
|
||||
amp-api.music.apple.com
|
||||
amp-api.podcasts.apple.com
|
||||
amp-api.videos.apple.com
|
||||
aod.itunes.apple.com
|
||||
api.apple-cloudkit.com
|
||||
api.apple-cloudkit.fe.apple-dns.net
|
||||
api.apple-cloudkit.fe2.apple-dns.net
|
||||
api.apps.apple.com
|
||||
api.smoot.apple.com
|
||||
api-adservices.apple.com
|
||||
apple.co
|
||||
apple.com
|
||||
apple.com.cn
|
||||
appleid.apple.com
|
||||
appleid.cdn-apple.com
|
||||
appleid.idms-apple.com
|
||||
apple-mapkit.com
|
||||
appleseedcdn.apple.com
|
||||
apps.apple.com
|
||||
auth.itunes.apple.com
|
||||
ax.itunes.apple.com.edgesuite.net
|
||||
bag.itunes.apple.com
|
||||
bag-cdn.itunes-apple.com.akadns.net
|
||||
basejumper.apple.com
|
||||
bcrw.apple.com
|
||||
beta.music.apple.com.edgesuite.net
|
||||
big.itunes.apple.com
|
||||
bookkeeper.itunes.apple.com
|
||||
books.apple.com.edgekey.net
|
||||
bpapi.apple.com
|
||||
buy.itunes.apple.com
|
||||
buylite.itunes.apple.com
|
||||
c.apple.news
|
||||
ca.iadsdk.apple.com
|
||||
captive.apple.com
|
||||
carrierbundle.itunes.apple.com
|
||||
cdn.apple.com.c.footprint.net
|
||||
cdn.apple-cloudkit.com
|
||||
cdn.apple-mapkit.com
|
||||
cdn-apple.com
|
||||
cds.apple.com
|
||||
ce.apple-dns.net
|
||||
certs.apple.com
|
||||
cf.iadsdk.apple.com
|
||||
challenge.gc.apple.com
|
||||
cl1.apple.com
|
||||
cl2.apple.com
|
||||
cl3.apple.com
|
||||
cl4.apple.com
|
||||
cl5.apple.com
|
||||
classical.music.apple.com.edgesuite.net
|
||||
client-api.itunes.apple.com
|
||||
clientflow.apple.com
|
||||
comm-cohort.ess.apple.com
|
||||
communities.apple.com
|
||||
configuration.apple.com
|
||||
courier-ab-vs.push.apple.com
|
||||
cssubmissions.apple.com
|
||||
cstat.cdn-apple.com
|
||||
d.ns.apple.com
|
||||
dejavu.apple.com
|
||||
device-config.pcms.apple.com
|
||||
discussions.apple.com.edgekey.net
|
||||
dns.apple.com
|
||||
docs-assets.developer.apple.com
|
||||
doh.dns.apple.com
|
||||
downloaddispatch.itunes.apple.com
|
||||
edge.apple
|
||||
entitlements.itunes.apple.com
|
||||
ess.apple.com
|
||||
euro.apple.com
|
||||
experiments.apple.com
|
||||
fides-pol.apple.com
|
||||
finance-app.itunes.apple.com
|
||||
forums.developer.apple.com
|
||||
fpinit.itunes.apple.com
|
||||
friend.gc.apple.com
|
||||
g.apple.com
|
||||
gc.apple.com
|
||||
gdmf.apple.com
|
||||
genius-3.itunes.apple.com.edgekey.net
|
||||
geo.itunes.apple.com
|
||||
gs.apple.com
|
||||
gsa.apple.com
|
||||
gsas.apple.com
|
||||
gs-loc.apple.com
|
||||
gsp10-ssl.apple.com
|
||||
gsp36-ssl.ls.apple.com
|
||||
gsp47-ssl.ls.apple.com
|
||||
gsp51-ssl.ls.apple.com
|
||||
gsp57-ssl-background.ls.apple.com
|
||||
gsp64-ssl.ls.apple.com
|
||||
gsp85-ssl.ls.apple.com
|
||||
gspe11-ssl.ls.apple.com.edgekey.net
|
||||
gspe19-ssl.ls.apple.com
|
||||
gspe21-ssl.ls.apple.com
|
||||
gspe35-ssl.ls.apple.com
|
||||
gspe72-ssl.ls.apple.com.akamaized.net
|
||||
guzzoni.apple.com
|
||||
help.apple.com
|
||||
hls-svod.itunes.apple.com
|
||||
iadcontent.apple.com.edgekey.net
|
||||
iadsdk.apple.com
|
||||
identity.apple.com
|
||||
inappcheck.itunes.apple.com
|
||||
init.ess.apple.com
|
||||
init.gc.apple.com
|
||||
init.itunes.apple.com
|
||||
init.push.apple.com
|
||||
iphone-ld.apple.com
|
||||
iphonesubmissions.apple.com
|
||||
itunes.apple.com
|
||||
js-cdn.music.apple.com
|
||||
km.support.apple.com
|
||||
kt-prod.ess.apple.com
|
||||
lcdn-locator.apple.com
|
||||
librarydaap.itunes.apple.com
|
||||
linkmaker.itunes.apple.com.edgekey.net
|
||||
lookup-api.apple.com
|
||||
ls.apple.com
|
||||
ma-albert-prod.apple.com
|
||||
ma-sq-device.apple.com
|
||||
me.apple-dns.net
|
||||
mesu.apple.com
|
||||
ml.cdn-apple.com
|
||||
mobileapp.apple.com.edgekey.net
|
||||
musicstatus.itunes.apple.com
|
||||
mzstorekit.itunes.apple.com
|
||||
nc-pod2-smp-device-asset.apple.com
|
||||
news-assets.apple.com
|
||||
news-client-search.apple.com
|
||||
news-edge.apple.com
|
||||
news-events.apple.com
|
||||
newsletter-edge.apple.com
|
||||
northamerica-1.object-storage.apple.com
|
||||
notes-analytics-events.apple.com
|
||||
ocsp.apple.com
|
||||
odr.itunes.apple.com
|
||||
ontology.health.apple.com
|
||||
osxapps.itunes.apple.com
|
||||
p16-buy.itunes.apple.com
|
||||
p24-buy.itunes.apple.com
|
||||
p26-buy.itunes.apple.com
|
||||
p50-buy.itunes.apple.com
|
||||
p6-buy.itunes.apple.com
|
||||
pancake.apple.com
|
||||
partiality.itunes.apple.com
|
||||
pba.apple.com
|
||||
pd.itunes.apple.com
|
||||
play.itunes.apple.com
|
||||
podcasts.apple.com.edgekey.net
|
||||
portal-repair-uat-apple.com
|
||||
profile.ess.apple.com
|
||||
pr-pod1-smp-device-asset.apple.com
|
||||
publicassets.cdn-apple.com
|
||||
push.apple.com
|
||||
query.ess.apple.com
|
||||
quid-apple.com
|
||||
radarsubmissions.apple.com
|
||||
radio.itunes.apple.com
|
||||
rn-albert-prod.apple.com
|
||||
safebrowsing.apple
|
||||
safety-alert.apple.com
|
||||
sandbox.itunes.apple.com
|
||||
sas.pcms.apple.com
|
||||
sb.music.apple.com
|
||||
se2.itunes.apple.com
|
||||
seed.siri.apple.com
|
||||
sequoia.cdn-apple.com
|
||||
sf-api-token-service.itunes.apple.com
|
||||
sgp-albert-prod.apple.com
|
||||
shazam-insights.cdn-apple.com
|
||||
shop-apple.com
|
||||
siri.apple.com
|
||||
smoot.apple.com
|
||||
smp-device-content.apple.com
|
||||
speedysub.itunes.apple.com
|
||||
sps-media.apple.com
|
||||
static.cdn-apple.com.edgekey.net
|
||||
stats.gc.apple.com
|
||||
stocks-data-service.apple.com
|
||||
store.storeimages.cdn-apple.com.edgekey.net
|
||||
streamingaudio.itunes.apple.com
|
||||
su.itunes.apple.com
|
||||
support.apple.com
|
||||
swscan.apple.com
|
||||
sync.itunes.apple.com
|
||||
testflight.apple.com
|
||||
time.apple.com
|
||||
tr.iadsdk.apple.com
|
||||
unlinkability.apple.com
|
||||
updates.cdn-apple.com
|
||||
upp.itunes.apple.com
|
||||
us-courier.push.apple.com
|
||||
use1-tdm-prod.apple.com
|
||||
weather-data.apple.com
|
||||
websitereview.corp.apple.com
|
||||
wps.apple.com
|
||||
wu.apple.com.akadns.net
|
||||
xp.apple.com
|
||||
|
||||
@@ -20,5 +20,4 @@ services.bingapis.com
|
||||
ssl.bing.com
|
||||
sydney.bing.com
|
||||
th.bing.com
|
||||
www.bing.com
|
||||
www2.bing.com
|
||||
4118
platforms/dns-discord.txt
Normal file
4118
platforms/dns-discord.txt
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
13
platforms/dns-github-pilot.txt
Normal file
13
platforms/dns-github-pilot.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
copilot-telemetry.githubusercontent.com
|
||||
copilot-proxy.githubusercontent.com
|
||||
githubcopilot.com
|
||||
github.com
|
||||
api.github.com
|
||||
default.exp-tas.com
|
||||
origin-tracker.githubusercontent.com
|
||||
copilot.github.com
|
||||
breeze.aimon.applicationinsights.io
|
||||
api.githubcopilot.com
|
||||
api.individual.githubcopilot.com
|
||||
proxy.individual.githubusercontent.com
|
||||
telemetry.individual.githubcopilot.com
|
||||
@@ -1,3 +0,0 @@
|
||||
copilot-telemetry.githubusercontent.com
|
||||
copilot-proxy.githubusercontent.com
|
||||
githubcopilot.com
|
||||
@@ -28,5 +28,4 @@ support.google.com
|
||||
cloud.google.com
|
||||
gvt2.com
|
||||
gvt3.com
|
||||
google.ru
|
||||
www.google.com
|
||||
google.ru
|
||||
@@ -1,11 +1,70 @@
|
||||
bookstagram.com
|
||||
Www.instagram.com
|
||||
a.ns.instagram.com
|
||||
about.instagram.com
|
||||
accountscenter.instagram.com
|
||||
admin.instagram.com
|
||||
api.instagram.com
|
||||
applink.instagram.com
|
||||
autodiscover.instagram.com
|
||||
b.i.instagram.com
|
||||
b.ns.instagram.com
|
||||
b.secure.instagram.com
|
||||
badges.instagram.com
|
||||
blog.instagram.com
|
||||
bookstagram.com
|
||||
business.instagram.com
|
||||
c.ns.instagram.com
|
||||
carstagram.com
|
||||
cdninstagram.com
|
||||
chickstagram.com
|
||||
community.instagram.com
|
||||
connect.facebook.net
|
||||
d.ns.instagram.com
|
||||
dyi.www.instagram.com
|
||||
edge-mqtt-fallback.facebook.com
|
||||
edge-mqtt.facebook.com
|
||||
edge-chat.instagram.com
|
||||
engineering.instagram.com
|
||||
fna-instagram-shv-01-fagc1.fbcdn.net
|
||||
fna-instagram-shv-01-fdel1.fbcdn.net
|
||||
fna-instagram-shv-01-ffcm1.fbcdn.net
|
||||
fna-instagram-shv-01-ffjr1.fbcdn.net
|
||||
fna-instagram-shv-01-fjai2.fbcdn.net
|
||||
fna-instagram-shv-01-fktw1.fbcdn.net
|
||||
fna-instagram-shv-01-fmaa1.fbcdn.net
|
||||
fna-instagram-shv-01-fpat2.fbcdn.net
|
||||
fna-instagram-shv-01-fric1.fbcdn.net
|
||||
fna-instagram-shv-01-fsac1.fbcdn.net
|
||||
fna-instagram-shv-01-fvga2.fbcdn.net
|
||||
fna-instagram-shv-02-fagc1.fbcdn.net
|
||||
fna-instagram-shv-02-fdel1.fbcdn.net
|
||||
fna-instagram-shv-02-ffcm1.fbcdn.net
|
||||
fna-instagram-shv-02-ffjr1.fbcdn.net
|
||||
fna-instagram-shv-02-fhyd1.fbcdn.net
|
||||
fna-instagram-shv-02-fixc1.fbcdn.net
|
||||
fna-instagram-shv-02-fmaa1.fbcdn.net
|
||||
fna-instagram-shv-02-fmem1.fbcdn.net
|
||||
fna-instagram-shv-02-fsac1.fbcdn.net
|
||||
fna-instagram-shv-03-fblr1.fbcdn.net
|
||||
fna-instagram-shv-03-fdel1.fbcdn.net
|
||||
fna-instagram-shv-03-ffjr1.fbcdn.net
|
||||
fna-instagram-shv-03-fmaa1.fbcdn.net
|
||||
fna-instagram-shv-04-fblr1.fbcdn.net
|
||||
fna-instagram-shv-04-fdel1.fbcdn.net
|
||||
fna-instagram-shv-04-ffjr1.fbcdn.net
|
||||
fna-instagram-shv-04-fmaa1.fbcdn.net
|
||||
gateway.instagram.com
|
||||
geo-p42.instagram.com
|
||||
geo.instagram.com
|
||||
graph-fallback.instagram.com
|
||||
graph.facebook.com
|
||||
graph.instagram.com
|
||||
graphql.instagram.com
|
||||
help.instagram.com
|
||||
help.latest.instagram.com
|
||||
hyperlapse.instagram.com
|
||||
i-fallback.instagram.com
|
||||
i.instagram.com
|
||||
ig.me
|
||||
igcdn.com
|
||||
igsonar.com
|
||||
igtv.com
|
||||
imstagram.com
|
||||
imtagram.com
|
||||
instaadder.com
|
||||
@@ -20,9 +79,82 @@ instagor.com
|
||||
instagram-brand.com
|
||||
instagram-engineering.com
|
||||
instagram-help.com
|
||||
instagram-p15-shv-01-arn2.fbcdn.net
|
||||
instagram-p15-shv-01-lga3.fbcdn.net
|
||||
instagram-p15-shv-01-mia3.fbcdn.net
|
||||
instagram-p15-shv-01-sea1.fbcdn.net
|
||||
instagram-p15-shv-02-bom1.fbcdn.net
|
||||
instagram-p3-shv-01-arn2.fbcdn.net
|
||||
instagram-p3-shv-01-atl3.fbcdn.net
|
||||
instagram-p3-shv-01-ber1.fbcdn.net
|
||||
instagram-p3-shv-01-bom1.fbcdn.net
|
||||
instagram-p3-shv-01-bru2.fbcdn.net
|
||||
instagram-p3-shv-01-cgk1.fbcdn.net
|
||||
instagram-p3-shv-01-del1.fbcdn.net
|
||||
instagram-p3-shv-01-dus1.fbcdn.net
|
||||
instagram-p3-shv-01-eze1.fbcdn.net
|
||||
instagram-p3-shv-01-gmp1.fbcdn.net
|
||||
instagram-p3-shv-01-gru1.fbcdn.net
|
||||
instagram-p3-shv-01-gru2.fbcdn.net
|
||||
instagram-p3-shv-01-hel3.fbcdn.net
|
||||
instagram-p3-shv-01-iad3.fbcdn.net
|
||||
instagram-p3-shv-01-lax3.fbcdn.net
|
||||
instagram-p3-shv-01-lga3.fbcdn.net
|
||||
instagram-p3-shv-01-los2.fbcdn.net
|
||||
instagram-p3-shv-01-maa2.fbcdn.net
|
||||
instagram-p3-shv-01-mad1.fbcdn.net
|
||||
instagram-p3-shv-01-mia3.fbcdn.net
|
||||
instagram-p3-shv-01-mrs2.fbcdn.net
|
||||
instagram-p3-shv-01-msp1.fbcdn.net
|
||||
instagram-p3-shv-01-mxp1.fbcdn.net
|
||||
instagram-p3-shv-01-nrt1.fbcdn.net
|
||||
instagram-p3-shv-01-otp1.fbcdn.net
|
||||
instagram-p3-shv-01-prg1.fbcdn.net
|
||||
instagram-p3-shv-01-qro1.fbcdn.net
|
||||
instagram-p3-shv-01-scl2.fbcdn.net
|
||||
instagram-p3-shv-01-sea1.fbcdn.net
|
||||
instagram-p3-shv-01-sjc3.fbcdn.net
|
||||
instagram-p3-shv-01-sof1.fbcdn.net
|
||||
instagram-p3-shv-01-ssn1.fbcdn.net
|
||||
instagram-p3-shv-01-syd2.fbcdn.net
|
||||
instagram-p3-shv-01-tpe1.fbcdn.net
|
||||
instagram-p3-shv-01-vie1.fbcdn.net
|
||||
instagram-p3-shv-01-yyz1.fbcdn.net
|
||||
instagram-p3-shv-02-bom1.fbcdn.net
|
||||
instagram-p3-shv-02-gru2.fbcdn.net
|
||||
instagram-p3-shv-02-maa2.fbcdn.net
|
||||
instagram-p3-shv-02-mia3.fbcdn.net
|
||||
instagram-p3-shv-02-mrs2.fbcdn.net
|
||||
instagram-p4-shv-01-arn2.fbcdn.net
|
||||
instagram-p4-shv-01-lga3.fbcdn.net
|
||||
instagram-p4-shv-01-mia3.fbcdn.net
|
||||
instagram-p4-shv-01-sea1.fbcdn.net
|
||||
instagram-p4-shv-02-bom1.fbcdn.net
|
||||
instagram-p42-shv-01-arn2.fbcdn.net
|
||||
instagram-p42-shv-01-bru2.fbcdn.net
|
||||
instagram-p42-shv-01-lga3.fbcdn.net
|
||||
instagram-p42-shv-01-mad1.fbcdn.net
|
||||
instagram-p42-shv-01-mia3.fbcdn.net
|
||||
instagram-p42-shv-01-mrs2.fbcdn.net
|
||||
instagram-p42-shv-01-mxp1.fbcdn.net
|
||||
instagram-p42-shv-01-nrt1.fbcdn.net
|
||||
instagram-p42-shv-01-otp1.fbcdn.net
|
||||
instagram-p42-shv-01-prg1.fbcdn.net
|
||||
instagram-p42-shv-01-sea1.fbcdn.net
|
||||
instagram-p42-shv-01-sof1.fbcdn.net
|
||||
instagram-p42-shv-01-syd2.fbcdn.net
|
||||
instagram-p42-shv-01-vie1.fbcdn.net
|
||||
instagram-p42-shv-01-yyz1.fbcdn.net
|
||||
instagram-p42-shv-02-bom1.fbcdn.net
|
||||
instagram-press.com
|
||||
instagram-press.net
|
||||
instagram.c10r.instagram.com
|
||||
instagram.com
|
||||
instagram.fbeg10-1.fna.fbcdn.net
|
||||
instagram.fkiv7-1.fna.fbcdn.net
|
||||
instagram.frix7-1.fna.fbcdn.net
|
||||
instagram.fsof11-1.fna.fbcdn.net
|
||||
instagram.fsof8-1.fna.fbcdn.net
|
||||
instagramhashtags.net
|
||||
instagramhilecim.com
|
||||
instagramhilesi.org
|
||||
@@ -42,9 +174,284 @@ instanttelegram.com
|
||||
instaplayer.net
|
||||
instastyle.tv
|
||||
instgram.com
|
||||
l.instagram.com
|
||||
live-dev.instagram.com
|
||||
live-upload-staging.instagram.com
|
||||
live-upload.instagram.com
|
||||
logger.instagram.com
|
||||
lookaside.facebook.com
|
||||
lookaside.instagram.com
|
||||
m.instagram.com
|
||||
maps.instagram.com
|
||||
my-od-3.instagram.com
|
||||
my-od.instagram.com
|
||||
oninstagram.com
|
||||
online-instagram.com
|
||||
onlineinstagram.com
|
||||
parents.instagram.com
|
||||
platform.instagram.com
|
||||
preprod.instagram.com
|
||||
privacycenter.instagram.com
|
||||
scontent-a-ams.cdninstagram.com
|
||||
scontent-a-atl.cdninstagram.com
|
||||
scontent-a-bru.cdninstagram.com
|
||||
scontent-a-cdg.cdninstagram.com
|
||||
scontent-a-dfw.cdninstagram.com
|
||||
scontent-a-gru.cdninstagram.com
|
||||
scontent-a-hkg.cdninstagram.com
|
||||
scontent-a-hkg4-2.cdninstagram.com
|
||||
scontent-a-iad.cdninstagram.com
|
||||
scontent-a-iev1-1.cdninstagram.com
|
||||
scontent-a-lax.cdninstagram.com
|
||||
scontent-a-lga.cdninstagram.com
|
||||
scontent-a-lhr.cdninstagram.com
|
||||
scontent-a-mad.cdninstagram.com
|
||||
scontent-a-mct1-1.cdninstagram.com
|
||||
scontent-a-mia.cdninstagram.com
|
||||
scontent-a-mxp.cdninstagram.com
|
||||
scontent-a-nrt.cdninstagram.com
|
||||
scontent-a-sea.cdninstagram.com
|
||||
scontent-a-sin.cdninstagram.com
|
||||
scontent-a-sjc.cdninstagram.com
|
||||
scontent-a-vie.cdninstagram.com
|
||||
scontent-a.cdninstagram.com
|
||||
scontent-akl1-1.cdninstagram.com
|
||||
scontent-ams.cdninstagram.com
|
||||
scontent-ams2-1.cdninstagram.com
|
||||
scontent-ams4-1.cdninstagram.com
|
||||
scontent-arn2-1.cdninstagram.com
|
||||
scontent-arn2-1.xx.fbcdn.net
|
||||
scontent-atl.cdninstagram.com
|
||||
scontent-atl3-1.cdninstagram.com
|
||||
scontent-atl3-2.cdninstagram.com
|
||||
scontent-b-ams.cdninstagram.com
|
||||
scontent-b-atl.cdninstagram.com
|
||||
scontent-b-bru.cdninstagram.com
|
||||
scontent-b-dfw.cdninstagram.com
|
||||
scontent-b-gru.cdninstagram.com
|
||||
scontent-b-hkg.cdninstagram.com
|
||||
scontent-b-hkg4-1.cdninstagram.com
|
||||
scontent-b-hkg4-2.cdninstagram.com
|
||||
scontent-b-iad.cdninstagram.com
|
||||
scontent-b-iev1-1.cdninstagram.com
|
||||
scontent-b-lax.cdninstagram.com
|
||||
scontent-b-lga.cdninstagram.com
|
||||
scontent-b-lhr.cdninstagram.com
|
||||
scontent-b-mct1-1.cdninstagram.com
|
||||
scontent-b-mia.cdninstagram.com
|
||||
scontent-b-mxp.cdninstagram.com
|
||||
scontent-b-nrt.cdninstagram.com
|
||||
scontent-b-sin.cdninstagram.com
|
||||
scontent-b-vie.cdninstagram.com
|
||||
scontent-b.cdninstagram.com
|
||||
scontent-ber1-1.cdninstagram.com
|
||||
scontent-bom1-1.cdninstagram.com
|
||||
scontent-bom1-2.cdninstagram.com
|
||||
scontent-bos5-1.cdninstagram.com
|
||||
scontent-bru.cdninstagram.com
|
||||
scontent-bru2-1.cdninstagram.com
|
||||
scontent-ccu1-1.cdninstagram.com
|
||||
scontent-cdg.cdninstagram.com
|
||||
scontent-cdg4-1.cdninstagram.com
|
||||
scontent-cdg4-2.cdninstagram.com
|
||||
scontent-cdg4-3.cdninstagram.com
|
||||
scontent-cgk.cdninstagram.com
|
||||
scontent-cgk1-1.cdninstagram.com
|
||||
scontent-cgk1-2.cdninstagram.com
|
||||
scontent-cph2-1.cdninstagram.com
|
||||
scontent-cpt1-1.cdninstagram.com
|
||||
scontent-del1-1.cdninstagram.com
|
||||
scontent-del1-2.cdninstagram.com
|
||||
scontent-dfw.cdninstagram.com
|
||||
scontent-dfw5-1.cdninstagram.com
|
||||
scontent-dfw5-2.cdninstagram.com
|
||||
scontent-dub4-1.cdninstagram.com
|
||||
scontent-dus.cdninstagram.com
|
||||
scontent-dus1-1.cdninstagram.com
|
||||
scontent-eze1-1.cdninstagram.com
|
||||
scontent-fco2-1.cdninstagram.com
|
||||
scontent-fml1-1.cdninstagram.com
|
||||
scontent-fra3-1.cdninstagram.com
|
||||
scontent-fra3-2.cdninstagram.com
|
||||
scontent-fra5-1.cdninstagram.com
|
||||
scontent-fra5-2.cdninstagram.com
|
||||
scontent-gmp1-1.cdninstagram.com
|
||||
scontent-gru.cdninstagram.com
|
||||
scontent-gru1-1.cdninstagram.com
|
||||
scontent-gru1-2.cdninstagram.com
|
||||
scontent-gru2-1.cdninstagram.com
|
||||
scontent-gru2-2.cdninstagram.com
|
||||
scontent-gua1-1.cdninstagram.com
|
||||
scontent-ham3-1.cdninstagram.com
|
||||
scontent-hbe1-1.cdninstagram.com
|
||||
scontent-hel3-1.cdninstagram.com
|
||||
scontent-hel3-1.xx.fbcdn.net
|
||||
scontent-hkg.cdninstagram.com
|
||||
scontent-hkg4-1.cdninstagram.com
|
||||
scontent-hkg4-2.cdninstagram.com
|
||||
scontent-hou1-1.cdninstagram.com
|
||||
scontent-iad.cdninstagram.com
|
||||
scontent-iad3-1.cdninstagram.com
|
||||
scontent-iad3-2.cdninstagram.com
|
||||
scontent-iev1-1.cdninstagram.com
|
||||
scontent-ist1-1.cdninstagram.com
|
||||
scontent-itm1-1.cdninstagram.com
|
||||
scontent-lax.cdninstagram.com
|
||||
scontent-lax3-1.cdninstagram.com
|
||||
scontent-lax3-2.cdninstagram.com
|
||||
scontent-lga.cdninstagram.com
|
||||
scontent-lga3-1.cdninstagram.com
|
||||
scontent-lga3-2.cdninstagram.com
|
||||
scontent-lhr.cdninstagram.com
|
||||
scontent-lhr8-1.cdninstagram.com
|
||||
scontent-lhr8-2.cdninstagram.com
|
||||
scontent-lim1-1.cdninstagram.com
|
||||
scontent-lis1-1.cdninstagram.com
|
||||
scontent-los2-1.cdninstagram.com
|
||||
scontent-maa2-1.cdninstagram.com
|
||||
scontent-maa2-2.cdninstagram.com
|
||||
scontent-mad.cdninstagram.com
|
||||
scontent-mad1-1.cdninstagram.com
|
||||
scontent-mad2-1.cdninstagram.com
|
||||
scontent-man2-1.cdninstagram.com
|
||||
scontent-mct1-1.cdninstagram.com
|
||||
scontent-mia.cdninstagram.com
|
||||
scontent-mia3-1.cdninstagram.com
|
||||
scontent-mia3-2.cdninstagram.com
|
||||
scontent-mrs.cdninstagram.com
|
||||
scontent-mrs2-1.cdninstagram.com
|
||||
scontent-mrs2-2.cdninstagram.com
|
||||
scontent-msp1-1.cdninstagram.com
|
||||
scontent-muc2-1.cdninstagram.com
|
||||
scontent-mxp.cdninstagram.com
|
||||
scontent-mxp1-1.cdninstagram.com
|
||||
scontent-mxp2-1.cdninstagram.com
|
||||
scontent-nrt.cdninstagram.com
|
||||
scontent-nrt1-1.cdninstagram.com
|
||||
scontent-nrt1-2.cdninstagram.com
|
||||
scontent-ord5-1.cdninstagram.com
|
||||
scontent-ord5-2.cdninstagram.com
|
||||
scontent-otp1-1.cdninstagram.com
|
||||
scontent-otp1-1.xx.fbcdn.net
|
||||
scontent-pmo1-1.cdninstagram.com
|
||||
scontent-prg1-1.cdninstagram.com
|
||||
scontent-prg1-1.xx.fbcdn.net
|
||||
scontent-qro1-1.cdninstagram.com
|
||||
scontent-qro1-2.cdninstagram.com
|
||||
scontent-scl2-1.cdninstagram.com
|
||||
scontent-sea.cdninstagram.com
|
||||
scontent-sea1-1.cdninstagram.com
|
||||
scontent-sin.cdninstagram.com
|
||||
scontent-sin6-1.cdninstagram.com
|
||||
scontent-sin6-2.cdninstagram.com
|
||||
scontent-sin6-3.cdninstagram.com
|
||||
scontent-sin6-4.cdninstagram.com
|
||||
scontent-sjc.cdninstagram.com
|
||||
scontent-sjc3-1.cdninstagram.com
|
||||
scontent-sof1-1.cdninstagram.com
|
||||
scontent-sof1-2.cdninstagram.com
|
||||
scontent-sof1-2.xx.fbcdn.net
|
||||
scontent-ssn1-1.cdninstagram.com
|
||||
scontent-syd2-1.cdninstagram.com
|
||||
scontent-tpe.cdninstagram.com
|
||||
scontent-tpe1-1.cdninstagram.com
|
||||
scontent-vie.cdninstagram.com
|
||||
scontent-vie1-1.cdninstagram.com
|
||||
scontent-yyz1-1.cdninstagram.com
|
||||
scontent-zrh1-1.cdninstagram.com
|
||||
scontent.cdninstagram.com
|
||||
scontent.fbeg10-1.fna.fbcdn.net
|
||||
secure.latest.instagram.com
|
||||
shortwave.instagram.com
|
||||
unknownjapan.instagram.com
|
||||
upload-ec2.instagram.com
|
||||
upload.instagram.com
|
||||
video-ber1-1.cdninstagram.com
|
||||
video-dus1-1.cdninstagram.com
|
||||
video-eze1-1.cdninstagram.com
|
||||
video-gru1-2.cdninstagram.com
|
||||
video-hkg4-1.cdninstagram.com
|
||||
video-hkg4-2.cdninstagram.com
|
||||
video-iad3-1.cdninstagram.com
|
||||
video-qro1-1.cdninstagram.com
|
||||
video-ssn1-1.cdninstagram.com
|
||||
video-tpe1-1.cdninstagram.com
|
||||
web-instagram.net
|
||||
web.facebook.com
|
||||
wellbeing.instagram.com
|
||||
www.ig.me
|
||||
www.instagram.com
|
||||
www.secure.instagram.com
|
||||
wwwinstagram.com
|
||||
instagram.fkiv7-1.fna.fbcdn.net
|
||||
z-p15-scontent-a-hkg4-1.cdninstagram.com
|
||||
z-p15-scontent-a-hkg4-2.cdninstagram.com
|
||||
z-p15-scontent-a-iev1-1.cdninstagram.com
|
||||
z-p15-scontent-a-mct1-1.cdninstagram.com
|
||||
z-p15-scontent-b-hkg4-1.cdninstagram.com
|
||||
z-p15-scontent-b-hkg4-2.cdninstagram.com
|
||||
z-p15-scontent-b-iev1-1.cdninstagram.com
|
||||
z-p15-scontent-b-mct1-1.cdninstagram.com
|
||||
z-p15-scontent-bru2-1.cdninstagram.com
|
||||
z-p15-scontent-hkg4-1.cdninstagram.com
|
||||
z-p15-scontent-hkg4-2.cdninstagram.com
|
||||
z-p15-scontent-iev1-1.cdninstagram.com
|
||||
z-p15-scontent-mct1-1.cdninstagram.com
|
||||
z-p15-scontent.cdninstagram.com
|
||||
z-p15.www.instagram.com
|
||||
z-p3.www.instagram.com
|
||||
z-p4-scontent-a-hkg4-1.cdninstagram.com
|
||||
z-p4-scontent-a-hkg4-2.cdninstagram.com
|
||||
z-p4-scontent-a-iev1-1.cdninstagram.com
|
||||
z-p4-scontent-a-mct1-1.cdninstagram.com
|
||||
z-p4-scontent-ams4-1.cdninstagram.com
|
||||
z-p4-scontent-arn2-1.cdninstagram.com
|
||||
z-p4-scontent-b-hkg4-1.cdninstagram.com
|
||||
z-p4-scontent-b-hkg4-2.cdninstagram.com
|
||||
z-p4-scontent-b-iev1-1.cdninstagram.com
|
||||
z-p4-scontent-b-mct1-1.cdninstagram.com
|
||||
z-p4-scontent-cgk1-1.cdninstagram.com
|
||||
z-p4-scontent-cgk1-2.cdninstagram.com
|
||||
z-p4-scontent-cph2-1.cdninstagram.com
|
||||
z-p4-scontent-dfw5-1.cdninstagram.com
|
||||
z-p4-scontent-hkg4-1.cdninstagram.com
|
||||
z-p4-scontent-hkg4-2.cdninstagram.com
|
||||
z-p4-scontent-iev1-1.cdninstagram.com
|
||||
z-p4-scontent-mct1-1.cdninstagram.com
|
||||
z-p4-scontent-mxp1-1.cdninstagram.com
|
||||
z-p4-scontent-nrt1-1.cdninstagram.com
|
||||
z-p4-scontent-otp1-1.cdninstagram.com
|
||||
z-p4-scontent-sea1-1.cdninstagram.com
|
||||
z-p4-scontent-sin6-1.cdninstagram.com
|
||||
z-p4-scontent-sin6-2.cdninstagram.com
|
||||
z-p4-scontent-sin6-3.cdninstagram.com
|
||||
z-p4-scontent-ssn1-1.cdninstagram.com
|
||||
z-p4-scontent-vie1-1.cdninstagram.com
|
||||
z-p4-scontent.cdninstagram.com
|
||||
z-p4.graph.instagram.com
|
||||
z-p42-chat-e2ee-ig.facebook.com
|
||||
z-p42-instagram.c10r.instagram.com
|
||||
z-p42-scontent-a-hkg4-1.cdninstagram.com
|
||||
z-p42-scontent-a-hkg4-2.cdninstagram.com
|
||||
z-p42-scontent-a-iev1-1.cdninstagram.com
|
||||
z-p42-scontent-a-mct1-1.cdninstagram.com
|
||||
z-p42-scontent-arn2-1.cdninstagram.com
|
||||
z-p42-scontent-b-hkg4-1.cdninstagram.com
|
||||
z-p42-scontent-b-hkg4-2.cdninstagram.com
|
||||
z-p42-scontent-b-iev1-1.cdninstagram.com
|
||||
z-p42-scontent-b-mct1-1.cdninstagram.com
|
||||
z-p42-scontent-b-sjc3-1.cdninstagram.com
|
||||
z-p42-scontent-bru2-1.cdninstagram.com
|
||||
z-p42-scontent-dus1-1.cdninstagram.com
|
||||
z-p42-scontent-gru2-1.cdninstagram.com
|
||||
z-p42-scontent-gru2-2.cdninstagram.com
|
||||
z-p42-scontent-hkg4-1.cdninstagram.com
|
||||
z-p42-scontent-hkg4-2.cdninstagram.com
|
||||
z-p42-scontent-iev1-1.cdninstagram.com
|
||||
z-p42-scontent-los2-1.cdninstagram.com
|
||||
z-p42-scontent-mct1-1.cdninstagram.com
|
||||
z-p42-scontent-prg1-1.cdninstagram.com
|
||||
z-p42-scontent-sea1-1.cdninstagram.com
|
||||
z-p42-scontent-sof1-1.cdninstagram.com
|
||||
z-p42-scontent-vie1-1.cdninstagram.com
|
||||
z-p42-scontent.cdninstagram.com
|
||||
z-p42.i.instagram.com
|
||||
|
||||
116
platforms/dns-jetbrains.txt
Normal file
116
platforms/dns-jetbrains.txt
Normal file
@@ -0,0 +1,116 @@
|
||||
jetbrains.com.cn
|
||||
jb.gg
|
||||
myjetbrains.com
|
||||
jetbrains.com
|
||||
intellij.net
|
||||
jetbrains.space
|
||||
awsproxy.pkg-cdn.jetbrains.space
|
||||
byid.eu-1.jetbrains.space
|
||||
byid.jetbrains.space
|
||||
cloudfront.pkg-cdn.jetbrains.space
|
||||
corona.jetbrains.space
|
||||
dc.jetbrains.space
|
||||
element.jetbrains.space
|
||||
eu-1.jetbrains.space
|
||||
justtoplay.jetbrains.space
|
||||
maven.jetbrains.space
|
||||
maven.pkg.jetbrains.space
|
||||
ngenix.assets.service.jetbrains.space
|
||||
pkg-cdn.jetbrains.space
|
||||
pkg.eu-1.jetbrains.space
|
||||
registry.eu-1.jetbrains.space
|
||||
registry.jetbrains.space
|
||||
ruhlaender.jetbrains.space
|
||||
space-cdn.jetbrains.space
|
||||
swu-acm.jetbrains.space
|
||||
walx.jetbrains.space
|
||||
academy.jetbrains.com
|
||||
account.jetbrains.com
|
||||
adobe.fls.jetbrains.com
|
||||
amazon.fls.jetbrains.com
|
||||
ap-help.api.jetbrains.com
|
||||
api-test.sandbox-resellers.jetbrains.com
|
||||
autoconfig.api.jetbrains.com
|
||||
autodiscover.api.jetbrains.com
|
||||
blog.jetbrains.com
|
||||
blogs.jetbrains.com
|
||||
ca.jetbrains.com
|
||||
cai.jetbrains.com
|
||||
cloudconfig.jetbrains.com
|
||||
code-with-me.jetbrains.com
|
||||
code2art.jetbrains.com
|
||||
codewithme-lobby-production.api.jetbrains.com
|
||||
codewithme-lobby-staging.api.jetbrains.com
|
||||
codewithme-lobby.api.jetbrains.com
|
||||
codewithme-relay-europe-north1-1.api.jetbrains.com
|
||||
codewithme-relay-europe-north1-2.api.jetbrains.com
|
||||
comments.blog.jetbrains.com
|
||||
configr.jetbrains.com
|
||||
confluence.jetbrains.com
|
||||
datalore-forum.jetbrains.com
|
||||
datalore.jetbrains.com
|
||||
dotcover-support.jetbrains.com
|
||||
dotmemory-support.jetbrains.com
|
||||
dotnet-ea.services.jetbrains.com
|
||||
dotpeek-support.jetbrains.com
|
||||
dottrace-support.jetbrains.com
|
||||
download-cdn.jetbrains.com
|
||||
dunnhumby.fls.jetbrains.com
|
||||
ea.jetbrains.com
|
||||
eap.jetbrains.com
|
||||
employee-guides.jetbrains.com
|
||||
fleet-relay.api.jetbrains.com
|
||||
ge.jetbrains.com
|
||||
geo2.datalore.jetbrains.com
|
||||
guide.master-zdchint.mau.jetbrains.com
|
||||
guide.staging-zdchint.mau.jetbrains.com
|
||||
hacktoberfest2020.mau.jetbrains.com
|
||||
handle.prod.csat.mau.jetbrains.com
|
||||
handle.staging.csat.mau.jetbrains.com
|
||||
hello.jetbrains.com
|
||||
ij-perf.jetbrains.com
|
||||
index-cdn.jetbrains.com
|
||||
int.api.jetbrains.com
|
||||
internship.jetbrains.com
|
||||
jb-team.fls.jetbrains.com
|
||||
jbstats.jetbrains.com
|
||||
jetarchive.jetbrains.com
|
||||
jetpeople.jetbrains.com
|
||||
local.api.jetbrains.com
|
||||
lp.jetbrains.com
|
||||
lservice.jetbrains.com
|
||||
mail.jetbrains.com
|
||||
marketplace.jetbrains.com
|
||||
merchandise.jetbrains.com
|
||||
mkto-mailer.jetbrains.com
|
||||
mta-sts.jetbrains.com
|
||||
oauth.fls.jetbrains.com
|
||||
oauth2-proxy-api.api.jetbrains.com
|
||||
package-search.jetbrains.com
|
||||
package-search.services.jetbrains.com
|
||||
plugins.jetbrains.com
|
||||
renew-your-ssl-certificate.jetbrains.com
|
||||
resharper-plugins.jetbrains.com
|
||||
resources.jetbrains.com
|
||||
skyscanner.fls.jetbrains.com
|
||||
slack-bdt.mau.jetbrains.com
|
||||
slack-mps.jetbrains.com
|
||||
slack.jetbrains.com
|
||||
spotify.fls.jetbrains.com
|
||||
stackexchange.master-zdchint.mau.jetbrains.com
|
||||
stackexchange.staging-zdchint.mau.jetbrains.com
|
||||
staging.zdviewcount.mau.jetbrains.com
|
||||
support.jetbrains.com
|
||||
sv.fls.jetbrains.com
|
||||
teamcity-support.jetbrains.com
|
||||
teamcity.jetbrains.com
|
||||
tiles.datalore.jetbrains.com
|
||||
tiles2.datalore.jetbrains.com
|
||||
uploads.jetbrains.com
|
||||
uploads.services.jetbrains.com
|
||||
upsource.jetbrains.com
|
||||
view.datalore.jetbrains.com
|
||||
onboard.jetbrains.com
|
||||
youtube.master-zdchint.mau.jetbrains.com
|
||||
youtube.staging-zdchint.mau.jetbrains.com
|
||||
zillow.fls.jetbrains.com
|
||||
@@ -1,6 +1,786 @@
|
||||
netflix.ca
|
||||
aa26lmhjxsb7falok6bns.netflixdnstest1.com
|
||||
aa7jg34j7jytgcdzro3y4.netflixdnstest1.com
|
||||
aaf5zdykj6ziau2rns6ei.netflixdnstest1.com
|
||||
aanuszvxhzfxhlpycmb4u.netflixdnstest1.com
|
||||
aaodvk3myycri2nyjbhve.netflixdnstest1.com
|
||||
aapwit4a6lcexwislsabo.netflixdnstest1.com
|
||||
aaqikascpdx4elgg6ab66.netflixdnstest1.com
|
||||
aaqr7k7xc5uocmsvawf6u.netflixdnstest1.com
|
||||
aartrozqxjh6guyvq2wug.netflixdnstest1.com
|
||||
aau4vbjcmlqbwdrdjk4hk.netflixdnstest1.com
|
||||
aawqx4jvpurxizattpozu.netflixdnstest1.com
|
||||
aayenlvil5nebupornk5o.netflixdnstest1.com
|
||||
aayjhftdiruee32heywiy.netflixdnstest1.com
|
||||
ab5p42w2pmmvq34ljzcm4.netflixdnstest1.com
|
||||
ab6pcao47zfy2c35b62ps.netflixdnstest1.com
|
||||
abapdxvzgb4drwskzh7qk.netflixdnstest1.com
|
||||
abdqlliza73fgbf3dl3hq.netflixdnstest1.com
|
||||
abdxsdgkspave335rjk34.netflixdnstest1.com
|
||||
abe3kjgv5ro75osfee4je.netflixdnstest1.com
|
||||
abhff6i6wprmeq6y7gniy.netflixdnstest1.com
|
||||
about.netflix.com
|
||||
abq6zi7bhaisjkuqf7vzo.netflixdnstest1.com
|
||||
abqxviog3gsa66jqvempu.netflixdnstest1.com
|
||||
abu2a3ifiwtnfynsuty4i.netflixdnstest1.com
|
||||
abv272dwwa2c6jy6ibxny.netflixdnstest1.com
|
||||
abxjoudtwvdve44u2a2j6.netflixdnstest1.com
|
||||
abz5ijhc2g4pzzoptpj22.netflixdnstest1.com
|
||||
abzsahofzuyskwupkzttk.netflixdnstest1.com
|
||||
ac2s22yd4rfvykzaqlkm2.netflixdnstest1.com
|
||||
acbntokn2kj6oe7jhq32k.netflixdnstest1.com
|
||||
access.netflixstudios.com
|
||||
aciaqfamhcinfjirj3upa.netflixdnstest1.com
|
||||
acjmn6qfyep32cmpsvlkq.netflixdnstest1.com
|
||||
ackxq4lrmftovjt3qhafw.netflixdnstest1.com
|
||||
aclml24lphpesl4yevyju.netflixdnstest1.com
|
||||
acmat6gqrw4xhfzoa43kluk7kl6afuck32gtjie3.netflixdnstest1.com
|
||||
acopwws4ttd3h5mkusc6c.netflixdnstest1.com
|
||||
acpf6vdliri3fcwvcs5oa.netflixdnstest1.com
|
||||
acrprnffwjnflsh6zmb3a.netflixdnstest1.com
|
||||
actyar7wobc7kejs6cwri.netflixdnstest1.com
|
||||
acwctv7wtzkycon2cxxx2.netflixdnstest1.com
|
||||
adayyg5upy22x5mfko6ik.netflixdnstest1.com
|
||||
adbpcfuckivyj3woxyrmi.netflixdnstest1.com
|
||||
adhawcfgx4kkeot6tnoh4.netflixdnstest1.com
|
||||
adhz63cf5whnqfebvmdfg.netflixdnstest1.com
|
||||
adjaaoejrtwsb67mf34ds.netflixdnstest1.com
|
||||
adkwokotfyl2ozixau2jg.netflixdnstest1.com
|
||||
adl2nt6l3am7pwvn2a4pc.netflixdnstest1.com
|
||||
adldap.itp.netflix.com
|
||||
adnkew7disj722aa6uews.netflixdnstest1.com
|
||||
adoqcx27d2qejarub2awc.netflixdnstest1.com
|
||||
adwx7zwl4klr3fzef5yww.netflixdnstest1.com
|
||||
adxnjn56fojfimiezqq7c.netflixdnstest1.com
|
||||
afoaglymdpdigptn3tpiy.netflixdnstest1.com
|
||||
afodepclemxkgz3h5fpl4.netflixdnstest1.com
|
||||
afokskcjxfjgpt4wfdorw.netflixdnstest1.com
|
||||
alertprocessor.dta.netflix.com
|
||||
android-appboot.eu-west-1.prodaa.netflix.com
|
||||
android-appboot.latency.prodaa.netflix.com
|
||||
android-appboot.us-east-1-sa.prodaa.netflix.com
|
||||
android-appboot.us-east-1.prodaa.netflix.com
|
||||
android-appboot.us-west-2.prodaa.netflix.com
|
||||
android-h2.prod.ftl.netflix.com
|
||||
android.nccp.eu-west-1.origin.prodaa.netflix.com
|
||||
android.nccp.eu-west-1.prodaa.netflix.com
|
||||
android.nccp.latency.prodaa.netflix.com
|
||||
android.nccp.us-east-1-sa.prodaa.netflix.com
|
||||
android.nccp.us-east-1.prodaa.netflix.com
|
||||
android.nccp.us-west-2.prodaa.netflix.com
|
||||
android.prod.cloud.netflix.com
|
||||
android.prod.ftl.netflix.com
|
||||
android13.appboot.netflix.com
|
||||
anycast.ftl.netflix.com
|
||||
apdocmandev100.itd.netflix.com
|
||||
api-ftl.eu-west-1.prodaa.netflix.com
|
||||
api-ftl.us-east-1-sa.prodaa.netflix.com
|
||||
api-ftl.us-east-1.prodaa.netflix.com
|
||||
api-ftl.us-west-2.prodaa.netflix.com
|
||||
api-global.eu-west-1.origin.prodaa.netflix.com
|
||||
api-global.eu-west-1.prodaa.netflix.com
|
||||
api-global.latency.prodaa.netflix.com
|
||||
api-global.us-east-1-sa.prodaa.netflix.com
|
||||
api-global.us-east-1.origin.prodaa.netflix.com
|
||||
api-global.us-east-1.prodaa.netflix.com
|
||||
api-global.us-west-2.origin.prodaa.netflix.com
|
||||
api-global.us-west-2.prodaa.netflix.com
|
||||
api-nodequark.test.netflix.com
|
||||
api-us.eu-west-1.prodaa.netflix.com
|
||||
api-us.latency.prodaa.netflix.com
|
||||
api-us.us-east-1-sa.prodaa.netflix.com
|
||||
api-us.us-east-1.prodaa.netflix.com
|
||||
api-us.us-west-2.prodaa.netflix.com
|
||||
api-user.eu-west-1.prodaa.netflix.com
|
||||
api-user.latency.prodaa.netflix.com
|
||||
api-user.us-east-1-sa.prodaa.netflix.com
|
||||
api-user.us-east-1.prodaa.netflix.com
|
||||
api-user.us-west-2.prodaa.netflix.com
|
||||
api.eu-west-1.origin.prodaa.netflix.com
|
||||
api.eu-west-1.prodaa.netflix.com
|
||||
api.latency.prodaa.netflix.com
|
||||
api.sandbox.us-east-1.prodaa.netflix.com
|
||||
api.us-east-1-sa.prodaa.netflix.com
|
||||
api.us-east-1.origin.prodaa.netflix.com
|
||||
api.us-east-1.prodaa.netflix.com
|
||||
api.us-west-2.origin.prodaa.netflix.com
|
||||
api.us-west-2.prodaa.netflix.com
|
||||
appboot.eu-west-1.origin.prodaa.netflix.com
|
||||
appboot.eu-west-1.prodaa.netflix.com
|
||||
appboot.latency.prodaa.netflix.com
|
||||
appboot.us-east-1-sa.prodaa.netflix.com
|
||||
appboot.us-east-1.origin.prodaa.netflix.com
|
||||
appboot.us-east-1.prodaa.netflix.com
|
||||
appboot.us-east-2.origin.prodaa.netflix.com
|
||||
appboot.us-west-2.origin.prodaa.netflix.com
|
||||
appboot.us-west-2.prodaa.netflix.com
|
||||
artisthub.netflixstudios.com
|
||||
assets.nflxext.com
|
||||
athena-api.prod.netflixstudios.com
|
||||
athena.prod.netflixstudios.com
|
||||
b2b.netflix.com
|
||||
b2bt.netflix.com
|
||||
beacon.eu-west-1.prodaa.netflix.com
|
||||
beacon.latency.prodaa.netflix.com
|
||||
beacon.us-east-1-sa.prodaa.netflix.com
|
||||
beacon.us-east-1.prodaa.netflix.com
|
||||
beacon.us-west-2.prodaa.netflix.com
|
||||
beaconimages-prod.us-east-1.prodaa.netflix.com
|
||||
beaconimages-prod.us-west-2.prodaa.netflix.com
|
||||
cast-oc.netflix.com
|
||||
catalog.eu-west-1.prodaa.netflix.com
|
||||
catalog.us-east-1-sa.prodaa.netflix.com
|
||||
catalog.us-east-1.prodaa.netflix.com
|
||||
catalog.us-west-2.prodaa.netflix.com
|
||||
cbp-us.nccp.eu-west-1.prodaa.netflix.com
|
||||
cbp-us.nccp.latency.prodaa.netflix.com
|
||||
cbp-us.nccp.us-east-1-sa.prodaa.netflix.com
|
||||
cbp-us.nccp.us-east-1.prodaa.netflix.com
|
||||
cbp-us.nccp.us-west-2.prodaa.netflix.com
|
||||
cbp.nccp.eu-west-1.prodaa.netflix.com
|
||||
cbp.nccp.latency.prodaa.netflix.com
|
||||
cbp.nccp.us-east-1-sa.prodaa.netflix.com
|
||||
cbp.nccp.us-east-1.prodaa.netflix.com
|
||||
cbp.nccp.us-west-2.prodaa.netflix.com
|
||||
ccs-int.latency.prodaa.netflix.com
|
||||
ccs-log.latency.prodaa.netflix.com
|
||||
ccs-log.us-west-2.prodaa.netflix.com
|
||||
ccs-manifest.us-west-2.prodaa.netflix.com
|
||||
ccs.eu-west-1.prodaa.netflix.com
|
||||
ccs.latency.prodaa.netflix.com
|
||||
ccs.us-east-1.prodaa.netflix.com
|
||||
ccs.us-west-2.prodaa.netflix.com
|
||||
contact.netflix.com
|
||||
contentrfpqna.netflix.com
|
||||
creativeservices.itp.netflix.com
|
||||
crf.netflix.com
|
||||
crftest.netflix.com
|
||||
csapi.prod.dvdco.netflix.com
|
||||
csapi.test.dvdco.netflix.com
|
||||
ctech-flix6-02.prod.prodtech.netflixstudios.com
|
||||
customerevents.eu-west-1.prodaa.netflix.com
|
||||
customerevents.latency.prodaa.netflix.com
|
||||
customerevents.us-east-1-sa.prodaa.netflix.com
|
||||
customerevents.us-east-1.prodaa.netflix.com
|
||||
customerevents.us-west-2.prodaa.netflix.com
|
||||
dc1-prod.netflix.com
|
||||
ddi03.sjc004.ix.nflxvideo.net
|
||||
ddi04.sjc004.ix.nflxvideo.net
|
||||
dnm.prod.eu-west-1.prodaa.netflix.com
|
||||
dnm.prod.latency.prodaa.netflix.com
|
||||
dnm.prod.us-east-1-sa.prodaa.netflix.com
|
||||
dnm.prod.us-east-1.prodaa.netflix.com
|
||||
dnm.prod.us-west-2.prodaa.netflix.com
|
||||
dnmi.prod.eu-west-1.prodaa.netflix.com
|
||||
dnmi.prod.us-east-1-sa.prodaa.netflix.com
|
||||
dnmi.prod.us-east-1.prodaa.netflix.com
|
||||
dnmi.prod.us-west-2.prodaa.netflix.com
|
||||
dualstack-anycast.prod.ftl.netflix.com
|
||||
dvd-www-test-baseline-stable.eng.dvdco.netflix.com
|
||||
dvdfs.netflix.com
|
||||
efowqjkak7cwdxazlzpwi-usw2.netflixdnstest1.com
|
||||
efpfoac3ef3zyyvufhfne-usw2.netflixdnstest1.com
|
||||
estats.netflix.com
|
||||
eu-west-1-probe.prod.ftl.netflix.com
|
||||
fast.com
|
||||
foo.netflixdnstest1.com
|
||||
ftl.netflix.com
|
||||
gateway.netflix.com
|
||||
geolocation.onetrust.com
|
||||
gfoqmptyoe4jkbdnf3vqi-usw2.netflixdnstest1.com
|
||||
gfotmmkgqc33ecb2s2pm2-usw2.netflixdnstest1.com
|
||||
gfp22di7xe45sbo4rxkcc-usw2.netflixdnstest1.com
|
||||
gfp334gbmvxa6bnelelxu-usw2.netflixdnstest1.com
|
||||
gfp7wmvikgssstttqvbec-usw2.netflixdnstest1.com
|
||||
gfpau5cffynq5b76u25vy-usw2.netflixdnstest1.com
|
||||
gfpaucsvyihh2gxsqk222-usw2.netflixdnstest1.com
|
||||
gfpr7fqbjlanhgpx3ewjk-usw2.netflixdnstest1.com
|
||||
gfpu43ja24st42rze3xbo-usw2.netflixdnstest1.com
|
||||
gfpuosgohypep75gf3xb6-usw2.netflixdnstest1.com
|
||||
gfpussf2qdon7hfc3qnf6-usw2.netflixdnstest1.com
|
||||
gfpzivkyt6jegadbua2sy-usw2.netflixdnstest1.com
|
||||
gfqcwd3pq5cxxvah6q5iw-usw2.netflixdnstest1.com
|
||||
gfqh2biuujh4df3yvkphw-euw1.netflixdnstest1.com
|
||||
ichnaea-experiment.prodaa.netflix.com
|
||||
ichnaea-web.eu-west-1.prodaa.netflix.com
|
||||
ichnaea-web.latency.prodaa.netflix.com
|
||||
ichnaea-web.us-east-1-sa.prodaa.netflix.com
|
||||
ichnaea-web.us-east-1.prodaa.netflix.com
|
||||
ichnaea-web.us-west-2.prodaa.netflix.com
|
||||
ichnaea.eu-west-1.origin.prodaa.netflix.com
|
||||
ichnaea.eu-west-1.prodaa.netflix.com
|
||||
ichnaea.latency.prodaa.netflix.com
|
||||
ichnaea.staging.us-east-1.prodaa.netflix.com
|
||||
ichnaea.staging.us-west-2.prodaa.netflix.com
|
||||
ichnaea.us-east-1-sa.prodaa.netflix.com
|
||||
ichnaea.us-east-1.origin.prodaa.netflix.com
|
||||
ichnaea.us-east-1.prodaa.netflix.com
|
||||
ichnaea.us-west-2.origin.prodaa.netflix.com
|
||||
ichnaea.us-west-2.prodaa.netflix.com
|
||||
ifo4hwfatv3mr4kla42nw-euw1.netflixdnstest1.com
|
||||
ifo6qcmy5pzqqkpzmlei2-usw2.netflixdnstest1.com
|
||||
ifo7ligommwucao6uie54-euw1.netflixdnstest1.com
|
||||
ifodp7yzothfhaznf4tyq-euw1.netflixdnstest1.com
|
||||
ifogfbt2kr3mxwvt5caos.netflixdnstest1.com
|
||||
ifopzgcwuwo3pqvr2ycek.netflixdnstest1.com
|
||||
ifovqmfwkxxlexxln4vns-euw1.netflixdnstest1.com
|
||||
ifowcowewkukndqiwwyt6-usw2.netflixdnstest1.com
|
||||
ifoypncxht4rysw3o2y4g-euw1.netflixdnstest1.com
|
||||
ifp2n4xxjvs24oses4mgs-usw2.netflixdnstest1.com
|
||||
ifp32fxzykx3x6viipj2i-usw2.netflixdnstest1.com
|
||||
ifp3g2slwu7nn3ejawif2-usw2.netflixdnstest1.com
|
||||
ifp3oyzxacvvtgqcnykym-usw2.netflixdnstest1.com
|
||||
ifp45ur767hemzzohd2ie-usw2.netflixdnstest1.com
|
||||
ifp4ejnlwgfyqpwzdbhuu-euw1.netflixdnstest1.com
|
||||
ifp4gkolhfrszm65z7j2w-usw2.netflixdnstest1.com
|
||||
ifp4rrzspgfgr32wguj62-usw2.netflixdnstest1.com
|
||||
ifp4y6bwaajp32xncbujq-usw2.netflixdnstest1.com
|
||||
ifp5bj5pzu6rhvbexoczm-usw2.netflixdnstest1.com
|
||||
ifp5ne3me4byxvcx65xgm-usw2.netflixdnstest1.com
|
||||
ifp5uke6wfobfoqxjweak-euw1.netflixdnstest1.com
|
||||
ifp6uv2hk6n5bwi73r724-usw2.netflixdnstest1.com
|
||||
ifp6wjhhxdi6vcqi3sfxm-usw2.netflixdnstest1.com
|
||||
ifp6zlt5mzgjff3bknkza-euw1.netflixdnstest1.com
|
||||
ifp7fndovqcvtpaokpg4y-usw2.netflixdnstest1.com
|
||||
ifp7k2txtnnnlrhsag27e-usw2.netflixdnstest1.com
|
||||
ifp7khsomazca3f2mse66-usw2.netflixdnstest1.com
|
||||
ifp7skxoaaomsraykm3jo-use1.netflixdnstest1.com
|
||||
ifpaaymnhdm64e6ytbi56-euw1.netflixdnstest1.com
|
||||
ifphx6lgqoyk3wen25k4i-usw2.netflixdnstest1.com
|
||||
ifpif2icptioh2akyj4yg-usw2.netflixdnstest1.com
|
||||
ifpjx6inl5xk4j7ipsdwu-usw2.netflixdnstest1.com
|
||||
ifplpzhaibllbcyin2ig4-usw2.netflixdnstest1.com
|
||||
ifpouhakuduv2x3wmvoec-euw1.netflixdnstest1.com
|
||||
ifpr2qcx2bkufbwbaew6y-usw2.netflixdnstest1.com
|
||||
ifpr5u6k3r5w3z7py7lei-euw1.netflixdnstest1.com
|
||||
ifprctisxppvna3lid76m-usw2.netflixdnstest1.com
|
||||
ifps7gyjxbay4nfvksvye-usw2.netflixdnstest1.com
|
||||
ifpsmqk25dnajg7t4pyfo-usw2.netflixdnstest1.com
|
||||
ifpspnmow62po5bgm6slqeut2agfrk5iqqbmn7gb-usw2.netflixdnstest1.com
|
||||
ifpsrevqmandndbljfm72-usw2.netflixdnstest1.com
|
||||
ifpsv4kswomn6xrsxaypo-usw2.netflixdnstest1.com
|
||||
ifpsvewemdre6qo7qvqio-usw2.netflixdnstest1.com
|
||||
ifptgxd72c3ylc2rtujd6-usw2.netflixdnstest1.com
|
||||
ifptl552zicbxyf4pysfc-usw2.netflixdnstest1.com
|
||||
ifptnvur3etfothfwkdqe-usw2.netflixdnstest1.com
|
||||
ifptqkljxf7ilezuift34-usw2.netflixdnstest1.com
|
||||
ifpunwmhne4sxlxv7fxee-usw2.netflixdnstest1.com
|
||||
ifpve3n7qmxxsolbg2epm-usw2.netflixdnstest1.com
|
||||
ifpwjnlaxbdnmi7as2do73ypdeprnv5eho4alt2e-usw2.netflixdnstest1.com
|
||||
ifpwtj2l2jvygq6eiwzhw4zuldmosnemthplifjq-usw2.netflixdnstest1.com
|
||||
ifpwufuc3ifq4hjg6quuk-usw2.netflixdnstest1.com
|
||||
ifpx7fu7k2iwds2p6audq-usw2.netflixdnstest1.com
|
||||
ifpxjhzyotecdcqqhk4lq-usw2.netflixdnstest1.com
|
||||
ifpxsfck7src3pgjbnzbo-usw2.netflixdnstest1.com
|
||||
ifpxvavvshx2dcx2axwk6-usw2.netflixdnstest1.com
|
||||
ifpzee3vel3bihb33hkmu-euw1.netflixdnstest1.com
|
||||
ifqa6hgf2pe2sd7rancgu-usw2.netflixdnstest1.com
|
||||
ifqaig3nvoleu7pe4txbq-usw2.netflixdnstest1.com
|
||||
ifqcag7fwtb7alsbwzdz2-usw2.netflixdnstest1.com
|
||||
ifqdwcxwectldjn6pvdvo-usw2.netflixdnstest1.com
|
||||
ifqfgcqesay5ufguik6gm-usw2.netflixdnstest1.com
|
||||
ifqi6d6roai57bewbgp4a-usw2.netflixdnstest1.com
|
||||
ifqmkgzovfteq5clq7vuy-usw2.netflixdnstest1.com
|
||||
ifqp4fmrkk54wlq5wts2e-usw2.netflixdnstest1.com
|
||||
ios-h2.prod.ftl.netflix.com
|
||||
ios.nccp.eu-west-1.prodaa.netflix.com
|
||||
ios.nccp.latency.prodaa.netflix.com
|
||||
ios.nccp.us-east-1-sa.prodaa.netflix.com
|
||||
ios.nccp.us-east-1.prodaa.netflix.com
|
||||
ios.nccp.us-west-2.prodaa.netflix.com
|
||||
ipv4-c001-aca001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-agu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-amd002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-bpm002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-bro001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-bud001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-del002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-dgo001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-gdl005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-gdl007-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-gdl008-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-ipl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-jai001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-jal003-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-jal004-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-lap001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-lov001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-mex012-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-mex014-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-mex015-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-mnl006-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-mty002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-oax001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-pat001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-pbc002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-pvr001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-rix001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-sjc001-nflxoc-isp.1.live.nflxvideo.net
|
||||
ipv4-c001-sjc001-nflxoc-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-slp002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-sof001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-tpq001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-upn001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c001-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-aca001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-agu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-amd002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-bpm002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-bro001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-bud001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-ccu002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-del002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-gdl005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-gdl007-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-gdl008-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-iev001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-ipl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-jai001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-jal003-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-jal004-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-lap001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-mex012-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-mex014-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-mex015-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-mty002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-oax001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-pat001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-pbc002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-pvr001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-rix001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-sjc001-nflxoc-isp.1.live.nflxvideo.net
|
||||
ipv4-c002-sjc001-nflxoc-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-slp002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-sof001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-tpq001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-upn001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c002-waw001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-aca001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-agu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-amd002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-bud001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-ccu002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-del002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-dgo001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-gdl006-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-iev001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-ipl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-jal004-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-mex014-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-mex015-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-mnl003-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-mty002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-mzt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-nag001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-oax001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-pbc002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-rix001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-slp002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-tpq001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-upn001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c003-was001-dev-ix.1.oca.nflxvideo.net
|
||||
ipv4-c003-waw001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-agu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-amd002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-bpm002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-cjs001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-del002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-gdl006-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-iev001-retn-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-ipl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-jal003-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-jal004-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-lap001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-mex010-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-mnl003-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-mzt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-pbc002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-tlc001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-trc001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c004-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-bpm002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-ccu002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-cjs001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-jal003-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-mex010-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-tlc001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-trc001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c005-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-ccu002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-cjs001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-cvj001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-mid001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-mlm001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-nag001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-tgz001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c006-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-cuu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-cvj001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-mid001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-mnl003-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-nag001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-qro001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c007-tgz001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c008-cjs001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c008-cuu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c008-cvj001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c008-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c008-mid001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c008-mnl002-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv4-c008-mnl003-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv4-c008-nag001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c008-ntr001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c009-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c009-cuu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c009-cyw001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c009-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c009-mid001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c009-mnl002-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv4-c009-ntr001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c009-qro001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c009-slw001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c010-bjx001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c010-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c010-cuu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c010-cvj001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c010-cyw001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c010-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c010-mex005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c011-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c011-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c011-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c011-mex005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c012-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv4-c012-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c012-mex005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c012-mtt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c013-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c013-mex005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c013-mtt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c014-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c014-mtt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c015-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c015-mtt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c021-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c022-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c023-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c024-mty001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c024-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c025-buh001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c025-mty001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c025-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c026-mty001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c027-buh001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c028-buh001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c028-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c029-buh001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c029-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c030-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c031-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c032-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c033-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c035-buh001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c036-buh001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c037-buh001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c037-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c038-buh001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c038-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c039-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c040-buh001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c040-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c041-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c042-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c043-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c044-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c045-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv4-c065-sjc002-dev-ix.1.oca.nflxvideo.net
|
||||
ipv4-c090-dus002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c092-dus002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c093-dus002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c094-dus002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c099-dus002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c100-dus002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c159-fra002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c160-fra002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c161-fra002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c162-fra002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c163-fra002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c164-fra002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c165-fra002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c168-was001-dev-ix.1.oca.nflxvideo.net
|
||||
ipv4-c175-fra002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c186-fra002-ix.1.oca.nflxvideo.net
|
||||
ipv4-c405-dfw001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c406-dfw001-ix.1.oca.nflxvideo.net
|
||||
ipv4-c641-sjc002-dev-ix.1.oca.nflxvideo.net
|
||||
ipv4-c664-ord001-ix.1.oca.nflxvideo.net
|
||||
ipv4only-anycast.prod.ftl.netflix.com
|
||||
ipv6-c001-aca001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-agu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-amd002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-bpm002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-bro001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-del002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-dgo001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-gdl005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-gdl007-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-gdl008-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-ipl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-jai001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-jal003-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-jal004-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-lap001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-lov001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-mex012-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-mex014-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-mex015-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-mnl006-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-mty002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-oax001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-pat001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-pbc002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-pvr001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-sjc001-nflxoc-isp.1.live.nflxvideo.net
|
||||
ipv6-c001-sjc001-nflxoc-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-slp002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-tpq001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-upn001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c001-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-aca001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-agu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-amd002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-bpm002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-bro001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-ccu002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-del002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-gdl005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-gdl007-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-gdl008-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-ipl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-jai001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-jal003-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-jal004-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-lap001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-mex012-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-mex014-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-mex015-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-mty002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-oax001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-pat001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-pbc002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-pvr001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-sjc001-nflxoc-isp.1.live.nflxvideo.net
|
||||
ipv6-c002-sjc001-nflxoc-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-slp002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-tpq001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-upn001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c002-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-aca001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-agu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-amd002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-ccu002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-del002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-dgo001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-gdl006-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-ipl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-jal004-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-mex014-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-mex015-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-mnl003-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-mty002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-mzt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-nag001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-oax001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-pbc002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-slp002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-tpq001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-upn001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c003-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-agu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-amd002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-bpm002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-cjs001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-del002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-gdl006-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-ipl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-jal003-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-jal004-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-lap001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-mex010-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-mnl003-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-mzt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-pbc002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-tlc001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-trc001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c004-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-bpm002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-ccu002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-cjs001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-jal003-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-mex010-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-tlc001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-trc001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c005-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-ccu002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-cjs001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-cul001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-cvj001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-mid001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-mlm001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-nag001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-tgz001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c006-vsa001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-blr002-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-cuu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-cvj001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-maa001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-mid001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-mnl003-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-nag001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-qro001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c007-tgz001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c008-cjs001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c008-cuu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c008-cvj001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c008-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c008-mid001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c008-mnl002-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv6-c008-mnl003-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv6-c008-nag001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c008-ntr001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c009-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c009-cuu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c009-cyw001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c009-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c009-mid001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c009-mnl002-pldt-isp.1.oca.nflxvideo.net
|
||||
ipv6-c009-ntr001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c009-qro001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c009-slw001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c010-bjx001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c010-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c010-cuu001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c010-cvj001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c010-cyw001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c010-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c010-mex005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c011-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c011-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c011-del001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c011-mex005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c012-bom001-jio-isp.1.oca.nflxvideo.net
|
||||
ipv6-c012-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c012-mex005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c012-mtt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c013-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c013-mex005-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c013-mtt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c014-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c014-mtt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c015-cun001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c015-mtt001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c021-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c022-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c023-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c024-mty001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c024-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c025-mty001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c025-tij001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c026-mty001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c028-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c029-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c030-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c031-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c032-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c032-hkg001-ix.1.oca.nflxvideo.net
|
||||
ipv6-c033-gdl001-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c037-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c038-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c039-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c040-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c041-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c042-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c043-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c044-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c045-mex002-telmex-isp.1.oca.nflxvideo.net
|
||||
ipv6-c168-was001-dev-ix.1.oca.nflxvideo.net
|
||||
ixanycast.ftl.netflix.com
|
||||
jarvis.prod.dvdco.netflix.com
|
||||
jarvis.test.dvdco.netflix.com
|
||||
jobs.netflix.com
|
||||
jobsitebeta.netflix.com
|
||||
ldmg101.netflix.com
|
||||
leia.eu-west-1.prodaa.netflix.com
|
||||
leia.latency.prodaa.netflix.com
|
||||
leia.us-east-1-sa.prodaa.netflix.com
|
||||
leia.us-east-1.prodaa.netflix.com
|
||||
leia.us-west-2.prodaa.netflix.com
|
||||
logs.netflix.com
|
||||
magfsprod101.itp.netflix.com
|
||||
magfsprod102.itp.netflix.com
|
||||
manage.netflix.com
|
||||
mediawiki.netflix.com
|
||||
mf-dvd-west-1a.itp.netflix.com
|
||||
mf-mgmt101-west-1c.itp.netflix.com
|
||||
mf-streaming-snap-west-1c.itp.netflix.com
|
||||
mf-streaming-west-1c.itp.netflix.com
|
||||
minerva-alpha-api.test.netflixstudios.com
|
||||
minerva-beta-api.test.netflixstudios.com
|
||||
mobile-ixanycast.ftl.netflix.com
|
||||
mtls.sandbox.partnerapi.netflix.com
|
||||
nccp-nrdp-31.eu-west-1.prodaa.netflix.com
|
||||
nccp-nrdp-31.latency.prodaa.netflix.com
|
||||
nccp-nrdp-31.us-east-1-sa.prodaa.netflix.com
|
||||
nccp-nrdp-31.us-east-1.prodaa.netflix.com
|
||||
nccp-nrdp-31.us-west-2.prodaa.netflix.com
|
||||
nccp-starfox.eu-west-1.prodaa.netflix.com
|
||||
nccp-starfox.us-east-1-sa.prodaa.netflix.com
|
||||
nccp-starfox.us-east-1.prodaa.netflix.com
|
||||
nccp-starfox.us-west-2.prodaa.netflix.com
|
||||
netflix.ca
|
||||
netflix.com
|
||||
netflix.com.au
|
||||
netflix.net
|
||||
netflixdnstest1.com
|
||||
netflixdnstest10.com
|
||||
netflixdnstest2.com
|
||||
@@ -13,4 +793,163 @@ netflixdnstest8.com
|
||||
netflixdnstest9.com
|
||||
netflixinvestor.com
|
||||
netflixstudios.com
|
||||
netflixtechblog.com
|
||||
netflixtechblog.com
|
||||
nflix-dominoblog-prod-01.itp.netflix.com
|
||||
nflxext.com
|
||||
nflximg.com
|
||||
nflxsearch.net
|
||||
nflxvideo.net
|
||||
nintendo.nccp.eu-west-1.prodaa.netflix.com
|
||||
nintendo.nccp.latency.prodaa.netflix.com
|
||||
nintendo.nccp.us-east-1-sa.prodaa.netflix.com
|
||||
nintendo.nccp.us-east-1.prodaa.netflix.com
|
||||
nintendo.nccp.us-west-2.prodaa.netflix.com
|
||||
nmtracking.eu-west-1.prodaa.netflix.com
|
||||
nmtracking.latency.prodaa.netflix.com
|
||||
nmtracking.us-east-1-sa.prodaa.netflix.com
|
||||
nmtracking.us-east-1.prodaa.netflix.com
|
||||
nmtracking.us-west-2.prodaa.netflix.com
|
||||
np3.prod.netflixstudios.com
|
||||
nrd.api.latency.prodaa.netflix.com
|
||||
nrdp-ixanycast.ftl.netflix.com
|
||||
nrdp.nccp.eu-west-1.origin.prodaa.netflix.com
|
||||
nrdp.nccp.eu-west-1.prodaa.netflix.com
|
||||
nrdp.nccp.latency.prodaa.netflix.com
|
||||
nrdp.nccp.us-east-1-sa.prodaa.netflix.com
|
||||
nrdp.nccp.us-east-1.origin.prodaa.netflix.com
|
||||
nrdp.nccp.us-east-1.prodaa.netflix.com
|
||||
nrdp.nccp.us-east-2.origin.prodaa.netflix.com
|
||||
nrdp.nccp.us-west-2.origin.prodaa.netflix.com
|
||||
nrdp.nccp.us-west-2.prodaa.netflix.com
|
||||
nrdp.prod.cloud.us-east-1.origin.prodaa.netflix.com
|
||||
nrdp.prod.cloud.us-east-1.prodaa.netflix.com
|
||||
nrdp.prod.cloud.us-west-2.origin.prodaa.netflix.com
|
||||
nrdp.prod.cloud.us-west-2.prodaa.netflix.com
|
||||
nsa-use1f-gw01.netflixstudios.com
|
||||
nsa-usw2b-gw01.netflixstudios.com
|
||||
nsa-usw2c-gw01.netflixstudios.com
|
||||
obiwan-wc.eu-west-1.prodaa.netflix.com
|
||||
obiwan-wc.us-east-1.prodaa.netflix.com
|
||||
obiwan-wc.us-west-2.prodaa.netflix.com
|
||||
obiwan.eu-west-1.prodaa.netflix.com
|
||||
obiwan.latency.prodaa.netflix.com
|
||||
obiwan.us-east-1-sa.prodaa.netflix.com
|
||||
obiwan.us-east-1.prodaa.netflix.com
|
||||
obiwan.us-west-2.prodaa.netflix.com
|
||||
oca-api.eu-west-1.origin.prodaa.netflix.com
|
||||
oca-api.eu-west-1.prodaa.netflix.com
|
||||
oca-api.latency.prodaa.netflix.com
|
||||
oca-api.us-east-1-sa.prodaa.netflix.com
|
||||
oca-api.us-east-1.origin.prodaa.netflix.com
|
||||
oca-api.us-east-1.prodaa.netflix.com
|
||||
oca-api.us-west-2.origin.prodaa.netflix.com
|
||||
oca-api.us-west-2.prodaa.netflix.com
|
||||
occ-0-3924-3467.1.nflxso.net
|
||||
partner.netflix.com
|
||||
partnerapi.eu-west-1.prodaa.netflix.com
|
||||
partnerapi.us-east-1-sa.prodaa.netflix.com
|
||||
partnerapi.us-east-1.prodaa.netflix.com
|
||||
partnerapi.us-west-2.prodaa.netflix.com
|
||||
pix.netflix.com
|
||||
playstation.nccp.eu-west-1.prodaa.netflix.com
|
||||
playstation.nccp.latency.prodaa.netflix.com
|
||||
playstation.nccp.us-east-1-sa.prodaa.netflix.com
|
||||
playstation.nccp.us-east-1.prodaa.netflix.com
|
||||
playstation.nccp.us-west-2.prodaa.netflix.com
|
||||
po12.es02.cdg001.ix.nflxvideo.net
|
||||
presentationtracking.eu-west-1.prodaa.netflix.com
|
||||
presentationtracking.latency.prodaa.netflix.com
|
||||
presentationtracking.us-east-1-sa.prodaa.netflix.com
|
||||
presentationtracking.us-east-1.prodaa.netflix.com
|
||||
presentationtracking.us-west-2.prodaa.netflix.com
|
||||
privacyportal.onetrust.com
|
||||
probe-cell4.prod.ftl.netflix.com
|
||||
probe-cell7.prod.ftl.netflix.com
|
||||
probe-cell8.prod.ftl.netflix.com
|
||||
probe-cell9.prod.ftl.netflix.com
|
||||
probe-dradis-anycast.prod.ftl.netflix.com
|
||||
prod.cloud.eu-west-1.origin.prodaa.netflix.com
|
||||
prod.cloud.eu-west-1.prodaa.netflix.com
|
||||
prod.cloud.latency.prodaa.netflix.com
|
||||
prod.cloud.us-east-1-sa.prodaa.netflix.com
|
||||
prod.cloud.us-east-1.origin.prodaa.netflix.com
|
||||
prod.cloud.us-east-1.prodaa.netflix.com
|
||||
prod.cloud.us-west-2.prodaa.netflix.com
|
||||
prod.http1.eu-west-1.origin.prodaa.netflix.com
|
||||
prod.http1.eu-west-1.prodaa.netflix.com
|
||||
prod.http1.latency.prodaa.netflix.com
|
||||
prod.http1.us-east-1-sa.prodaa.netflix.com
|
||||
prod.http1.us-east-1.origin.prodaa.netflix.com
|
||||
prod.http1.us-east-1.prodaa.netflix.com
|
||||
prod.http1.us-west-2.prodaa.netflix.com
|
||||
prod.mtls.partner.eu-west-1.prodaa.netflix.com
|
||||
prod.mtls.partner.us-east-1.prodaa.netflix.com
|
||||
prod.mtls.partner.us-west-2.prodaa.netflix.com
|
||||
prod.partner.eu-west-1.prodaa.netflix.com
|
||||
prod.partner.us-east-1-sa.prodaa.netflix.com
|
||||
prod.partner.us-east-1.prodaa.netflix.com
|
||||
prod.partner.us-west-2.prodaa.netflix.com
|
||||
prod.partnersecure.us-east-1.prodaa.netflix.com
|
||||
prod.partnersecure.us-west-2.prodaa.netflix.com
|
||||
prod.voicecontrol.eu-west-1.origin.prodaa.netflix.com
|
||||
prod.voicecontrol.eu-west-1.prodaa.netflix.com
|
||||
prod.voicecontrol.us-east-1-sa.prodaa.netflix.com
|
||||
prod.voicecontrol.us-east-1.origin.prodaa.netflix.com
|
||||
prod.voicecontrol.us-east-1.prodaa.netflix.com
|
||||
prod.voicecontrol.us-west-2.origin.prodaa.netflix.com
|
||||
prod.voicecontrol.us-west-2.prodaa.netflix.com
|
||||
prototypes.netflix.com
|
||||
push.prod.netflix.com
|
||||
rap.netflix.com
|
||||
sbc.netflix.com
|
||||
schedule.dta.netflix.com
|
||||
screening.netflix.com
|
||||
sec-oc.netflix.com
|
||||
segments.itp.netflix.com
|
||||
sopbeta.netflix.com
|
||||
static.netflix.com
|
||||
stm-go.netflix.com
|
||||
sv1-ddi01.netflix.com
|
||||
sv1-ddi02.netflix.com
|
||||
sv5-ddi01.netflix.com
|
||||
tags.netflix.com
|
||||
test.partnersecure.eu-west-1.prodaa.netflix.com
|
||||
test.partnersecure.us-east-1.prodaa.netflix.com
|
||||
test.partnersecure.us-west-2.prodaa.netflix.com
|
||||
test.voicecontrol.eu-west-1.origin.prodaa.netflix.com
|
||||
test.voicecontrol.eu-west-1.prodaa.netflix.com
|
||||
test.voicecontrol.us-east-1-sa.prodaa.netflix.com
|
||||
test.voicecontrol.us-east-1.origin.prodaa.netflix.com
|
||||
test.voicecontrol.us-east-1.prodaa.netflix.com
|
||||
test.voicecontrol.us-west-2.prodaa.netflix.com
|
||||
testplan.dta.netflix.com
|
||||
tractorbeam.us-west-2.prodaa.netflix.com
|
||||
uiboot.eu-west-1.origin.prodaa.netflix.com
|
||||
uiboot.eu-west-1.prodaa.netflix.com
|
||||
uiboot.latency.prodaa.netflix.com
|
||||
uiboot.us-east-1-sa.prodaa.netflix.com
|
||||
uiboot.us-east-1.origin.prodaa.netflix.com
|
||||
uiboot.us-east-1.prodaa.netflix.com
|
||||
uiboot.us-west-2.origin.prodaa.netflix.com
|
||||
uiboot.us-west-2.prodaa.netflix.com
|
||||
us-east-1-probe.prod.ftl.netflix.com
|
||||
us-west-2-probe.prod.ftl.netflix.com
|
||||
util.netflix.com
|
||||
vpn.netflix.com
|
||||
web.prod.cloud.netflix.com
|
||||
wvpn.netflix.com
|
||||
www.netflix.com
|
||||
www.netflixdnstest1.com
|
||||
www.netflixtechblog.com
|
||||
www.sandbox.eu-west-1.origin.prodaa.netflix.com
|
||||
www.sandbox.eu-west-1.prodaa.netflix.com
|
||||
www.sandbox.us-east-1-sa.prodaa.netflix.com
|
||||
www.sandbox.us-east-1.origin.prodaa.netflix.com
|
||||
www.sandbox.us-east-1.prodaa.netflix.com
|
||||
www.sandbox.us-west-2.origin.prodaa.netflix.com
|
||||
www.sandbox.us-west-2.prodaa.netflix.com
|
||||
xbox.nccp.eu-west-1.prodaa.netflix.com
|
||||
xbox.nccp.latency.prodaa.netflix.com
|
||||
xbox.nccp.us-east-1-sa.prodaa.netflix.com
|
||||
xbox.nccp.us-east-1.prodaa.netflix.com
|
||||
xbox.nccp.us-west-2.prodaa.netflix.com
|
||||
|
||||
5
platforms/dns-num.txt
Normal file
5
platforms/dns-num.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
themoviedb.org
|
||||
tmdb.org
|
||||
image.tmdb.org
|
||||
api.themoviedb.org
|
||||
tmdb-image-prod.b-cdn.net
|
||||
163
platforms/dns-onlinetheater.txt
Normal file
163
platforms/dns-onlinetheater.txt
Normal file
@@ -0,0 +1,163 @@
|
||||
acheron.stream.voidboost.cc
|
||||
anteros.stream.voidboost.cc
|
||||
api-bunny.themoviedb.org
|
||||
api.themoviedb.org
|
||||
api.tmdb.org
|
||||
apollo.stream.voidboost.cc
|
||||
app.kinoplay.app
|
||||
aquila.stream.voidboost.cc
|
||||
atlas.stream.voidboost.cc
|
||||
aurum.stream.voidboost.cc
|
||||
auth.themoviedb.org
|
||||
autodiscover.themoviedb.org
|
||||
baator.stream.voidboost.cc
|
||||
bbs.stream.voidboost.cc
|
||||
blog.themoviedb.org
|
||||
blue.stream.voidboost.cc
|
||||
bytopia.stream.voidboost.cc
|
||||
celestia.stream.voidboost.cc
|
||||
centaurus.stream.voidboost.cc
|
||||
coliseum.stream.voidboost.cc
|
||||
consul.stream.voidboost.cc
|
||||
corvus.stream.voidboost.cc
|
||||
cub.red
|
||||
delta.stream.voidboost.cc
|
||||
developer.themoviedb.org
|
||||
developers.themoviedb.org
|
||||
doramy.club
|
||||
druid.stream.voidboost.cc
|
||||
eclipse.stream.voidboost.cc
|
||||
elvis.stream.voidboost.cc
|
||||
elysium.stream.voidboost.cc
|
||||
explorer.stream.voidboost.cc
|
||||
falcon.stream.voidboost.cc
|
||||
fiber.stream.voidboost.cc
|
||||
files.themoviedb.org
|
||||
files.tmdb.org
|
||||
filmix.ag
|
||||
filmix.biz
|
||||
filmix.date
|
||||
filmix.fm
|
||||
filmix.me
|
||||
filmix.ac
|
||||
flerovium.stream.voidboost.cc
|
||||
gamma.stream.voidboost.cc
|
||||
get.kinoplay.app
|
||||
hammer.stream.voidboost.cc
|
||||
hdrezka.ag
|
||||
hdrezka.cm
|
||||
hdrezka.me
|
||||
hydrus.stream.voidboost.cc
|
||||
image-bunny.tmdb.org
|
||||
image.tmdb.org
|
||||
images.tmdb.org
|
||||
jointinum.stream.voidboost.cc
|
||||
jupiter.stream.voidboost.cc
|
||||
kino.pub
|
||||
kinobase.org
|
||||
kinoplay.app
|
||||
kinovod.net
|
||||
kinovod.pro
|
||||
kinozal.me
|
||||
kinozal.tv
|
||||
kurt.stream.voidboost.cc
|
||||
lacerta.stream.voidboost.cc
|
||||
limbo.stream.voidboost.cc
|
||||
lipsium.stream.voidboost.cc
|
||||
lostfilm.download
|
||||
lostfilm.tv
|
||||
lostfilm.win
|
||||
louvre.stream.voidboost.cc
|
||||
lutetium.stream.voidboost.cc
|
||||
lynx.stream.voidboost.cc
|
||||
m.filmix.me
|
||||
mail.kino.pub
|
||||
maxima.stream.voidboost.cc
|
||||
media.themoviedb.org
|
||||
mercury.stream.voidboost.cc
|
||||
milanium.stream.voidboost.cc
|
||||
monoceros.stream.voidboost.cc
|
||||
mystic.stream.voidboost.cc
|
||||
nailium.stream.voidboost.cc
|
||||
neon.stream.voidboost.cc
|
||||
nexus.stream.voidboost.cc
|
||||
nika.stream.voidboost.cc
|
||||
nuceria.stream.voidboost.cc
|
||||
omega.stream.voidboost.cc
|
||||
osmium.stream.voidboost.cc
|
||||
ozzy.stream.voidboost.cc
|
||||
pe.stream.voidboost.cc
|
||||
pegasus.stream.voidboost.cc
|
||||
phantom.stream.voidboost.cc
|
||||
phoenix.stream.voidboost.cc
|
||||
platinum.stream.voidboost.cc
|
||||
polaris.stream.voidboost.cc
|
||||
prism.stream.voidboost.cc
|
||||
proton.stream.voidboost.cc
|
||||
pulse.stream.voidboost.cc
|
||||
radium.stream.voidboost.cc
|
||||
ranger.stream.voidboost.cc
|
||||
red.stream.voidboost.cc
|
||||
relax.stream.voidboost.cc
|
||||
rezka.ag
|
||||
rezkify.com
|
||||
rufilmtv.tv
|
||||
sagitta.stream.voidboost.cc
|
||||
saturn.stream.voidboost.cc
|
||||
scorpius.stream.voidboost.cc
|
||||
secret.stream.voidboost.cc
|
||||
selenium.stream.voidboost.cc
|
||||
shadow.stream.voidboost.cc
|
||||
sierra.stream.voidboost.cc
|
||||
silence.stream.voidboost.cc
|
||||
skinium.stream.voidboost.cc
|
||||
skullium.stream.voidboost.cc
|
||||
sound.filmix.biz
|
||||
sound.filmix.fm
|
||||
sound.filmix.me
|
||||
srv.voidnetwork.cloud
|
||||
st.kinobase.org
|
||||
st.kinovod.net
|
||||
static.hdrezka.ac
|
||||
static.hdrezka.ag
|
||||
static.lostfilm.top
|
||||
static.voidboost.com
|
||||
statichdrezka.ac
|
||||
status.themoviedb.org
|
||||
stream.voidboost.cc
|
||||
stream.voidboost.in
|
||||
strontium.stream.voidboost.cc
|
||||
thallium.stream.voidboost.cc
|
||||
themoviedb.org
|
||||
thumbs.filmix.biz
|
||||
thumbs.filmix.fm
|
||||
tmdb.org
|
||||
tornado.stream.voidboost.cc
|
||||
ununbium.stream.voidboost.cc
|
||||
venus.stream.voidboost.cc
|
||||
vespene.stream.voidboost.cc
|
||||
viking.stream.voidboost.in
|
||||
web01.stream.voidboost.cc
|
||||
web02.stream.voidboost.cc
|
||||
www.doramy.club
|
||||
www.filmix.ag
|
||||
www.filmix.biz
|
||||
www.filmix.fm
|
||||
www.filmix.me
|
||||
www.hdrezka.ag
|
||||
www.hdrezka.cm
|
||||
www.kinobase.org
|
||||
www.kinoplay.app
|
||||
www.kinovod.net
|
||||
www.kinozal.me
|
||||
www.kinozal.tv
|
||||
www.lostfilm.download
|
||||
www.lostfilm.tv
|
||||
www.lostfilm.win
|
||||
www.m.filmix.me
|
||||
www.rezka.ag
|
||||
www.serv01001.xyz
|
||||
www.stream.voidboost.cc
|
||||
www.themoviedb.org
|
||||
zeflix.online
|
||||
zetimage.net
|
||||
@@ -29,5 +29,4 @@ platform.api.openai.com
|
||||
platform.openai.com
|
||||
spinningup.openai.com
|
||||
universe.openai.com
|
||||
www.openai.com
|
||||
chatgpt.com
|
||||
@@ -1,9 +1,5 @@
|
||||
ya.ru
|
||||
www.google.com
|
||||
google.com
|
||||
www.google.ru
|
||||
google.ru
|
||||
www.bing.com
|
||||
bing.com
|
||||
www.yahoo.com
|
||||
yahoo.com
|
||||
10307
platforms/dns-telegram.txt
Normal file
10307
platforms/dns-telegram.txt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -22,4 +22,5 @@ tiktokv.com
|
||||
us.tiktok.com
|
||||
verify-sg.tiktok.com
|
||||
v16-tiktokcdn-com.akamaized.net
|
||||
v16-va.tiktokcdn.com
|
||||
v16-va.tiktokcdn.com
|
||||
mcs-va.tiktokv.com
|
||||
@@ -20,7 +20,7 @@ thepirate-bay.org
|
||||
torrentgalaxy.to
|
||||
torrent-games.best
|
||||
torrentz2eu.org
|
||||
www.limetorrents.info
|
||||
www.pirateproxy-bay.com
|
||||
www.torlock.com
|
||||
www.torrentdownloads.me
|
||||
limetorrents.info
|
||||
pirateproxy-bay.com
|
||||
torlock.com
|
||||
torrentdownloads.me
|
||||
@@ -187,7 +187,6 @@ tst.twitch.tv
|
||||
ttv-redirect.m7g.twitch.tv
|
||||
tv.twitch.tv
|
||||
tw.blog.twitch.tv
|
||||
twitch.tv
|
||||
upload.twitch.tv
|
||||
upload2.twitch.tv
|
||||
usher.twitch.tv
|
||||
@@ -201,17 +200,7 @@ watch.twitch.tv
|
||||
webdisk.staging.twitch.tv
|
||||
wwq.rc.twitch.tv
|
||||
www-origin-anycast.twitch.tv
|
||||
www.cis.blog.twitch.tv
|
||||
www.cp2.rc.twitch.tv
|
||||
www.ica.rc.twitch.tv
|
||||
www.if.rc.twitch.tv
|
||||
www.it.blog.twitch.tv
|
||||
www.link.twitch.tv
|
||||
www.lion.rc.twitch.tv
|
||||
www.safesync.rc.twitch.tv
|
||||
www.staging.twitch.tv
|
||||
www.stash.rc.twitch.tv
|
||||
www.twitch.tv
|
||||
www.wwq.rc.twitch.tv
|
||||
staging.twitch.tv
|
||||
stash.rc.twitch.tv
|
||||
zh-cn.twitch.tv
|
||||
zh-tw.twitch.tv
|
||||
@@ -43,18 +43,12 @@ api-44-0-0.twitter.com
|
||||
api-45-0-0.twitter.com
|
||||
api-46-0-0.twitter.com
|
||||
api-stream.twitter.com
|
||||
cdn.syndication.twimg.com
|
||||
dc-api.twitter.com
|
||||
pbs.twimg.com
|
||||
pbs.twimg.com.akamaized.net
|
||||
pbs-ak.twimg.com
|
||||
platform.twitter.com
|
||||
s.twitter.com
|
||||
syndication.twitter.com
|
||||
t.co
|
||||
ton.twitter.com
|
||||
twitter.com
|
||||
tweetdeck.com
|
||||
twimg.com
|
||||
video.twimg.com
|
||||
x.com
|
||||
x.com
|
||||
abs.twimg.com
|
||||
abs-0.twimg.com
|
||||
pscp.tv
|
||||
|
||||
7
platforms/dns-windsurf.txt
Normal file
7
platforms/dns-windsurf.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
windsurf.com
|
||||
codeium.com
|
||||
server.codeium.com
|
||||
web-backend.codeium.com
|
||||
unleash.codeium.com
|
||||
inference.codeium.com
|
||||
codeiumdata.com
|
||||
65
platforms/dns-xbox.txt
Normal file
65
platforms/dns-xbox.txt
Normal file
@@ -0,0 +1,65 @@
|
||||
account.live.com
|
||||
account.microsoft.com
|
||||
accounts.xboxlive.com
|
||||
activeauth.argo.xboxlive.com
|
||||
addr.tools
|
||||
amppublish-ssl.ppe.xboxlive.com
|
||||
as.gsrv.xboxlive.com
|
||||
avatarcloset-part.int2.xboxlive.com
|
||||
avatarcloset-pvt.int2.xboxlive.com
|
||||
avatarwrite-part.int2.xboxlive.com
|
||||
bay.gfx.ms
|
||||
ber01p.gssv-apxy-prod.xboxlive.com
|
||||
blu.gfx.ms
|
||||
brms.nonprod.xboxlive.com
|
||||
careerreader-cy2.xboxlive.com
|
||||
cimagecallback-ssl.xboxlive.com
|
||||
developer.test.xboxlive.com
|
||||
developer.xboxlive.com
|
||||
device.auth.xboxlive.com
|
||||
df.gfx.ms
|
||||
digicert.com
|
||||
dlassets-ssl.xboxlive.com
|
||||
esearch.nonprod.xboxlive.com
|
||||
forum.xboxlive.com
|
||||
forums4.xboxlive.com
|
||||
forumsuat.xboxlive.com
|
||||
gamepass.com
|
||||
gssv-nodepool-wus2-test.xboxlive.com
|
||||
images-eds-ssl.xboxlive.com
|
||||
lesthealthfetch.xboxlive.com
|
||||
liveconnect2.int2.xboxlive.com
|
||||
login.live.com
|
||||
ms.nonprod.xboxlive.com
|
||||
msn.com
|
||||
o.gfx.ms
|
||||
packages.xboxlive.com
|
||||
pmservices.cp.microsoft.com
|
||||
portalservices.xboxlive.com
|
||||
rdgw2.test.xboxlive.com
|
||||
redirect.int2.xboxlive.com
|
||||
reportingservices.test.xboxlive.com
|
||||
rms.nonprod.xboxlive.com
|
||||
rta.xboxlive.com
|
||||
search.xboxlive.com
|
||||
sftp.xboxlive.com
|
||||
silver.xboxservices.com
|
||||
statswrite-eap1.dnet.xboxlive.com
|
||||
tgs.prod.xboxlive.com
|
||||
title.auth.xboxlive.com
|
||||
titlestorage.xboxlive.com
|
||||
tools.test.xboxlive.com
|
||||
user.auth.xboxlive.com
|
||||
xap.xboxlive.com
|
||||
xbl-smooth.xboxlive.com
|
||||
xblsigman.qy.xboxlive.com
|
||||
xbox.com
|
||||
xbox.nccp.eu-west-1.prodaa.netflix.com
|
||||
xbox.nccp.latency.prodaa.netflix.com
|
||||
xbox.nccp.us-east-1-sa.prodaa.netflix.com
|
||||
xbox.nccp.us-east-1.prodaa.netflix.com
|
||||
xbox.nccp.us-west-2.prodaa.netflix.com
|
||||
xboxlive.com
|
||||
xemacs.beta.cert.xboxlive.com
|
||||
xlptools.xboxlive.com
|
||||
xsts.auth.xboxlive.com
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,4 +2,6 @@ configparser~=7.0.1
|
||||
ipaddress~=1.0.23
|
||||
dnspython~=2.6.1
|
||||
httpx~=0.27.0
|
||||
colorama~=0.4.6
|
||||
colorama~=0.4.6
|
||||
requests~=2.31.0
|
||||
beautifulsoup4~=4.12.3
|
||||
@@ -1,6 +1,8 @@
|
||||
# Вспомогательные утилиты:
|
||||
- [subdomain - поиск субдоменов](#subdomain)
|
||||
- [verified - проверка активности доменов](#verified)
|
||||
- [convert - конвертер маршрутов](#convert)
|
||||
- [split - разбить список на файлы по 1000 строк](#split)
|
||||
|
||||
## subdomain
|
||||
|
||||
@@ -9,12 +11,13 @@
|
||||
|
||||
### Функции
|
||||
|
||||
- Загружает страницу по указанному URL и извлекает домены из таблиц, где тип записи равен "A". Пытается повторить запрос до 5 раз в случае ошибки или отсутствия данных.
|
||||
- Отправляет запросы к страницам, начиная с первой, и обрабатывает до трех страниц одновременно. Останавливается, если данные на последних трех страницах одинаковы или если три страницы подряд пустые.
|
||||
- Загружает страницу по указанному URL и извлекает субдомены из таблиц, где тип записи равен "A".
|
||||
- Пытается повторить запрос до 3х раз в случае ошибки или отсутствия данных.
|
||||
- Останавливается, если данные на последних трех страницах одинаковы или если три страницы подряд пустые.
|
||||
|
||||
### Использование
|
||||
|
||||
1. Установите зависимости:
|
||||
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
@@ -41,12 +44,12 @@
|
||||
### Функции
|
||||
|
||||
- Проверяет домены используя DNS-серверы: Google Public DNS, Cloudflare DNS и Yandex. Пул потоков ограничен 40 рабочими потоками.
|
||||
- Возвращает статус домена (делегирован, припаркован/неактивен) или ошибку.
|
||||
- Возвращает статус домена: делегирован, припаркован/неактивен или ошибку.
|
||||
- Если статус домена не был подтвержден как делегированный проводит его контрольную проверку.
|
||||
|
||||
### Использование
|
||||
|
||||
1. Установите зависимости:
|
||||
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
@@ -61,3 +64,75 @@
|
||||
```
|
||||
|
||||
4. Скрипт проверит домены и сохранит результат в файл `verified_domains.txt`.
|
||||
|
||||
## convert
|
||||
|
||||
Скрипт для обработки IP-адресов, их агрегации в подсети и форматирования маршрутов для различных типов сетевых устройств.
|
||||
|
||||
### Функции
|
||||
|
||||
- Загрузка списка IP-адресов из файла.
|
||||
- Агрегация IP-адресов в подсети с масками `/16`, `/24`, или объединение нескольких подсетей.
|
||||
- Исключение IP-адресов Cloudflare из итогового списка (при необходимости).
|
||||
- Поддержка различных форматов маршрутизации:
|
||||
- Windows (`route add`)
|
||||
- Unix (`ip route`)
|
||||
- Keenetic (`ip route` с интерфейсом)
|
||||
- Mikrotik (`/ip firewall`)
|
||||
- WireGuard
|
||||
- OpenVPN
|
||||
- CIDR (с указанием маски)
|
||||
|
||||
### Использование
|
||||
|
||||
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
2. Поместите файл c IP-адресами `ip.txt` в корневую директорию проекта. Файл может содержать любой текст и IP-адреса в любом виде - лишнее будет убрано автоматически.
|
||||
|
||||
3. Запустите скрипт:
|
||||
|
||||
```bash
|
||||
python convert.py
|
||||
```
|
||||
|
||||
4. Следуйте подсказкам на экране.
|
||||
|
||||
|
||||
## split
|
||||
|
||||
Утилита для разбиения текстового файла на части фиксированного размера.
|
||||
|
||||
### Функции
|
||||
|
||||
В исходном файле остаются только первые 1000 строк (значение по умолчанию).
|
||||
Остальные строки сохраняются в новые файлы:
|
||||
- domain-ip-resolve2.txt
|
||||
- domain-ip-resolve3.txt
|
||||
- и т.д., по 1000 строк в каждом.
|
||||
|
||||
Если строк меньше или равно 1000 — разбиение не выполняется.
|
||||
|
||||
### Использование
|
||||
|
||||
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
2. Поместите файл c IP-адресами `domain-ip-resolve.txt` в корневую директорию проекта.
|
||||
|
||||
3. Запустите скрипт:
|
||||
|
||||
```bash
|
||||
python split.py
|
||||
```
|
||||
### Можно указать свой файл и размер блока строк:
|
||||
|
||||
```bash
|
||||
split_file_exact("mydata.txt", max_lines=500)
|
||||
```
|
||||
|
||||
299
utilities/convert.py
Normal file
299
utilities/convert.py
Normal file
@@ -0,0 +1,299 @@
|
||||
import asyncio
|
||||
import ipaddress
|
||||
import re
|
||||
|
||||
import httpx
|
||||
from colorama import Fore, Style, init
|
||||
|
||||
# Цвета
|
||||
init(autoreset=True)
|
||||
|
||||
|
||||
def yellow(text):
|
||||
return f"{Fore.YELLOW}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def green(text):
|
||||
return f"{Fore.GREEN}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def cyan(text):
|
||||
return f"{Fore.CYAN}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def red(text):
|
||||
return f"{Fore.RED}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def magneta(text):
|
||||
return f"{Fore.MAGENTA}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
def blue(text):
|
||||
return f"{Fore.BLUE}{text}{Style.RESET_ALL}"
|
||||
|
||||
|
||||
# IP шлюза для win и unix
|
||||
def gateway_input(gateway):
|
||||
if not gateway:
|
||||
input_gateway = input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')}: ")
|
||||
return input_gateway.strip() if input_gateway else None
|
||||
else:
|
||||
return gateway
|
||||
|
||||
|
||||
# IP шлюза и имя интерфейса для keenetic
|
||||
def ken_gateway_input(ken_gateway):
|
||||
if not ken_gateway:
|
||||
input_ken_gateway = input(
|
||||
f"Укажите {green('IP шлюза')} или {green('имя интерфейса')} или {green('IP шлюза')} и через пробел {green('имя интерфейса')}: ")
|
||||
return input_ken_gateway.strip() if input_ken_gateway else None
|
||||
else:
|
||||
return ken_gateway
|
||||
|
||||
|
||||
# Загрузка IP-адресов cloudflare
|
||||
async def get_cloudflare_ips():
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get("https://www.cloudflare.com/ips-v4/")
|
||||
response.raise_for_status()
|
||||
text = response.text
|
||||
cloudflare_ips = set()
|
||||
for line in text.splitlines():
|
||||
line = line.strip()
|
||||
if '/' in line:
|
||||
try:
|
||||
ip_network = ipaddress.ip_network(line)
|
||||
for ip in ip_network:
|
||||
cloudflare_ips.add(str(ip))
|
||||
except ValueError:
|
||||
continue
|
||||
return cloudflare_ips
|
||||
except Exception as e:
|
||||
print("Ошибка при получении IP адресов Cloudflare:", e)
|
||||
return set()
|
||||
|
||||
|
||||
# Промт cloudflare фильтр
|
||||
def check_include_cloudflare(cloudflare):
|
||||
if cloudflare in ['yes', 'y', 'no', 'n']:
|
||||
return cloudflare in ['yes', 'y']
|
||||
return input(f"\n{yellow('Исключить IP адреса Cloudflare из итогового списка?')}"
|
||||
f"\n{green('yes')} - исключить"
|
||||
f"\n{green('Enter')} - оставить: ").strip().lower() in ['yes', 'y']
|
||||
|
||||
|
||||
# комментарий для microtik firewall
|
||||
def mk_list_name_input(mk_list_name):
|
||||
if not mk_list_name:
|
||||
input_mk_list_name = input(f"Введите {green('LIST_NAME')} для Mikrotik firewall: ")
|
||||
return input_mk_list_name.strip() if input_mk_list_name else None
|
||||
else:
|
||||
return mk_list_name
|
||||
|
||||
|
||||
# Уплотняем имена сервисов
|
||||
def comment(selected_service):
|
||||
return ",".join(["".join(word.title() for word in s.split()) for s in selected_service])
|
||||
|
||||
|
||||
# Промт на объединение IP в подсети
|
||||
def subnet_input(subnet):
|
||||
if not subnet:
|
||||
subnet = input(
|
||||
f"\n{yellow('Объединить IP-адреса в подсети?')} "
|
||||
f"\n{green('16')} - сократить до /16 (255.255.0.0)"
|
||||
f"\n{green('24')} - сократить до /24 (255.255.255.0)"
|
||||
f"\n{green('mix')} - сократить до /24 (255.255.255.0) и /32 (255.255.255.255)"
|
||||
f"\n{green('Enter')} - пропустить: "
|
||||
).strip().lower()
|
||||
|
||||
return subnet if subnet in {'16', '24', 'mix'} else '32'
|
||||
|
||||
|
||||
# Агрегация маршрутов
|
||||
def group_ips_in_subnets(filename, subnet):
|
||||
try:
|
||||
with open(filename, 'r', encoding='utf-8') as file:
|
||||
ips = {line.strip() for line in file if line.strip()} # Собираем уникальные IP адреса
|
||||
|
||||
subnets = set()
|
||||
|
||||
def process_ips(subnet):
|
||||
for ip in ips:
|
||||
try:
|
||||
if subnet == "16":
|
||||
# Преобразуем в /16 (два последних октета заменяются на 0.0)
|
||||
network = ipaddress.IPv4Network(f"{ip}/16", strict=False)
|
||||
subnets.add(f"{network.network_address}")
|
||||
elif subnet == "24":
|
||||
# Преобразуем в /24 (последний октет заменяется на 0)
|
||||
network = ipaddress.IPv4Network(f"{ip}/24", strict=False)
|
||||
subnets.add(f"{network.network_address}")
|
||||
except ValueError as e:
|
||||
print(f"Ошибка в IP адресе: {ip} - {e}")
|
||||
|
||||
if subnet in ["24", "16"]:
|
||||
process_ips(subnet)
|
||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до /{subnet} подсети{Style.RESET_ALL}")
|
||||
|
||||
elif subnet == "mix":
|
||||
octet_groups = {}
|
||||
for ip in ips:
|
||||
key = '.'.join(ip.split('.')[:3]) # Группировка по первым трем октетам
|
||||
if key not in octet_groups:
|
||||
octet_groups[key] = []
|
||||
octet_groups[key].append(ip)
|
||||
|
||||
# IP-адреса с совпадающими первыми тремя октетами
|
||||
network_24 = {key + '.0' for key, group in octet_groups.items() if
|
||||
len(group) > 1} # Базовый IP для /24 подсетей
|
||||
# Удаляем IP с совпадающими первыми тремя октетами из множества
|
||||
ips -= {ip for group in octet_groups.values() if len(group) > 1 for ip in group}
|
||||
# Оставляем только IP без указания маски для /24 и одиночных IP
|
||||
subnets.update(ips) # IP без маски для одиночных IP
|
||||
subnets.update(network_24) # Базовые IP для /24 подсетей
|
||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до масок /24 и /32{Style.RESET_ALL}")
|
||||
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
for subnet in sorted(subnets):
|
||||
file.write(subnet + '\n')
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка при обработке файла: {e}")
|
||||
|
||||
|
||||
# Выбор формата сохранения результатов
|
||||
def process_file_format(filename, filetype, gateway, selected_service, mk_list_name, subnet, ken_gateway):
|
||||
def read_file(filename):
|
||||
try:
|
||||
with open(filename, 'r', encoding='utf-8') as file:
|
||||
return file.readlines()
|
||||
except Exception as e:
|
||||
print(f"Ошибка чтения файла: {e}")
|
||||
return None
|
||||
|
||||
def write_file(filename, ips, formatter):
|
||||
formatted_ips = [formatter(ip.strip()) for ip in ips]
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
if filetype.lower() == 'wireguard':
|
||||
file.write(', '.join(formatted_ips))
|
||||
else:
|
||||
file.write('\n'.join(formatted_ips))
|
||||
|
||||
# Определение маски подсети
|
||||
net_mask = subnet if subnet == "mix" else "255.255.0.0" if subnet == "16" else "255.255.255.0" if subnet == "24" else "255.255.255.255"
|
||||
|
||||
if not filetype:
|
||||
filetype = input(f"""
|
||||
{yellow('В каком формате сохранить файл?')}
|
||||
{green('win')} - route add {cyan('IP')} mask {net_mask} {cyan('GATEWAY')}
|
||||
{green('unix')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY')}
|
||||
{green('keenetic')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY GATEWAY_NAME')} auto !{comment(selected_service)}
|
||||
{green('cidr')} - {cyan('IP')}/{subnet}
|
||||
{green('mikrotik')} - /ip/firewall/address-list add list={cyan("LIST_NAME")} comment="{comment(selected_service)}" address={cyan("IP")}/{subnet}
|
||||
{green('ovpn')} - push "route {cyan('IP')} {net_mask}"
|
||||
{green('wireguard')} - {cyan('IP')}/{subnet}, {cyan('IP')}/{subnet}, и т.д...
|
||||
{green('Enter')} - {cyan('IP')}
|
||||
Ваш выбор: """)
|
||||
|
||||
ips = read_file(filename)
|
||||
if not ips:
|
||||
return
|
||||
|
||||
# Дополнительные запросы в зависимости от формата файла
|
||||
if filetype in ['win', 'unix']: # Запрашиваем IP шлюза для win и unix
|
||||
gateway = gateway_input(gateway)
|
||||
elif filetype == 'keenetic': # Запрашиваем IP шлюза и имя интерфейса для keenetic
|
||||
ken_gateway = ken_gateway_input(ken_gateway)
|
||||
elif filetype == 'mikrotik': # Запрашиваем ввод комментария для microtik firewall
|
||||
mk_list_name = mk_list_name_input(mk_list_name)
|
||||
|
||||
# обычный формат
|
||||
formatters = {
|
||||
'win': lambda ip: f"route add {ip} mask {net_mask} {gateway}",
|
||||
'unix': lambda ip: f"ip route {ip}/{subnet} {gateway}",
|
||||
'keenetic': lambda ip: f"ip route {ip}/{subnet} {ken_gateway} auto !{comment(selected_service)}",
|
||||
'cidr': lambda ip: f"{ip}/{subnet}",
|
||||
'ovpn': lambda ip: f'push "route {ip} {net_mask}"',
|
||||
'mikrotik': lambda
|
||||
ip: f'/ip/firewall/address-list add list={mk_list_name} comment="{comment(selected_service)}" address={ip}/{subnet}',
|
||||
'wireguard': lambda ip: f"{ip}/{subnet}"
|
||||
}
|
||||
|
||||
# mix формат
|
||||
if subnet == "mix":
|
||||
if filetype.lower() == 'win': # Обработка для win
|
||||
mix_formatter = lambda ip: f"{ip.strip()} mask 255.255.255.0" if ip.endswith(
|
||||
'.0') else f"{ip.strip()} mask 255.255.255.255"
|
||||
elif filetype.lower() == 'ovpn': # Обработка для ovpn
|
||||
mix_formatter = lambda ip: f"{ip.strip()} 255.255.255.0" if ip.endswith(
|
||||
'.0') else f"{ip.strip()} 255.255.255.255"
|
||||
else: # Обработка для остальных форматов
|
||||
mix_formatter = lambda ip: f"{ip.strip()}/24" if ip.endswith('.0') else f"{ip.strip()}/32"
|
||||
|
||||
formatters.update({
|
||||
'win': lambda ip: f"route add {mix_formatter(ip)} {gateway}",
|
||||
'unix': lambda ip: f"ip route {mix_formatter(ip)} {gateway}",
|
||||
'keenetic': lambda ip: f"ip route {mix_formatter(ip)} {ken_gateway} auto !{comment(selected_service)}",
|
||||
'cidr': lambda ip: f"{mix_formatter(ip)}",
|
||||
'ovpn': lambda ip: f'push "route {mix_formatter(ip)}"',
|
||||
'mikrotik': lambda ip: f'/ip/firewall/address-list add list={mk_list_name} comment="{comment(selected_service)}" address={mix_formatter(ip)}',
|
||||
'wireguard': lambda ip: f"{mix_formatter(ip)}"
|
||||
})
|
||||
|
||||
# Запись в файл
|
||||
if filetype.lower() in formatters:
|
||||
write_file(filename, ips, formatters[filetype.lower()])
|
||||
|
||||
|
||||
# Стартуем
|
||||
async def main():
|
||||
filename = "ip.txt"
|
||||
cloudflare = None
|
||||
subnet = None
|
||||
filetype = None
|
||||
gateway = None
|
||||
selected_services = ["Service"]
|
||||
mk_list_name = None
|
||||
ken_gateway = None
|
||||
|
||||
ip_pattern = re.compile(r'\b(?:\d{1,3}\.){3}\d{1,3}\b')
|
||||
|
||||
# Открываем файл и читаем строки
|
||||
with open(filename, 'r') as file:
|
||||
# Создаем множество для хранения уникальных IP-адресов
|
||||
ips = set()
|
||||
|
||||
# Проходим по каждой строке файла
|
||||
for line in file:
|
||||
# Ищем все IP-адреса в строке
|
||||
found_ips = ip_pattern.findall(line)
|
||||
# Добавляем найденные IP-адреса в множество
|
||||
ips.update(found_ips)
|
||||
|
||||
# Фильтр Cloudflare
|
||||
include_cloudflare = check_include_cloudflare(cloudflare)
|
||||
if include_cloudflare: # Загрузка IP-адресов Cloudflare
|
||||
cloudflare_ips = await get_cloudflare_ips()
|
||||
else:
|
||||
cloudflare_ips = set()
|
||||
|
||||
# Удаляем IP-адреса Cloudflare
|
||||
ips -= cloudflare_ips
|
||||
|
||||
with open(filename, 'w', encoding='utf-8') as file:
|
||||
for ip in sorted(ips):
|
||||
file.write(ip + '\n')
|
||||
|
||||
# Группировка IP-адресов в подсети
|
||||
subnet = subnet_input(subnet)
|
||||
if subnet != '32': # Если не '32', вызываем функцию для агрегации
|
||||
group_ips_in_subnets(filename, subnet)
|
||||
|
||||
process_file_format(filename, filetype, gateway, selected_services, mk_list_name, subnet, ken_gateway)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
@@ -1,3 +0,0 @@
|
||||
dnspython~=2.6.1
|
||||
requests~=2.31.0
|
||||
beautifulsoup4~=4.12.3
|
||||
48
utilities/split.py
Normal file
48
utilities/split.py
Normal file
@@ -0,0 +1,48 @@
|
||||
def split_file_exact(input_file, max_lines=1000):
|
||||
"""
|
||||
Разбивает файл согласно точному описанию:
|
||||
- В исходном файле оставляет первые 1000 строк
|
||||
- Остальные строки переносит в domain-ip-resolve2.txt, domain-ip-resolve3.txt и т.д.
|
||||
"""
|
||||
|
||||
try:
|
||||
# Читаем все строки из исходного файла
|
||||
with open(input_file, 'r', encoding='utf-8') as f:
|
||||
lines = f.readlines()
|
||||
|
||||
total_lines = len(lines)
|
||||
|
||||
if total_lines <= max_lines:
|
||||
print(f"Файл содержит {total_lines} строк, разбиение не требуется.")
|
||||
return
|
||||
|
||||
# Оставляем первые 1000 строк в исходном файле
|
||||
with open(input_file, 'w', encoding='utf-8') as f:
|
||||
f.writelines(lines[:max_lines])
|
||||
|
||||
# Остальные строки распределяем по новым файлам
|
||||
remaining_lines = lines[max_lines:]
|
||||
num_additional_files = (len(remaining_lines) + max_lines - 1) // max_lines
|
||||
|
||||
for i in range(num_additional_files):
|
||||
start_index = i * max_lines
|
||||
end_index = min((i + 1) * max_lines, len(remaining_lines))
|
||||
|
||||
output_file = f"domain-ip-resolve{i+2}.txt"
|
||||
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.writelines(remaining_lines[start_index:end_index])
|
||||
|
||||
print(f"Создан файл {output_file} со строками {max_lines + start_index + 1}-{max_lines + end_index}")
|
||||
|
||||
print(f"Разбиение завершено. Создано {num_additional_files} дополнительных файлов.")
|
||||
|
||||
except FileNotFoundError:
|
||||
print(f"Ошибка: Файл {input_file} не найден.")
|
||||
except Exception as e:
|
||||
print(f"Произошла ошибка: {e}")
|
||||
|
||||
# Использование
|
||||
if __name__ == "__main__":
|
||||
input_filename = "domain-ip-resolve.txt"
|
||||
split_file_exact(input_filename)
|
||||
@@ -27,13 +27,16 @@ def parse_page(url):
|
||||
domain = columns[0].text.strip() # Извлечение столбца 'Domain'
|
||||
data.add(domain) # Добавляем в множество
|
||||
|
||||
time.sleep(random.uniform(1, 3)) # Задержка между запросами
|
||||
time.sleep(random.choice([2, 3, 4, 5])) # Случайная задержка между запросами
|
||||
|
||||
if attempt > 0:
|
||||
print(f"Успешная загрузка {url} после {attempt}-й попытки.")
|
||||
return data
|
||||
|
||||
except requests.exceptions.HTTPError as e:
|
||||
if response.status_code == 429:
|
||||
print(f"Ошибка загрузки {url}. Пробуем еще раз...")
|
||||
time.sleep(3) # Фиксированная задержка перед повторной попыткой
|
||||
print(f"Ошибка загрузки {url}. Пробуем еще раз... (Попытка {attempt + 1})")
|
||||
time.sleep(5) # Фиксированная задержка перед повторной попыткой
|
||||
else:
|
||||
raise e
|
||||
|
||||
@@ -47,52 +50,42 @@ def parse_all_pages(base_url):
|
||||
recent_pages_data = [] # Список для хранения данных последних страниц
|
||||
|
||||
while keep_parsing:
|
||||
print(f"Парсим страницы с {page} по {page + 2}")
|
||||
pages = [f"{base_url}?page={p}" for p in range(page, page + 3)]
|
||||
print(f"Парсим страницу {page}")
|
||||
url = f"{base_url}?page={page}"
|
||||
|
||||
try:
|
||||
with ThreadPoolExecutor(max_workers=3) as executor:
|
||||
future_to_url = {executor.submit(parse_page, url): url for url in pages}
|
||||
for future in as_completed(future_to_url):
|
||||
url = future_to_url[future]
|
||||
try:
|
||||
result = future.result()
|
||||
if result is None: # Если страница пуста или не существует
|
||||
print(f"Страница {url.split('=')[-1]} не существует или пуста. Проверяем еще раз...")
|
||||
empty_page_attempts += 1
|
||||
time.sleep(3) # Ожидание перед повторной проверкой
|
||||
if empty_page_attempts >= 3:
|
||||
print(f"Страница {url.split('=')[-1]} пуста после 3 попыток. Остановка.")
|
||||
keep_parsing = False
|
||||
break
|
||||
else:
|
||||
continue # Переходим к следующей попытке
|
||||
else:
|
||||
empty_page_attempts = 0 # Обнуляем счётчик, если нашли данные
|
||||
all_domains.update(result) # Добавляем новые домены в множество
|
||||
print(f"Разбор {url} завершен.")
|
||||
|
||||
# Добавляем данные страницы в список для сравнения
|
||||
recent_pages_data.append(result)
|
||||
if len(recent_pages_data) > 3: # Храним данные только последних 3 страниц
|
||||
recent_pages_data.pop(0)
|
||||
|
||||
# Проверяем, повторяются ли данные на последних трёх страницах
|
||||
if len(recent_pages_data) == 3 and recent_pages_data[0] == recent_pages_data[1] == recent_pages_data[2]:
|
||||
print(f"Данные на последних трёх страницах одинаковы. Остановка парсинга.")
|
||||
keep_parsing = False
|
||||
break
|
||||
except Exception as e:
|
||||
print(f"Ошибка парсинга {url}: {e}")
|
||||
raise e
|
||||
except requests.exceptions.HTTPError as e:
|
||||
if '429' in str(e):
|
||||
print("Ошибка 429. Пауза 4 секунды.")
|
||||
time.sleep(3) # Пауза 3 секунды при ошибке 429
|
||||
result = parse_page(url)
|
||||
if result is None: # Если страница пуста или не существует
|
||||
print(f"Страница {page} не существует или пуста. Проверяем еще раз...")
|
||||
empty_page_attempts += 1
|
||||
time.sleep(5) # Ожидание перед повторной проверкой
|
||||
if empty_page_attempts >= 3:
|
||||
print(f"Страница {page} пуста после 3 попыток. Остановка.")
|
||||
keep_parsing = False
|
||||
break
|
||||
else:
|
||||
continue # Переходим к следующей попытке
|
||||
else:
|
||||
raise e # Пробрасываем другие ошибки, если они не 429
|
||||
empty_page_attempts = 0 # Обнуляем счётчик, если нашли данные
|
||||
all_domains.update(result) # Добавляем новые домены в множество
|
||||
print(f"Разбор страницы {page} завершен.")
|
||||
|
||||
page += 3 # Переход к следующему набору страниц
|
||||
# Добавляем данные страницы в список для сравнения
|
||||
recent_pages_data.append(result)
|
||||
if len(recent_pages_data) > 3: # Храним данные только последних 3 страниц
|
||||
recent_pages_data.pop(0)
|
||||
|
||||
# Проверяем, повторяются ли данные на последних трёх страницах
|
||||
if len(recent_pages_data) == 3 and recent_pages_data[0] == recent_pages_data[1] == recent_pages_data[2]:
|
||||
print(f"Данные на последних трёх страницах одинаковы. Остановка парсинга.")
|
||||
keep_parsing = False
|
||||
break
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка парсинга страницы {page}: {e}")
|
||||
raise e
|
||||
|
||||
page += 1 # Переход к следующей странице
|
||||
|
||||
return all_domains
|
||||
|
||||
|
||||
20
utilities/win/README.md
Normal file
20
utilities/win/README.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# Запуск вспомогательных утилит под Win:
|
||||
- [convert - конвертер маршрутов](#convert)
|
||||
|
||||
**Описание:** Поставит Python и зависимости, запустит выбранную утилиту.
|
||||
|
||||
## convert
|
||||
|
||||
**Использование:**
|
||||
- Открыть командную строку Windows и выполнить команду:
|
||||
```
|
||||
powershell -Command "irm https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/utilities/win/convert.bat -OutFile $env:TEMP\convert.bat" && cmd /c "%TEMP%\convert.bat"
|
||||
```
|
||||
или
|
||||
- Запустить PowerShell и выполнить команду:
|
||||
```
|
||||
irm https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/utilities/win/convert.bat -OutFile "$env:TEMP\convert.bat"; cmd /c "$env:TEMP\convert.bat"
|
||||
```
|
||||
|
||||
**Можете:**
|
||||
- Скачать convert.bat и запустить его.
|
||||
99
utilities/win/convert.bat
Normal file
99
utilities/win/convert.bat
Normal file
@@ -0,0 +1,99 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
chcp 65001 > NUL
|
||||
|
||||
REM Проверка Python 3
|
||||
:CheckPython
|
||||
python --version 2>NUL | findstr /I "Python 3" >NUL
|
||||
if ERRORLEVEL 1 (
|
||||
echo Python 3 не установлен.
|
||||
choice /C YN /M "Установить?"
|
||||
if ERRORLEVEL 2 (
|
||||
echo Без Python 3 ничего не получится...
|
||||
pause
|
||||
exit /b 1
|
||||
) else (
|
||||
call :InstallPython
|
||||
)
|
||||
) else (
|
||||
echo Python 3 установлен.
|
||||
)
|
||||
goto :CheckModules
|
||||
|
||||
REM Инсталляция Python 3
|
||||
:InstallPython
|
||||
echo Загрузка дистрибутива...
|
||||
powershell -Command "if ($PSVersionTable.PSVersion.Major -ge 3) {Invoke-WebRequest -Uri 'https://www.python.org/ftp/python/3.12.5/python-3.12.5-amd64.exe' -OutFile 'python_installer.exe'} else {Start-BitsTransfer -Source 'https://www.python.org/ftp/python/3.12.5/python-3.12.5-amd64.exe' -Destination 'python_installer.exe'}"
|
||||
|
||||
REM Проверяем успешность загрузки
|
||||
if not exist "python_installer.exe" (
|
||||
echo Ошибка загрузки установщика Python 3.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM Установка Python 3
|
||||
echo Установка...
|
||||
echo PS - не забудьте ее разрешить в соседнем окне
|
||||
python_installer.exe /quiet InstallAllUsers=1 PrependPath=1
|
||||
del /q /f python_installer.exe
|
||||
|
||||
REM Оповещение о перезапуске
|
||||
echo.
|
||||
echo Установка завершена, но требуется обновить окружение.
|
||||
echo - закройте это окно и запустите скрипт снова.
|
||||
pause
|
||||
exit /b 0
|
||||
|
||||
REM Проверка и установка необходимых модулей Python
|
||||
:CheckModules
|
||||
set "modules=requests dnspython ipaddress configparser httpx colorama"
|
||||
echo.
|
||||
echo Проверка необходимых библиотек...
|
||||
|
||||
for %%m in (%modules%) do (
|
||||
pip show %%m >NUL 2>&1
|
||||
if ERRORLEVEL 1 (
|
||||
echo Установка библиотеки %%m...
|
||||
pip install %%m
|
||||
if ERRORLEVEL 1 (
|
||||
echo Не удалось установить библиотеку %%m. Проверьте pip.
|
||||
exit /b 1
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
goto :DownloadMain
|
||||
|
||||
REM Загрузка и запуск main.py
|
||||
:DownloadMain
|
||||
echo Загрузка Domain Mapper Converter...
|
||||
powershell -Command "if ($PSVersionTable.PSVersion.Major -ge 3) {Invoke-WebRequest -Uri 'https://github.com/Ground-Zerro/DomainMapper/raw/refs/heads/main/utilities/convert.py' -OutFile 'main.py'} else {Start-BitsTransfer -Source 'https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/main.py' -Destination 'main.py'}"
|
||||
|
||||
if not exist "main.py" (
|
||||
echo Ошибка загрузки Domain Mapper Converter.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
@echo. >> ip.txt
|
||||
|
||||
cls
|
||||
REM Запуск main.py
|
||||
echo Запускаем...
|
||||
python main.py
|
||||
if ERRORLEVEL 1 (
|
||||
echo Ошибка выполнения main.py.
|
||||
pause
|
||||
del /q /f main.py
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
move /y ip.txt %UserProfile%\Desktop\ip.txt
|
||||
echo Программа завершена.
|
||||
del /q /f main.py
|
||||
endlocal
|
||||
echo файл скопирован в %UserProfile%\Desktop\ip.txt
|
||||
pause
|
||||
exit /b 0
|
||||
|
||||
11
web/README.md
Normal file
11
web/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Попытка перенести DomainMapper на WEB платформу для размещения желающими на собсвтенном хостинге.
|
||||
|
||||
Не уверен, что закончу начатое.
|
||||
|
||||
Предложения в виде **pull requests** приветствуются.
|
||||
|
||||
|
||||
```
|
||||
bash <(curl -s https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/web/web_install.sh)
|
||||
|
||||
```
|
||||
44
web/app.py
Normal file
44
web/app.py
Normal file
@@ -0,0 +1,44 @@
|
||||
import os
|
||||
import subprocess
|
||||
from fastapi import FastAPI, HTTPException
|
||||
from pydantic import BaseModel
|
||||
import uvicorn
|
||||
|
||||
# Определение модели для данных запроса
|
||||
class RunScriptRequest(BaseModel):
|
||||
config: str
|
||||
userId: str
|
||||
|
||||
# Инициализация FastAPI приложения
|
||||
app = FastAPI()
|
||||
|
||||
@app.post("/run")
|
||||
async def run_script(request: RunScriptRequest):
|
||||
config_content = request.config
|
||||
user_id = request.userId
|
||||
|
||||
# Создание имени файла конфигурации
|
||||
config_filename = f"config-id_{user_id}.ini"
|
||||
try:
|
||||
# Запись конфигурации в файл
|
||||
with open(config_filename, 'w') as f:
|
||||
f.write(config_content)
|
||||
|
||||
# Выполнение команды через subprocess
|
||||
result = subprocess.run(
|
||||
['python3', 'main.py', '-c', config_filename],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
text=True
|
||||
)
|
||||
|
||||
# Возвращение результатов выполнения скрипта
|
||||
return {"stdout": result.stdout, "stderr": result.stderr}
|
||||
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Ошибка: {str(e)}")
|
||||
|
||||
# Запуск приложения (для использования с Uvicorn)
|
||||
if __name__ == "__main__":
|
||||
# Запуск FastAPI с использованием Uvicorn
|
||||
uvicorn.run(app, host="0.0.0.0", port=5000)
|
||||
233
web/index.html
Normal file
233
web/index.html
Normal file
@@ -0,0 +1,233 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>DNS Resolver Settings</title>
|
||||
<script>
|
||||
function validateForm(event) {
|
||||
const services = document.querySelectorAll('input[name="services"]:checked');
|
||||
const dnsServers = document.querySelectorAll('input[name="dns_servers"]:checked');
|
||||
const format = document.querySelector('input[name="format"]:checked');
|
||||
|
||||
if (services.length === 0) {
|
||||
alert("Выберите хотя бы один сервис.");
|
||||
event.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dnsServers.length === 0) {
|
||||
alert("Выберите хотя бы один DNS сервер.");
|
||||
event.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!format) {
|
||||
alert("Выберите формат сохранения.");
|
||||
event.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((format.value === 'unix' || format.value === 'win' || format.value === 'keenetic') &&
|
||||
!document.getElementById('gateway').value) {
|
||||
alert("Укажите IP шлюза.");
|
||||
event.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function generateConfig(event) {
|
||||
event.preventDefault();
|
||||
|
||||
if (!validateForm(event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(el => el.value).join(',');
|
||||
const dnsServers = Array.from(document.querySelectorAll('input[name="dns_servers"]:checked')).map(el => el.value).join(' ');
|
||||
const format = document.querySelector('input[name="format"]:checked').value;
|
||||
const gateway = document.getElementById('gateway')?.value || '';
|
||||
const commentary = document.getElementById('commentary')?.value || '';
|
||||
const cloudflare = document.querySelector('input[name="cloudflare"]:checked') ? 'yes' : 'no';
|
||||
const aggregation = document.querySelector('input[name="aggregation"]:checked').value;
|
||||
|
||||
const userId = Math.floor(Math.random() * 100000); // Случайный ID пользователя
|
||||
const filename = `out-id_${userId}.txt`;
|
||||
|
||||
const config = `
|
||||
[DomainMapper]
|
||||
localplatform = no
|
||||
localdns = no
|
||||
service = ${services}
|
||||
dnsserver = ${dnsServers}
|
||||
cloudflare = ${cloudflare}
|
||||
subnet = ${aggregation}
|
||||
filename = ${filename}
|
||||
filetype = ${format}
|
||||
gateway = ${gateway}
|
||||
keenetic = ${gateway}
|
||||
listname = ${commentary}
|
||||
mk_comment = off
|
||||
cfginfo = no
|
||||
run =
|
||||
`;
|
||||
|
||||
sendConfigToServer(config, userId);
|
||||
}
|
||||
|
||||
function sendConfigToServer(config, userId) {
|
||||
fetch('/run', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ config: config, userId: userId })
|
||||
})
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
document.getElementById('progress').innerText = `Конфигурация создана и скрипт запущен. Результат: ${data}`;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Ошибка при отправке конфигурации:', error);
|
||||
document.getElementById('progress').innerText = 'Ошибка при выполнении.';
|
||||
});
|
||||
}
|
||||
|
||||
function loadServices() {
|
||||
const serviceUrl = 'https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platformdb';
|
||||
|
||||
fetch(serviceUrl)
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
const lines = data.split('\n');
|
||||
const servicesContainer = document.getElementById('servicesContainer');
|
||||
|
||||
lines.forEach(line => {
|
||||
const parts = line.split(':');
|
||||
if (parts.length > 1) {
|
||||
const serviceName = parts[0].trim();
|
||||
const label = document.createElement('label');
|
||||
const input = document.createElement('input');
|
||||
input.type = 'checkbox';
|
||||
input.name = 'services';
|
||||
input.value = serviceName;
|
||||
label.appendChild(input);
|
||||
label.appendChild(document.createTextNode(` ${serviceName}`));
|
||||
servicesContainer.appendChild(label);
|
||||
servicesContainer.appendChild(document.createElement('br'));
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch(error => console.error('Error loading services:', error));
|
||||
}
|
||||
|
||||
function loadDNSServers() {
|
||||
const dnsUrl = 'https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/dnsdb';
|
||||
|
||||
fetch(dnsUrl)
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
const lines = data.split('\n');
|
||||
const dnsServersContainer = document.getElementById('dnsServersContainer');
|
||||
|
||||
lines.forEach(line => {
|
||||
const parts = line.split(':');
|
||||
if (parts.length > 1) {
|
||||
const dnsServerName = parts[0].trim();
|
||||
const label = document.createElement('label');
|
||||
const input = document.createElement('input');
|
||||
input.type = 'checkbox';
|
||||
input.name = 'dns_servers';
|
||||
input.value = dnsServerName;
|
||||
label.appendChild(input);
|
||||
label.appendChild(document.createTextNode(` ${dnsServerName}`));
|
||||
dnsServersContainer.appendChild(label);
|
||||
dnsServersContainer.appendChild(document.createElement('br'));
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch(error => console.error('Error loading DNS servers:', error));
|
||||
}
|
||||
|
||||
function toggleGatewayField() {
|
||||
const format = document.querySelector('input[name="format"]:checked');
|
||||
const gatewayField = document.getElementById('gatewayField');
|
||||
if (format && (format.value === 'unix' || format.value === 'win' || format.value === 'keenetic')) {
|
||||
gatewayField.style.display = 'block';
|
||||
} else {
|
||||
gatewayField.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function toggleCommentField() {
|
||||
const format = document.querySelector('input[name="format"]:checked');
|
||||
const commentField = document.getElementById('commentaryField');
|
||||
if (format && (format.value === 'mikrotik' || format.value === 'keenetic')) {
|
||||
commentField.style.display = 'block';
|
||||
} else {
|
||||
commentField.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
window.onload = function() {
|
||||
loadServices();
|
||||
loadDNSServers();
|
||||
|
||||
toggleGatewayField();
|
||||
toggleCommentField();
|
||||
};
|
||||
|
||||
document.addEventListener('change', function(event) {
|
||||
if (event.target.name === 'format') {
|
||||
toggleGatewayField();
|
||||
toggleCommentField();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<h2>Настройки</h2>
|
||||
<form id="dnsForm" onsubmit="generateConfig(event)">
|
||||
<label><strong>Список сервисов:</strong></label><br>
|
||||
<div id="servicesContainer"></div><br>
|
||||
|
||||
<label><strong>Список используемых DNS серверов:</strong></label><br>
|
||||
<div id="dnsServersContainer"></div><br>
|
||||
|
||||
<label><strong>Фильтрация Cloudflare:</strong></label><br>
|
||||
<input type="checkbox" name="cloudflare" value="yes"> Исключить Cloudflare<br><br>
|
||||
|
||||
<label><strong>Агрегация подсетей:</strong></label><br>
|
||||
<input type="radio" name="aggregation" value="16"> До /16 (255.255.0.0)<br>
|
||||
<input type="radio" name="aggregation" value="24"> До /24 (255.255.255.0)<br>
|
||||
<input type="radio" name="aggregation" value="mix"> Микс /24 и /32<br>
|
||||
<input type="radio" name="aggregation" value="none" checked> Не агрегировать<br><br>
|
||||
|
||||
<label><strong>Формат сохранения:</strong></label><br>
|
||||
<input type="radio" name="format" value="ip"> IP (только IP адреса)<br>
|
||||
<input type="radio" name="format" value="cidr"> CIDR (%IP%/32)<br>
|
||||
<input type="radio" name="format" value="win"> Windows Route (route add %IP% mask 255.255.255.255 %gateway%)<br>
|
||||
<input type="radio" name="format" value="unix"> Unix Route (ip route %IP%/32 %gateway%)<br>
|
||||
<input type="radio" name="format" value="wg"> Wireguard/AmneziaWG (%IP%/32, %IP%/32, и т.д...)<br>
|
||||
<input type="radio" name="format" value="openvpn"> Open VPN (push "route %IP% 255.255.255.255")<br>
|
||||
<input type="radio" name="format" value="keenetic"> Keenetic CLI (ip route %IP%/32 %gateway% auto !%commentary%)<br>
|
||||
<input type="radio" name="format" value="mikrotik"> Mikrotik firewall (/ip/firewall/address-list add list=%commentary% address=%IP%/32)<br><br>
|
||||
|
||||
<div id="gatewayField" style="display:none;">
|
||||
<label><strong>Укажите IP шлюза или имя интерфейса:</strong></label><br>
|
||||
<input type="text" id="gateway" name="gateway" placeholder="IP или имя шлюза"><br><br>
|
||||
</div>
|
||||
|
||||
<div id="commentaryField" style="display:none;">
|
||||
<label><strong>Укажите комментарий для списка:</strong></label><br>
|
||||
<input type="text" id="commentary" name="commentary" placeholder="Комментарий для списка"><br><br>
|
||||
</div>
|
||||
|
||||
<button type="submit">Создать конфигурацию</button>
|
||||
</form>
|
||||
|
||||
<div id="progress"></div>
|
||||
</body>
|
||||
</html>
|
||||
0
web/static/для статики JS
Normal file
0
web/static/для статики JS
Normal file
0
web/templates/для шаблонов
Normal file
0
web/templates/для шаблонов
Normal file
144
web/web_install.sh
Normal file
144
web/web_install.sh
Normal file
@@ -0,0 +1,144 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e # Завершение скрипта при ошибке
|
||||
set -u # Завершение при использовании необъявленных переменных
|
||||
|
||||
# Переменные
|
||||
USERNAME="test123"
|
||||
APP_DIR="/home/$USERNAME/dns_resolver_app"
|
||||
SERVICE_FILE="/etc/systemd/system/dns_resolver.service"
|
||||
NGINX_CONF="/etc/nginx/sites-available/dns_resolver"
|
||||
EMAIL_ADR="email@example.com"
|
||||
DOMAIN_NAME="your-domain.com"
|
||||
|
||||
# Проверка существования пользователя
|
||||
if ! id "$USERNAME" &>/dev/null; then
|
||||
echo "Пользователь $USERNAME не существует."
|
||||
read -p "Хотите создать пользователя? (y/n): " CREATE_USER
|
||||
if [[ "$CREATE_USER" =~ ^[Yy]$ ]]; then
|
||||
sudo useradd -m -s /bin/bash "$USERNAME"
|
||||
echo "Пользователь $USERNAME успешно создан."
|
||||
else
|
||||
echo "Скрипт завершён, так как пользователь не существует."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Убедиться, что пользователь $USERNAME и www-data имеют общую группу
|
||||
sudo usermod -aG www-data "$USERNAME"
|
||||
|
||||
# Обновление системы и установка зависимостей
|
||||
echo "Обновляем систему и устанавливаем зависимости..."
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install python3 python3-pip python3-venv gunicorn nginx certbot python3-certbot-nginx -y
|
||||
|
||||
# Создание директории приложения
|
||||
if [[ ! -d "$APP_DIR" ]]; then
|
||||
echo "Создаем директорию приложения..."
|
||||
sudo mkdir -p "$APP_DIR"
|
||||
sudo chown -R "$USERNAME:www-data" "$APP_DIR"
|
||||
sudo chmod -R 750 "$APP_DIR"
|
||||
else
|
||||
echo "Директория приложения уже существует. Пропускаем."
|
||||
fi
|
||||
|
||||
# Создание виртуального окружения от имени www-data
|
||||
if [[ ! -d "$APP_DIR/venv" ]]; then
|
||||
echo "Создаем виртуальное окружение..."
|
||||
sudo -u www-data python3 -m venv "$APP_DIR/venv"
|
||||
sudo chown -R "$USERNAME:www-data" "$APP_DIR/venv"
|
||||
sudo chmod -R 750 "$APP_DIR/venv"
|
||||
else
|
||||
echo "Виртуальное окружение уже существует. Пропускаем."
|
||||
fi
|
||||
|
||||
# Загрузка файла requirements.txt
|
||||
REQUIREMENTS_URL="https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/requirements.txt"
|
||||
if curl --head --fail "$REQUIREMENTS_URL" &>/dev/null; then
|
||||
curl -o "$APP_DIR/requirements.txt" "$REQUIREMENTS_URL"
|
||||
echo "Файл requirements.txt успешно загружен."
|
||||
else
|
||||
echo "Ошибка: Файл requirements.txt недоступен."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Установка зависимостей Python от имени www-data
|
||||
echo "Устанавливаем зависимости Python..."
|
||||
sudo -u www-data bash -c "source $APP_DIR/venv/bin/activate && pip install -r $APP_DIR/requirements.txt fastapi uvicorn pydantic gunicorn"
|
||||
|
||||
# Загрузка файлов приложения
|
||||
FILES=("index.html" "app.py" "main.py")
|
||||
for FILE in "${FILES[@]}"; do
|
||||
URL="https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/web/$FILE"
|
||||
if curl --head --fail "$URL" &>/dev/null; then
|
||||
curl -o "$APP_DIR/$FILE" "$URL"
|
||||
echo "Файл $FILE успешно загружен."
|
||||
sudo chown "$USERNAME:www-data" "$APP_DIR/$FILE"
|
||||
sudo chmod 640 "$APP_DIR/$FILE"
|
||||
else
|
||||
echo "Ошибка: Файл $FILE недоступен."
|
||||
fi
|
||||
done
|
||||
|
||||
# Проверка прав доступа
|
||||
sudo chown -R "$USERNAME:www-data" "$APP_DIR"
|
||||
sudo chmod -R 750 "$APP_DIR"
|
||||
|
||||
# Создание системного сервиса
|
||||
echo "Создаем системный сервис..."
|
||||
sudo bash -c "cat <<EOF > $SERVICE_FILE
|
||||
[Unit]
|
||||
Description=DNS Resolver Web App
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=www-data
|
||||
Group=www-data
|
||||
WorkingDirectory=$APP_DIR
|
||||
ExecStart=$APP_DIR/venv/bin/gunicorn -w 4 -k uvicorn.workers.UvicornWorker --bind 127.0.0.1:5000 app:app
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF"
|
||||
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now dns_resolver
|
||||
|
||||
# Настройка Nginx
|
||||
if [[ ! -f "$NGINX_CONF" ]]; then
|
||||
echo "Настраиваем Nginx..."
|
||||
sudo bash -c "cat <<EOF > $NGINX_CONF
|
||||
server {
|
||||
listen 80;
|
||||
server_name $DOMAIN_NAME;
|
||||
|
||||
root $APP_DIR;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files \$uri /index.html;
|
||||
}
|
||||
|
||||
location /run {
|
||||
proxy_pass http://127.0.0.1:5000;
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||
}
|
||||
|
||||
error_page 404 /index.html;
|
||||
}
|
||||
EOF"
|
||||
|
||||
sudo ln -sf "$NGINX_CONF" /etc/nginx/sites-enabled/
|
||||
sudo nginx -t && sudo systemctl restart nginx
|
||||
else
|
||||
echo "Конфигурация Nginx уже существует. Пропускаем."
|
||||
fi
|
||||
|
||||
# Настройка HTTPS
|
||||
echo "Настраиваем HTTPS..."
|
||||
sudo certbot --nginx -n --agree-tos --email "$EMAIL_ADR" -d "$DOMAIN_NAME"
|
||||
|
||||
echo "Скрипт выполнен успешно. Приложение доступно по адресу https://$DOMAIN_NAME"
|
||||
Reference in New Issue
Block a user