mirror of
https://github.com/Ground-Zerro/DomainMapper.git
synced 2025-12-10 01:47:18 +07:00
Compare commits
151 Commits
0.1.3
...
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 |
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
* text=auto
|
||||||
|
*.bat text eol=crlf
|
||||||
|
*.cmd text eol=crlf
|
||||||
35
README.md
35
README.md
@@ -2,6 +2,14 @@
|
|||||||
<details>
|
<details>
|
||||||
<summary>Что нового (нажать, чтобы открыть)</summary>
|
<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)
|
- Добавлен сервис Jetbrains. [Запрос @SocketSomeone](https://github.com/Ground-Zerro/DomainMapper/issues/40)
|
||||||
- Добавлен сервис Discord. [Запрос @AHuMex](https://github.com/Ground-Zerro/DomainMapper/issues/38)
|
- Добавлен сервис Discord. [Запрос @AHuMex](https://github.com/Ground-Zerro/DomainMapper/issues/38)
|
||||||
- [Комбинированный режим объединения IP-адресов в подсеть.](https://github.com/Ground-Zerro/DomainMapper/issues/36)
|
- [Комбинированный режим объединения IP-адресов в подсеть.](https://github.com/Ground-Zerro/DomainMapper/issues/36)
|
||||||
@@ -27,6 +35,8 @@
|
|||||||
<summary>Поддерживаемые сервисы (нажать, чтобы открыть)</summary>
|
<summary>Поддерживаемые сервисы (нажать, чтобы открыть)</summary>
|
||||||
|
|
||||||
- [Antifilter - community edition](https://community.antifilter.download/)
|
- [Antifilter - community edition](https://community.antifilter.download/)
|
||||||
|
- [ITDog Inside](https://github.com/itdoginfo/allow-domains)
|
||||||
|
- [ITDog Outside](https://github.com/itdoginfo/allow-domains)
|
||||||
- Youtube
|
- Youtube
|
||||||
- Facebook
|
- Facebook
|
||||||
- Openai
|
- Openai
|
||||||
@@ -38,12 +48,14 @@
|
|||||||
- Adobe
|
- Adobe
|
||||||
- Apple
|
- Apple
|
||||||
- Google
|
- Google
|
||||||
- Torrent Truckers
|
- Torrent Trackers
|
||||||
- Search engines
|
- Search engines
|
||||||
- [Github сopilot](https://github.com/features/copilot)
|
- [Github сopilot](https://github.com/features/copilot)
|
||||||
- Twitch
|
- Twitch
|
||||||
- Discord
|
- Discord
|
||||||
- Jetbrains
|
- Jetbrains
|
||||||
|
- Xbox
|
||||||
|
- Telegram
|
||||||
- Личный список
|
- Личный список
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
@@ -53,14 +65,14 @@
|
|||||||
- Преобразование доменных имен популярных сервисов в IP-адреса.
|
- Преобразование доменных имен популярных сервисов в IP-адреса.
|
||||||
- Агрегация маршрутов в /16 (255.255.0.0) и /24 (255.255.255.0) подсети. Комбинированный режим /24 + /32.
|
- Агрегация маршрутов в /16 (255.255.0.0) и /24 (255.255.255.0) подсети. Комбинированный режим /24 + /32.
|
||||||
- Фильтрация IP-адресов Cloudflare (опционально).
|
- Фильтрация IP-адресов Cloudflare (опционально).
|
||||||
- Восемь вариантов сохранения результатов.
|
- Множество форматов сохранения результата.
|
||||||
|
|
||||||
|
|
||||||
**Ключевые особенности**
|
**Ключевые особенности**
|
||||||
- Возможность выбора системного, публичного DNS-сервера или их комбинации.
|
- Возможность выбора системного, публичного DNS-сервера или их комбинации.
|
||||||
- При разрешении доменного имени используется каждый из указанных DNS-серверов, при этом процесс продолжается до получения всех возможных IP-адресов, а не останавливается на первом успешном ответе.
|
- При разрешении доменного имени используется каждый из указанных DNS-серверов, при этом процесс продолжается до получения всех возможных IP-адресов, а не останавливается на первом успешном ответе.
|
||||||
- Автоматическое исключение дубликатов IP-адресов, а также "заглушек" (например, IP самих DNS-серверов, редиректов на `0.0.0.0` и `localhost`).
|
- Автоматическое исключение дубликатов IP-адресов, а также "заглушек" (например, IP самих DNS-серверов, редиректов на `0.0.0.0` и `localhost`).
|
||||||
- Поддержка работы в "тихом" режиме без взаимодействия с пользователем, настройка через конфигурационный файл.
|
- Поддержка работы в "тихом" режиме без взаимодействия с пользователем - настройка через конфигурационный файл.
|
||||||
- В конфигурационном файле можно указать команду для автоматического запуска другого скрипта или программы по завершении работы.
|
- В конфигурационном файле можно указать команду для автоматического запуска другого скрипта или программы по завершении работы.
|
||||||
|
|
||||||
|
|
||||||
@@ -144,10 +156,23 @@ arena.openai.com
|
|||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Для пользователей Windows, не знающих "как", но кому "очень нужно" (нажать, чтобы открыть)</summary>
|
<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) репозитория.
|
- Загляните в директорию [Windows](https://github.com/Ground-Zerro/DomainMapper/tree/main/Windows) репозитория.
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
##### Протестировано в Ubuntu 20.04, macOS Sonoma и Windows 10/11
|
# ☕ Поддержка
|
||||||
|
|
||||||
|
Если проект оказался Вам полезен — можно поддержать автора:
|
||||||
|
|
||||||
|
- [Поддержать на Boosty](https://boosty.to/ground_zerro)
|
||||||
|
|||||||
@@ -94,5 +94,3 @@ endlocal
|
|||||||
echo файл скопирован в %UserProfile%\Desktop\domain-ip-resolve.txt
|
echo файл скопирован в %UserProfile%\Desktop\domain-ip-resolve.txt
|
||||||
pause
|
pause
|
||||||
exit /b 0
|
exit /b 0
|
||||||
|
|
||||||
::То-ли при выгрузке на github, то-ли при скачивании с него, в файл как-то попадает BOM... Как это починить я ХЗ.
|
|
||||||
|
|||||||
117
config.ini
117
config.ini
@@ -1,118 +1,41 @@
|
|||||||
[DomainMapper]
|
[DomainMapper]
|
||||||
# Локальный режим - загружать список сервисов и/или DNS серверов из локального файла
|
# Локальный режим загрузки (yes/no)
|
||||||
# yes - включить
|
localplatform = no
|
||||||
# no или пусто - выключить
|
localdns = no
|
||||||
localplatform = yes
|
|
||||||
localdns = yes
|
|
||||||
|
|
||||||
# Имена сервисов, разделенные запятыми, для разрешения доменных имен в IP-адреса без запроса у пользователя
|
# Сервисы для проверки (например: all, youtube, google, telegram, custom и т.д.)
|
||||||
# опции:
|
|
||||||
# пустое значение - пользователю будет выведено меню выбора
|
|
||||||
# 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
|
|
||||||
# Discord
|
|
||||||
# Jetbrains
|
|
||||||
# custom - Custom DNS list, это файл "custom-dns-list.txt" расположенный в одном каталоге со скриптом
|
|
||||||
service =
|
service =
|
||||||
|
|
||||||
# DNS сервера (номер), разделенные пробелом, которые будут использоваться для разрешения доменных имен
|
# Список DNS серверов по номерам (0 - все, 1 - системный, 2 - google, 3 - quad9 и т.д.)
|
||||||
# опции:
|
|
||||||
# пустое значение - пользователю будет выведено меню выбора
|
|
||||||
# 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 =
|
dnsserver =
|
||||||
|
|
||||||
# Включить фильтрацию IP-адресов cloudflare и не записывать их в файл результатов
|
# Исключить Cloudflare IP (yes/no)
|
||||||
# опции:
|
|
||||||
# пустое значение - пользователю будет выведено меню выбора
|
|
||||||
# yes - исключить IP адреса cloudflare из итогового списка
|
|
||||||
# no - оставить IP адреса cloudflare в итоговом списке
|
|
||||||
cloudflare =
|
cloudflare =
|
||||||
|
|
||||||
# Сгруппировать подсети
|
# Агрегация подсетей (16, 24, mix, no)
|
||||||
# опции:
|
|
||||||
# пустое значение - пользователю будет выведено меню выбора
|
|
||||||
# 16 - группировка подсетей до /16 (255.255.0.0)
|
|
||||||
# 24 - группировка подсетей до /24 (255.255.255.0)
|
|
||||||
# mix - /24 и /32 в одном файле
|
|
||||||
# no - оставить как есть
|
|
||||||
subnet =
|
subnet =
|
||||||
|
|
||||||
# Имя конечного файла
|
# Имя выходного файла
|
||||||
# опции:
|
filename = domain-ip-resolve.txt
|
||||||
# пустое значение - "domain-ip-resolve.txt" в каталоге со скриптом
|
|
||||||
# имя_файла - файл с указанным именем будет сохранени в каталоге со скриптом
|
|
||||||
# полный_путь/имя_файла - файл будет сохранен с указанным именем в указанной каталоге
|
|
||||||
filename =
|
|
||||||
|
|
||||||
# Количество потоков сканирования, если не указано - будет использоваться 20 потоков
|
# Количество потоков (по умолчанию 20)
|
||||||
threads =
|
threads =
|
||||||
|
|
||||||
# Формат сохранения файла результатов
|
# Формат результата (ip, unix, win, mikrotik, ovpn, wireguard, cidr, keenetic bat и т.д.)
|
||||||
# опции:
|
|
||||||
# пустое значение - пользователю будет выведено меню выбора
|
|
||||||
# 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 =
|
filetype =
|
||||||
|
|
||||||
# адрес шлюза или имя интерфейса - используется при сохранении IP-адресов в 'win' и 'unix' формате
|
# Параметры для форматов:
|
||||||
# опции:
|
## для win/unix — IP шлюза или имя интерфейса
|
||||||
# пустое значение - пользователю будет выведен запрос с подсказкой
|
|
||||||
# укажите IP-адрес шлюза или имя интерфейса
|
|
||||||
gateway =
|
gateway =
|
||||||
|
## для keenetic — IP шлюза или имя интерфейса, можно оба через пробел
|
||||||
# адрес шлюза или имя интерфейса - используется при сохранении IP-адресов в 'keenetic' формате
|
|
||||||
# опции:
|
|
||||||
# пустое значение - пользователю будет выведен запрос с подсказкой
|
|
||||||
# укажите IP-адрес шлюза или имя интерфейса или IP-адрес шлюза и через пробел имя интерфейса
|
|
||||||
keenetic =
|
keenetic =
|
||||||
|
## для mikrotik — имя списка address-list
|
||||||
# имя списка - используется при сохранении IP-адресов в 'mikrotik' формате
|
|
||||||
# опции:
|
|
||||||
# пустое значение - пользователю будет выведен запрос с подсказкой
|
|
||||||
# укажите имя
|
|
||||||
listname =
|
listname =
|
||||||
|
## для mikrotik - добавить или убирать "comment=%SERVICE_NAME%" в правилах Mikrotik (on/off)
|
||||||
|
mk_comment = off
|
||||||
|
|
||||||
# Показывать сведения о загруженной конфигурации при запуске скрипта
|
# Показывать конфигурацию при запуске (yes/no)
|
||||||
# опции:
|
|
||||||
# yes или пустое значение - показывать
|
|
||||||
# no - скрыть
|
|
||||||
cfginfo = yes
|
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"
|
||||||
729
main.py
729
main.py
@@ -5,49 +5,62 @@ import ipaddress
|
|||||||
import os
|
import os
|
||||||
from asyncio import Semaphore
|
from asyncio import Semaphore
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
from typing import Dict, List, Set, Tuple, Optional
|
||||||
|
|
||||||
import dns.asyncresolver
|
import dns.asyncresolver
|
||||||
import httpx
|
import httpx
|
||||||
from colorama import Fore, Style, init
|
from colorama import Fore, Style, init
|
||||||
|
|
||||||
# Цвета
|
|
||||||
init(autoreset=True)
|
init(autoreset=True)
|
||||||
|
|
||||||
|
|
||||||
def yellow(text):
|
def yellow(text):
|
||||||
return f"{Fore.YELLOW}{text}{Style.RESET_ALL}"
|
return f"{Fore.YELLOW}{text}{Style.RESET_ALL}"
|
||||||
|
|
||||||
|
|
||||||
def green(text):
|
def green(text):
|
||||||
return f"{Fore.GREEN}{text}{Style.RESET_ALL}"
|
return f"{Fore.GREEN}{text}{Style.RESET_ALL}"
|
||||||
|
|
||||||
|
|
||||||
def cyan(text):
|
def cyan(text):
|
||||||
return f"{Fore.CYAN}{text}{Style.RESET_ALL}"
|
return f"{Fore.CYAN}{text}{Style.RESET_ALL}"
|
||||||
|
|
||||||
|
|
||||||
def red(text):
|
def red(text):
|
||||||
return f"{Fore.RED}{text}{Style.RESET_ALL}"
|
return f"{Fore.RED}{text}{Style.RESET_ALL}"
|
||||||
|
|
||||||
|
|
||||||
def magneta(text):
|
def magneta(text):
|
||||||
return f"{Fore.MAGENTA}{text}{Style.RESET_ALL}"
|
return f"{Fore.MAGENTA}{text}{Style.RESET_ALL}"
|
||||||
|
|
||||||
|
|
||||||
def blue(text):
|
def blue(text):
|
||||||
return f"{Fore.BLUE}{text}{Style.RESET_ALL}"
|
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):
|
def read_config(cfg_file):
|
||||||
try:
|
try:
|
||||||
config = configparser.ConfigParser()
|
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)
|
config.read_file(file)
|
||||||
if 'DomainMapper' in config:
|
if 'DomainMapper' in config:
|
||||||
config = config['DomainMapper']
|
config = config['DomainMapper']
|
||||||
|
|
||||||
service = config.get('service') or ''
|
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'
|
filename = config.get('filename') or 'domain-ip-resolve.txt'
|
||||||
cloudflare = config.get('cloudflare') or ''
|
cloudflare = config.get('cloudflare') or ''
|
||||||
filetype = config.get('filetype') or ''
|
filetype = config.get('filetype') or ''
|
||||||
@@ -56,53 +69,39 @@ def read_config(cfg_file):
|
|||||||
dns_server_indices = list(map(int, config.get('dnsserver', '').split())) if config.get('dnsserver') else []
|
dns_server_indices = list(map(int, config.get('dnsserver', '').split())) if config.get('dnsserver') else []
|
||||||
mk_list_name = config.get('listname') or ''
|
mk_list_name = config.get('listname') or ''
|
||||||
subnet = config.get('subnet') or ''
|
subnet = config.get('subnet') or ''
|
||||||
cfginfo = config.get('cfginfo') or 'yes' # Не возвращаем его в main
|
cfginfo = config.get('cfginfo') or 'yes'
|
||||||
ken_gateway = config.get('keenetic') or ''
|
ken_gateway = config.get('keenetic') or ''
|
||||||
localplatform = config.get('localplatform') or ''
|
localplatform = config.get('localplatform') or ''
|
||||||
localdns = config.get('localdns') or ''
|
localdns = config.get('localdns') or ''
|
||||||
|
mk_comment = config.get('mk_comment') or 'off'
|
||||||
|
|
||||||
if cfginfo in ['yes', 'y']:
|
if cfginfo in ['yes', 'y']:
|
||||||
print(f"{yellow(f'Загружена конфигурация из {cfg_file}:')}")
|
print(f"{yellow(f'Загружена конфигурация из {cfg_file}:')}")
|
||||||
print(
|
print(f"{Style.BRIGHT}Сервисы для проверки:{Style.RESET_ALL} {service if service else 'спросить у пользователя'}")
|
||||||
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(
|
print(f"{Style.BRIGHT}Количество одновременных запросов к одному DNS серверу:{Style.RESET_ALL} {request_limit}")
|
||||||
f"{Style.BRIGHT}Использовать DNS сервер:{Style.RESET_ALL} {dns_server_indices if dns_server_indices else 'спросить у пользователя'}")
|
print(f"{Style.BRIGHT}Фильтрация IP-адресов Cloudflare:{Style.RESET_ALL} {'включена' if cloudflare in ['y', 'yes'] else 'выключена' if cloudflare in ['n', 'no'] else 'спросить у пользователя'}")
|
||||||
print(
|
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 'спросить у пользователя'}")
|
||||||
f"{Style.BRIGHT}Количество одновременных запросов к одному DNS серверу:{Style.RESET_ALL} {request_limit}")
|
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 'спросить у пользователя'}")
|
||||||
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', '']:
|
if filetype in ['win', 'unix', '']:
|
||||||
print(
|
print(f"{Style.BRIGHT}Шлюз/Имя интерфейса для Windows и Linux route:{Style.RESET_ALL} {gateway if gateway else 'спросить у пользователя'}")
|
||||||
f"{Style.BRIGHT}Шлюз/Имя интерфейса для Windows и Linux route:{Style.RESET_ALL} {gateway if gateway else 'спросить у пользователя'}")
|
|
||||||
if filetype in ['keenetic', '']:
|
if filetype in ['keenetic', '']:
|
||||||
print(
|
print(f"{Style.BRIGHT}Шлюз/Имя интерфейса для Keenetic CLI:{Style.RESET_ALL} {ken_gateway if ken_gateway else 'спросить у пользователя'}")
|
||||||
f"{Style.BRIGHT}Шлюз/Имя интерфейса для Keenetic CLI:{Style.RESET_ALL} {ken_gateway if ken_gateway else 'спросить у пользователя'}")
|
|
||||||
if filetype in ['mikrotik', '']:
|
if filetype in ['mikrotik', '']:
|
||||||
print(
|
print(f"{Style.BRIGHT}Имя списка для Mikrotik firewall:{Style.RESET_ALL} {mk_list_name if mk_list_name else 'спросить у пользователя'}")
|
||||||
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} {filename}")
|
||||||
print(
|
print(f"{Style.BRIGHT}Выполнить по завершению:{Style.RESET_ALL} {run_command if run_command else 'не указано'}")
|
||||||
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 'выключен'}")
|
||||||
if localplatform in ['yes', 'y'] or localdns in ['yes', 'y']:
|
print(f"{Style.BRIGHT}Локальный список DNS серверов:{Style.RESET_ALL} {'включен' if str(localdns).strip().lower() in ('yes', 'y') else 'выключен'}")
|
||||||
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
|
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:
|
except Exception as e:
|
||||||
print(
|
print(f"{yellow(f'Ошибка загрузки {cfg_file}:')} {e}\n{Style.BRIGHT}Используются настройки 'по умолчанию'.{Style.RESET_ALL}")
|
||||||
f"{yellow(f'Ошибка загрузки {cfg_file}:')} {e}\n{Style.BRIGHT}Используются настройки 'по умолчанию'.{Style.RESET_ALL}")
|
return '', 20, 'domain-ip-resolve.txt', '', '', '', '', [], '', '', '', '', '', 'off'
|
||||||
return '', 20, 'domain-ip-resolve.txt', '', '', '', '', [], '', '', '', '', ''
|
|
||||||
|
|
||||||
|
|
||||||
# IP шлюза для win и unix
|
|
||||||
def gateway_input(gateway):
|
def gateway_input(gateway):
|
||||||
if not gateway:
|
if not gateway:
|
||||||
input_gateway = input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')}: ")
|
input_gateway = input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')}: ")
|
||||||
@@ -110,188 +109,192 @@ def gateway_input(gateway):
|
|||||||
else:
|
else:
|
||||||
return gateway
|
return gateway
|
||||||
|
|
||||||
|
|
||||||
# IP шлюза и имя интерфейса для keenetic
|
|
||||||
def ken_gateway_input(ken_gateway):
|
def ken_gateway_input(ken_gateway):
|
||||||
if not ken_gateway:
|
if not ken_gateway:
|
||||||
input_ken_gateway = input(
|
input_ken_gateway = input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')} или {green('IP шлюза')} и через пробел {green('имя интерфейса')}: ")
|
||||||
f"Укажите {green('IP шлюза')} или {green('имя интерфейса')} или {green('IP шлюза')} и через пробел {green('имя интерфейса')}: ")
|
|
||||||
return input_ken_gateway.strip() if input_ken_gateway else None
|
return input_ken_gateway.strip() if input_ken_gateway else None
|
||||||
else:
|
else:
|
||||||
return ken_gateway
|
return ken_gateway
|
||||||
|
|
||||||
|
|
||||||
# Ограничение числа запросов
|
|
||||||
def get_semaphore(request_limit):
|
def get_semaphore(request_limit):
|
||||||
return defaultdict(lambda: Semaphore(request_limit))
|
return defaultdict(lambda: Semaphore(request_limit))
|
||||||
|
|
||||||
|
|
||||||
# Инициализация semaphore для ограничения запросов
|
|
||||||
def init_semaphores(request_limit):
|
def init_semaphores(request_limit):
|
||||||
return get_semaphore(request_limit)
|
return get_semaphore(request_limit)
|
||||||
|
|
||||||
|
async def load_urls(url: str) -> Dict[str, str]:
|
||||||
# Загрузка списка платформ из сети
|
|
||||||
async def load_urls(url):
|
|
||||||
try:
|
try:
|
||||||
async with httpx.AsyncClient() as client:
|
client = await get_http_client()
|
||||||
response = await client.get(url)
|
response = await client.get(url)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
text = response.text
|
text = response.text
|
||||||
lines = text.split('\n')
|
lines = text.split('\n')
|
||||||
urls = {}
|
urls = {}
|
||||||
for line in lines:
|
for line in lines:
|
||||||
if line.strip():
|
if line.strip() and ': ' in line:
|
||||||
service, url = line.split(': ', 1)
|
service, url_val = line.split(': ', 1)
|
||||||
urls[service.strip()] = url.strip()
|
urls[service.strip()] = url_val.strip()
|
||||||
return urls
|
return urls
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при загрузке списка платформ: {e}")
|
print(f"Ошибка при загрузке списка платформ: {e}")
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
async def load_urls_from_file() -> Dict[str, str]:
|
||||||
# Загрузка списка платформ из локального файла
|
|
||||||
async def load_urls_from_file():
|
|
||||||
try:
|
try:
|
||||||
with open('platformdb', 'r') as file:
|
with open('platformdb', 'r', encoding='utf-8') as file:
|
||||||
urls = {}
|
urls = {}
|
||||||
for line in file:
|
for line in file:
|
||||||
if line.strip():
|
if line.strip() and ': ' in line:
|
||||||
service, url = line.split(': ', 1)
|
service, url = line.split(': ', 1)
|
||||||
urls[service.strip()] = url.strip()
|
urls[service.strip()] = url.strip()
|
||||||
return urls
|
return urls
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при загрузке списка платформ: {e}")
|
print(f"\n{red('Локальный список сервисов не найден - загружаем из сети.')}")
|
||||||
return {}
|
urls = await load_urls(platform_db_url)
|
||||||
|
return urls
|
||||||
|
|
||||||
|
async def load_dns_servers(url: str) -> Dict[str, List[str]]:
|
||||||
# Загрузка списка DNS серверов
|
|
||||||
async def load_dns_servers(url):
|
|
||||||
try:
|
try:
|
||||||
async with httpx.AsyncClient() as client:
|
client = await get_http_client()
|
||||||
response = await client.get(url)
|
response = await client.get(url)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
text = response.text
|
text = response.text
|
||||||
lines = text.split('\n')
|
lines = text.split('\n')
|
||||||
dns_servers = {}
|
dns_servers = {}
|
||||||
for line in lines:
|
for line in lines:
|
||||||
if line.strip():
|
if line.strip() and ': ' in line:
|
||||||
service, servers = line.split(': ', 1)
|
service, servers = line.split(': ', 1)
|
||||||
dns_servers[service.strip()] = servers.strip().split()
|
dns_servers[service.strip()] = servers.strip().split()
|
||||||
return dns_servers
|
return dns_servers
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при загрузке списка DNS серверов: {e}")
|
print(f"Ошибка при загрузке списка DNS серверов: {e}")
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
async def load_dns_from_file() -> Dict[str, List[str]]:
|
||||||
# Загрузка списка DNS серверов из локального файла
|
|
||||||
async def load_dns_from_file():
|
|
||||||
try:
|
try:
|
||||||
with open('dnsdb', 'r') as file:
|
with open('dnsdb', 'r') as file:
|
||||||
dns_servers = {}
|
dns_servers = {}
|
||||||
for line in file:
|
for line in file:
|
||||||
if line.strip():
|
if line.strip() and ': ' in line:
|
||||||
service, servers = line.split(': ', 1)
|
service, servers = line.split(': ', 1)
|
||||||
dns_servers[service.strip()] = servers.strip().split()
|
dns_servers[service.strip()] = servers.strip().split()
|
||||||
return dns_servers
|
return dns_servers
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при загрузке списка DNS серверов: {e}")
|
print(f"\n{red('Локальный список DNS серверов не найден - загружаем из сети.')}")
|
||||||
return {}
|
dns_servers = await load_dns_servers(dns_db_url)
|
||||||
|
return dns_servers
|
||||||
|
|
||||||
|
async def get_cloudflare_ips() -> Set[str]:
|
||||||
# Загрузка IP-адресов cloudflare
|
|
||||||
async def get_cloudflare_ips():
|
|
||||||
try:
|
try:
|
||||||
async with httpx.AsyncClient() as client:
|
client = await get_http_client()
|
||||||
response = await client.get("https://www.cloudflare.com/ips-v4/")
|
response = await client.get("https://www.cloudflare.com/ips-v4/")
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
text = response.text
|
text = response.text
|
||||||
cloudflare_ips = set()
|
cloudflare_ips = set()
|
||||||
for line in text.splitlines():
|
|
||||||
line = line.strip()
|
for line in text.splitlines():
|
||||||
if '/' in line:
|
line = line.strip()
|
||||||
try:
|
if '/' in line:
|
||||||
ip_network = ipaddress.ip_network(line)
|
try:
|
||||||
for ip in ip_network:
|
network = ipaddress.ip_network(line)
|
||||||
cloudflare_ips.add(str(ip))
|
for ip in network:
|
||||||
except ValueError:
|
cloudflare_ips.add(str(ip))
|
||||||
continue
|
except ValueError:
|
||||||
return cloudflare_ips
|
continue
|
||||||
|
return cloudflare_ips
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("Ошибка при получении IP адресов Cloudflare:", e)
|
print("Ошибка при получении IP адресов Cloudflare:", e)
|
||||||
return set()
|
return set()
|
||||||
|
|
||||||
|
async def load_dns_names(url_or_file: str) -> List[str]:
|
||||||
# Загрузка списков DNS имен из сети и локальных файлов
|
|
||||||
async def load_dns_names(url_or_file):
|
|
||||||
if url_or_file.startswith("http"):
|
if url_or_file.startswith("http"):
|
||||||
async with httpx.AsyncClient() as client:
|
client = await get_http_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:
|
try:
|
||||||
total_domains_processed[0] += 1
|
response = await client.get(url_or_file)
|
||||||
response = await resolver.resolve(domain)
|
response.raise_for_status()
|
||||||
ips = [ip.address for ip in response]
|
return [line.strip() for line in response.text.splitlines() if line.strip()]
|
||||||
filtered_ips = []
|
except httpx.HTTPStatusError as e:
|
||||||
for ip_address in ips:
|
print(f"Ошибка при загрузке DNS имен: {e}")
|
||||||
if ip_address in ('127.0.0.1', '0.0.0.0') or ip_address in resolver.nameservers:
|
return []
|
||||||
null_ips_count[0] += 1
|
else:
|
||||||
elif include_cloudflare and ip_address in cloudflare_ips:
|
try:
|
||||||
cloudflare_ips_count[0] += 1
|
with open(url_or_file, 'r', encoding='utf-8') as file:
|
||||||
else:
|
return [line.strip() for line in file.readlines() if line.strip()]
|
||||||
filtered_ips.append(ip_address)
|
except Exception as e:
|
||||||
print(f"{Fore.BLUE}{domain} IP-адрес: {ip_address} - {dns_server_name}{Style.RESET_ALL}")
|
print(f"Ошибка при чтении файла {url_or_file}: {e}")
|
||||||
return filtered_ips
|
|
||||||
except Exception as e: # Ловим все ошибки чтобы код не прервался
|
|
||||||
print(f"{Fore.RED}Не удалось получить IP-адрес: {domain} - {dns_server_name}{Style.RESET_ALL}")
|
|
||||||
return []
|
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,
|
async def resolve_dns_optimized(service: str, dns_names: List[str],
|
||||||
null_ips_count, cloudflare_ips_count, total_domains_processed, include_cloudflare):
|
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:
|
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 = []
|
tasks = []
|
||||||
for server_name, servers in dns_servers:
|
|
||||||
resolver = dns.asyncresolver.Resolver()
|
for batch in domain_batches:
|
||||||
resolver.nameservers = servers
|
for server_name, servers in dns_servers:
|
||||||
for domain in dns_names:
|
resolver = dns.asyncresolver.Resolver()
|
||||||
domain = domain.strip()
|
resolver.nameservers = servers
|
||||||
if domain:
|
|
||||||
tasks.append(resolve_domain(domain, resolver, semaphore[server_name], server_name, null_ips_count,
|
tasks.append(resolve_domain_batch(
|
||||||
cloudflare_ips, cloudflare_ips_count, total_domains_processed,
|
batch, resolver, semaphore_dict[server_name],
|
||||||
include_cloudflare))
|
server_name, stats, cloudflare_ips, include_cloudflare
|
||||||
|
))
|
||||||
results = await asyncio.gather(*tasks)
|
|
||||||
|
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()
|
unique_ips_current_service = set()
|
||||||
for result in results:
|
for ip_address in results:
|
||||||
for ip_address in result:
|
if ip_address not in unique_ips_all_services:
|
||||||
if ip_address not in unique_ips_all_services:
|
unique_ips_current_service.add(ip_address)
|
||||||
unique_ips_current_service.add(ip_address)
|
unique_ips_all_services.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 ''
|
||||||
return '\n'.join(unique_ips_current_service) + '\n'
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Не удалось сопоставить IP адреса {service} его доменным именам.", e)
|
print(f"Не удалось сопоставить IP адреса {service} его доменным именам: {e}")
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
def check_service_config(service, urls, local_dns_names):
|
def check_service_config(service, urls, local_dns_names):
|
||||||
if service:
|
if service:
|
||||||
services = [s.strip() for s in service.split(',')]
|
services = [s.strip() for s in service.split(',')]
|
||||||
@@ -311,8 +314,8 @@ def check_service_config(service, urls, local_dns_names):
|
|||||||
while True:
|
while True:
|
||||||
print(f"\n{yellow('Выберите сервисы:')}")
|
print(f"\n{yellow('Выберите сервисы:')}")
|
||||||
print("0. Выбрать все")
|
print("0. Выбрать все")
|
||||||
for idx, (service, url) in enumerate(urls.items(), 1):
|
for idx, (service_name, url) in enumerate(urls.items(), 1):
|
||||||
print(f"{idx}. {service.capitalize()}")
|
print(f"{idx}. {service_name.capitalize()}")
|
||||||
if local_dns_names:
|
if local_dns_names:
|
||||||
print(f"{len(urls) + 1}. Custom DNS list")
|
print(f"{len(urls) + 1}. Custom DNS list")
|
||||||
|
|
||||||
@@ -332,37 +335,38 @@ def check_service_config(service, urls, local_dns_names):
|
|||||||
break
|
break
|
||||||
return services
|
return services
|
||||||
|
|
||||||
|
|
||||||
# Промт cloudflare фильтр
|
|
||||||
def check_include_cloudflare(cloudflare):
|
def check_include_cloudflare(cloudflare):
|
||||||
if cloudflare in ['yes', 'y', 'no', 'n']:
|
if cloudflare in ['yes', 'y', 'no', 'n']:
|
||||||
return cloudflare in ['yes', 'y']
|
return cloudflare in ['yes', 'y']
|
||||||
return input(f"\n{yellow('Исключить IP адреса Cloudflare из итогового списка?')}"
|
|
||||||
f"\n{green('yes')} - исключить"
|
user_input = input(
|
||||||
f"\n{green('Enter')} - оставить: ").strip().lower() in ['yes', 'y']
|
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):
|
def check_dns_servers(dns_servers, dns_server_indices):
|
||||||
# Получение системных DNS серверов
|
|
||||||
system_dns_servers = dns.asyncresolver.Resolver().nameservers
|
system_dns_servers = dns.asyncresolver.Resolver().nameservers
|
||||||
|
|
||||||
# Формирование списка всех доступных серверов
|
|
||||||
dns_server_options = [('Системный DNS', system_dns_servers)] + list(dns_servers.items())
|
dns_server_options = [('Системный DNS', system_dns_servers)] + list(dns_servers.items())
|
||||||
|
|
||||||
selected_dns_servers = []
|
selected_dns_servers = []
|
||||||
|
|
||||||
# Если указаны индексы серверов в конфиге
|
|
||||||
if dns_server_indices:
|
if dns_server_indices:
|
||||||
if 0 in dns_server_indices: # Если указано 0, выбираем все доступные DNS серверы
|
if 0 in dns_server_indices:
|
||||||
selected_dns_servers = dns_server_options
|
selected_dns_servers = dns_server_options
|
||||||
else:
|
else:
|
||||||
for idx in dns_server_indices:
|
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])
|
selected_dns_servers.append(dns_server_options[idx - 1])
|
||||||
return selected_dns_servers
|
return selected_dns_servers
|
||||||
|
|
||||||
# Если индексы не указаны, запрашиваем у пользователя выбор серверов
|
|
||||||
while True:
|
while True:
|
||||||
print(f"\n{yellow('Какие DNS сервера использовать?')}")
|
print(f"\n{yellow('Какие DNS серверы использовать?')}")
|
||||||
print("0. Выбрать все")
|
print("0. Выбрать все")
|
||||||
for idx, (name, servers) in enumerate(dns_server_options, 1):
|
for idx, (name, servers) in enumerate(dns_server_options, 1):
|
||||||
print(f"{idx}. {name}: {', '.join(servers)}")
|
print(f"{idx}. {name}: {', '.join(servers)}")
|
||||||
@@ -383,8 +387,6 @@ def check_dns_servers(dns_servers, dns_server_indices):
|
|||||||
|
|
||||||
return selected_dns_servers
|
return selected_dns_servers
|
||||||
|
|
||||||
|
|
||||||
# комментарй для microtik firewall
|
|
||||||
def mk_list_name_input(mk_list_name):
|
def mk_list_name_input(mk_list_name):
|
||||||
if not mk_list_name:
|
if not mk_list_name:
|
||||||
input_mk_list_name = input(f"Введите {green('LIST_NAME')} для Mikrotik firewall: ")
|
input_mk_list_name = input(f"Введите {green('LIST_NAME')} для Mikrotik firewall: ")
|
||||||
@@ -392,83 +394,81 @@ def mk_list_name_input(mk_list_name):
|
|||||||
else:
|
else:
|
||||||
return mk_list_name
|
return mk_list_name
|
||||||
|
|
||||||
|
def comment(selected_service):
|
||||||
# Уплотняем имена сервисов
|
|
||||||
def mk_comment(selected_service):
|
|
||||||
return ",".join(["".join(word.title() for word in s.split()) for s in selected_service])
|
return ",".join(["".join(word.title() for word in s.split()) for s in selected_service])
|
||||||
|
|
||||||
|
|
||||||
# Промт на объединение IP в подсети
|
|
||||||
def subnet_input(subnet):
|
def subnet_input(subnet):
|
||||||
if not subnet: # Проверяем, является ли значение пустым
|
if not subnet:
|
||||||
subnet = input(
|
choice = input(
|
||||||
f"\n{yellow('Объединить IP-адреса в подсети?')} "
|
f"\n{yellow('Объединить IP-адреса в подсети?')}"
|
||||||
f"\n{green('16')} - сократить до /16 (255.255.0.0)"
|
f"\n1. сократить до {green('/16')} (255.255.0.0)"
|
||||||
f"\n{green('24')} - сократить до /24 (255.255.255.0)"
|
f"\n2. сократить до {green('/24')} (255.255.255.0)"
|
||||||
f"\n{green('mix')} - сократить до /24 (255.255.255.0) и /32 (255.255.255.255)"
|
f"\n3. сократить до {green('/24')} + {green('/32')} (255.255.255.0 и 255.255.255.255)"
|
||||||
f"\n{green('Enter')} - пропустить: "
|
f"\n{green('Enter')} - пропустить"
|
||||||
).strip().lower()
|
f"\nВаш выбор: "
|
||||||
|
).strip()
|
||||||
|
|
||||||
|
if choice == '1':
|
||||||
|
subnet = '16'
|
||||||
|
elif choice == '2':
|
||||||
|
subnet = '24'
|
||||||
|
elif choice == '3':
|
||||||
|
subnet = 'mix'
|
||||||
|
else:
|
||||||
|
subnet = '32'
|
||||||
|
|
||||||
return subnet if subnet in {'16', '24', 'mix'} else '32'
|
return subnet if subnet in {'16', '24', 'mix'} else '32'
|
||||||
|
|
||||||
|
def group_ips_in_subnets_optimized(filename: str, subnet: str):
|
||||||
# Агрегация маршрутов
|
|
||||||
def group_ips_in_subnets(filename, subnet):
|
|
||||||
try:
|
try:
|
||||||
with open(filename, 'r', encoding='utf-8-sig') as file:
|
with open(filename, 'r', encoding='utf-8') as file:
|
||||||
ips = {line.strip() for line in file if line.strip()} # Собираем уникальные IP адреса
|
ips = {line.strip() for line in file if line.strip()}
|
||||||
|
|
||||||
subnets = set()
|
subnets = set()
|
||||||
|
|
||||||
def process_ips(subnet):
|
if subnet == "16":
|
||||||
for ip in ips:
|
for ip in ips:
|
||||||
try:
|
try:
|
||||||
if subnet == "16":
|
network = ipaddress.IPv4Network(f"{ip}/16", strict=False)
|
||||||
# Преобразуем в /16 (два последних октета заменяются на 0.0)
|
subnets.add(str(network.network_address))
|
||||||
network = ipaddress.IPv4Network(f"{ip}/16", strict=False)
|
except ValueError:
|
||||||
subnets.add(f"{network.network_address}")
|
continue
|
||||||
elif subnet == "24":
|
print(f"{Style.BRIGHT}IP-адреса агрегированы до /16 подсети{Style.RESET_ALL}")
|
||||||
# Преобразуем в /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"]:
|
elif subnet == "24":
|
||||||
process_ips(subnet)
|
for ip in ips:
|
||||||
print(f"{Style.BRIGHT}IP-адреса агрегированы до /{subnet} подсети{Style.RESET_ALL}")
|
try:
|
||||||
|
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}")
|
||||||
|
|
||||||
elif subnet == "mix":
|
elif subnet == "mix":
|
||||||
octet_groups = {}
|
octet_groups = defaultdict(list)
|
||||||
for ip in ips:
|
for ip in ips:
|
||||||
key = '.'.join(ip.split('.')[:3]) # Группировка по первым трем октетам
|
key = '.'.join(ip.split('.')[:3])
|
||||||
if key not in octet_groups:
|
|
||||||
octet_groups[key] = []
|
|
||||||
octet_groups[key].append(ip)
|
octet_groups[key].append(ip)
|
||||||
|
|
||||||
# IP-адреса с совпадающими первыми тремя октетами
|
for key, group in octet_groups.items():
|
||||||
network_24 = {key + '.0' for key, group in octet_groups.items() if
|
if len(group) > 1:
|
||||||
len(group) > 1} # Базовый IP для /24 подсетей
|
subnets.add(key + '.0')
|
||||||
# Удаляем IP с совпадающими первыми тремя октетами из множества
|
else:
|
||||||
ips -= {ip for group in octet_groups.values() if len(group) > 1 for ip in group}
|
subnets.update(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}")
|
print(f"{Style.BRIGHT}IP-адреса агрегированы до масок /24 и /32{Style.RESET_ALL}")
|
||||||
|
|
||||||
with open(filename, 'w', encoding='utf-8-sig') as file:
|
with open(filename, 'w', encoding='utf-8') as file:
|
||||||
for subnet in sorted(subnets):
|
for subnet_ip in sorted(subnets, key=lambda x: ipaddress.IPv4Address(x.split('/')[0])):
|
||||||
file.write(subnet + '\n')
|
file.write(subnet_ip + '\n')
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при обработке файла: {e}")
|
print(f"Ошибка при обработке файла: {e}")
|
||||||
|
|
||||||
|
def process_file_format(filename, filetype, gateway, selected_service, mk_list_name, mk_comment, subnet, ken_gateway):
|
||||||
# Выбор формата сохранения результатов
|
|
||||||
def process_file_format(filename, filetype, gateway, selected_service, mk_list_name, subnet, ken_gateway):
|
|
||||||
def read_file(filename):
|
def read_file(filename):
|
||||||
try:
|
try:
|
||||||
with open(filename, 'r', encoding='utf-8-sig') as file:
|
with open(filename, 'r', encoding='utf-8') as file:
|
||||||
return file.readlines()
|
return file.readlines()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка чтения файла: {e}")
|
print(f"Ошибка чтения файла: {e}")
|
||||||
@@ -476,82 +476,85 @@ def process_file_format(filename, filetype, gateway, selected_service, mk_list_n
|
|||||||
|
|
||||||
def write_file(filename, ips, formatter):
|
def write_file(filename, ips, formatter):
|
||||||
formatted_ips = [formatter(ip.strip()) for ip in ips]
|
formatted_ips = [formatter(ip.strip()) for ip in ips]
|
||||||
with open(filename, 'w', encoding='utf-8-sig') as file:
|
with open(filename, 'w', encoding='utf-8') as file:
|
||||||
if filetype.lower() == 'wireguard':
|
if filetype.lower() == 'wireguard':
|
||||||
file.write(', '.join(formatted_ips))
|
file.write(', '.join(formatted_ips))
|
||||||
else:
|
else:
|
||||||
file.write('\n'.join(formatted_ips))
|
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"
|
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:
|
if not filetype:
|
||||||
filetype = input(f"""
|
user_input = input(f"""
|
||||||
{yellow('В каком формате сохранить файл?')}
|
{yellow('В каком формате сохранить файл?')}
|
||||||
{green('win')} - route add {cyan('IP')} mask {net_mask} {cyan('GATEWAY')}
|
1. {green('win')} - route add {cyan('IP')} mask {net_mask} {cyan('GATEWAY')}
|
||||||
{green('unix')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY')}
|
2. {green('unix')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY')}
|
||||||
{green('keenetic')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY GATEWAY_NAME')} auto !{mk_comment(selected_service)}
|
3. {green('keenetic bat')} - route add {cyan('IP')} mask {net_mask} 0.0.0.0
|
||||||
{green('cidr')} - {cyan('IP')}/{subnet}
|
4. {green('keenetic cli')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY GATEWAY_NAME')} auto !{comment(selected_service)}
|
||||||
{green('mikrotik')} - /ip/firewall/address-list add list={cyan("LIST_NAME")} comment="{mk_comment(selected_service)}" address={cyan("IP")}/{subnet}
|
5. {green('cidr')} - {cyan('IP')}/{subnet}
|
||||||
{green('ovpn')} - push "route {cyan('IP')} {net_mask}"
|
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}
|
||||||
{green('wireguard')} - {cyan('IP')}/{subnet}, {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')}
|
{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)
|
ips = read_file(filename)
|
||||||
if not ips:
|
if not ips:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Дополнительные запросы в зависимости от формата файла
|
if filetype in ['win', 'unix']:
|
||||||
if filetype in ['win', 'unix']: # Запрашиваем IP шлюза для win и unix
|
|
||||||
gateway = gateway_input(gateway)
|
gateway = gateway_input(gateway)
|
||||||
elif filetype == 'keenetic': # Запрашиваем IP шлюза и имя интерфейса для keenetic
|
elif filetype == 'keenetic cli':
|
||||||
ken_gateway = ken_gateway_input(ken_gateway)
|
ken_gateway = ken_gateway_input(ken_gateway)
|
||||||
elif filetype == 'mikrotik': # Запрашиваем ввод комментария для microtik firewall
|
elif filetype == 'mikrotik':
|
||||||
mk_list_name = mk_list_name_input(mk_list_name)
|
mk_list_name = mk_list_name_input(mk_list_name)
|
||||||
|
|
||||||
# обычный формат
|
|
||||||
formatters = {
|
formatters = {
|
||||||
'win': lambda ip: f"route add {ip} mask {net_mask} {gateway}",
|
'win': lambda ip: f"route add {ip} mask {net_mask} {gateway}",
|
||||||
'unix': lambda ip: f"ip route {ip}/{subnet} {gateway}",
|
'unix': lambda ip: f"ip route {ip}/{subnet} {gateway}",
|
||||||
'keenetic': lambda ip: f"ip route {ip}/{subnet} {ken_gateway} auto !{mk_comment(selected_service)}",
|
'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}",
|
'cidr': lambda ip: f"{ip}/{subnet}",
|
||||||
'ovpn': lambda ip: f'push "route {ip} {net_mask}"',
|
'ovpn': lambda ip: f'push "route {ip} {net_mask}"',
|
||||||
'mikrotik': lambda
|
'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}',
|
||||||
ip: f'/ip/firewall/address-list add list={mk_list_name} comment="{mk_comment(selected_service)}" address={ip}/{subnet}',
|
|
||||||
'wireguard': lambda ip: f"{ip}/{subnet}"
|
'wireguard': lambda ip: f"{ip}/{subnet}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# mix формат
|
|
||||||
if subnet == "mix":
|
if subnet == "mix":
|
||||||
if filetype.lower() == 'win': # Обработка для win
|
if filetype in ['win', 'keenetic bat']:
|
||||||
mix_formatter = lambda ip: f"{ip.strip()} mask 255.255.255.0" if ip.endswith(
|
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"
|
||||||
'.0') else f"{ip.strip()} mask 255.255.255.255"
|
elif filetype.lower() == 'ovpn':
|
||||||
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"
|
||||||
mix_formatter = lambda ip: f"{ip.strip()} 255.255.255.0" if ip.endswith(
|
else:
|
||||||
'.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"
|
mix_formatter = lambda ip: f"{ip.strip()}/24" if ip.endswith('.0') else f"{ip.strip()}/32"
|
||||||
|
|
||||||
formatters.update({
|
formatters.update({
|
||||||
'win': lambda ip: f"route add {mix_formatter(ip)} {gateway}",
|
'win': lambda ip: f"route add {mix_formatter(ip)} {gateway}",
|
||||||
'unix': lambda ip: f"ip route {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 !{mk_comment(selected_service)}",
|
'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)}",
|
'cidr': lambda ip: f"{mix_formatter(ip)}",
|
||||||
'ovpn': lambda ip: f'push "route {mix_formatter(ip)}"',
|
'ovpn': lambda ip: f'push "route {mix_formatter(ip)}"',
|
||||||
'mikrotik': lambda
|
'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)}',
|
||||||
ip: f'/ip/firewall/address-list add list={mk_list_name} comment="{mk_comment(selected_service)}" address={mix_formatter(ip)}',
|
|
||||||
'wireguard': lambda ip: f"{mix_formatter(ip)}"
|
'wireguard': lambda ip: f"{mix_formatter(ip)}"
|
||||||
})
|
})
|
||||||
|
|
||||||
# Запись в файл
|
|
||||||
if filetype.lower() in formatters:
|
if filetype.lower() in formatters:
|
||||||
write_file(filename, ips, formatters[filetype.lower()])
|
write_file(filename, ips, formatters[filetype.lower()])
|
||||||
|
|
||||||
|
|
||||||
# Стартуем
|
|
||||||
async def main():
|
async def main():
|
||||||
# Парсинг аргументов командной строки
|
|
||||||
parser = argparse.ArgumentParser(description="DNS resolver script with custom config file.")
|
parser = argparse.ArgumentParser(description="DNS resolver script with custom config file.")
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-c', '--config',
|
'-c', '--config',
|
||||||
@@ -561,96 +564,114 @@ async def main():
|
|||||||
)
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
# Инициализация настроек из переданного конфигурационного файла
|
try:
|
||||||
config_file = args.config
|
config_file = args.config
|
||||||
service, request_limit, filename, cloudflare, filetype, gateway, run_command, dns_server_indices, mk_list_name, subnet, ken_gateway, localplatform, localdns = read_config(
|
(service, request_limit, filename, cloudflare, filetype, gateway, run_command,
|
||||||
config_file)
|
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-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-серверов
|
|
||||||
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))
|
|
||||||
|
|
||||||
|
if localplatform in ['yes', 'y']:
|
||||||
|
urls = await load_urls_from_file()
|
||||||
else:
|
else:
|
||||||
url_or_file = urls[service]
|
urls = await load_urls(platform_db_url)
|
||||||
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)
|
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:
|
selected_services = check_service_config(service, urls, local_dns_names)
|
||||||
for result in results:
|
|
||||||
file.write(result)
|
|
||||||
|
|
||||||
print(f"\n{yellow('Проверка завершена.')}")
|
if localdns in ['yes', 'y']:
|
||||||
print(f"{Style.BRIGHT}Использовались DNS сервера:{Style.RESET_ALL} " + ', '.join(
|
dns_servers = await load_dns_from_file()
|
||||||
[f'{pair[0]} ({", ".join(pair[1])})' for pair in selected_dns_servers]))
|
else:
|
||||||
print(f"{Style.BRIGHT}Всего обработано DNS имен:{Style.RESET_ALL} {total_domains_processed[0]}")
|
dns_servers = await load_dns_servers(dns_db_url)
|
||||||
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-адресов в подсети
|
selected_dns_servers = check_dns_servers(dns_servers, dns_server_indices)
|
||||||
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)
|
include_cloudflare = check_include_cloudflare(cloudflare)
|
||||||
|
if include_cloudflare:
|
||||||
|
cloudflare_ips = await get_cloudflare_ips()
|
||||||
|
else:
|
||||||
|
cloudflare_ips = set()
|
||||||
|
|
||||||
if run_command:
|
unique_ips_all_services = set()
|
||||||
print("\nВыполнение команды после завершения скрипта...")
|
semaphore = init_semaphores(request_limit)
|
||||||
os.system(run_command)
|
|
||||||
else:
|
stats = {
|
||||||
print(f"\n{Style.BRIGHT}Результаты сохранены в файл:{Style.RESET_ALL}", filename)
|
'null_ips_count': 0,
|
||||||
if os.name == 'nt':
|
'cloudflare_ips_count': 0,
|
||||||
input(f"Нажмите {green('Enter')} для выхода...")
|
'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__":
|
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())
|
||||||
36
platformdb
36
platformdb
@@ -1,18 +1,24 @@
|
|||||||
Antifilter community edition: https://community.antifilter.download/list/domains.lst
|
Antifilter community edition: https://community.antifilter.download/list/domains.lst
|
||||||
Youtube: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-youtube.txt
|
ITDog Inside: https://raw.githubusercontent.com/itdoginfo/allow-domains/main/Russia/inside-raw.lst
|
||||||
Facebook: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-facebook.txt
|
ITDog Outside: https://raw.githubusercontent.com/itdoginfo/allow-domains/main/Russia/outside-raw.lst
|
||||||
Openai: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-openai.txt
|
Youtube: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-youtube.txt
|
||||||
Tik-Tok: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-tiktok.txt
|
Facebook: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-facebook.txt
|
||||||
Instagram: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-instagram.txt
|
Openai: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-openai.txt
|
||||||
Twitter: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-twitter.txt
|
Tik-Tok: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-tiktok.txt
|
||||||
Netflix: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-netflix.txt
|
Instagram: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-instagram.txt
|
||||||
Bing: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-bing.txt
|
Twitter: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-twitter.txt
|
||||||
Adobe: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-adobe.txt
|
Netflix: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-netflix.txt
|
||||||
Apple: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-apple.txt
|
Bing: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-bing.txt
|
||||||
Google: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-google.txt
|
Adobe: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-adobe.txt
|
||||||
Torrent Truckers: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-ttruckers.txt
|
Apple: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-apple.txt
|
||||||
Search engines: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-search-engines.txt
|
Google: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-google.txt
|
||||||
Github Copilot: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-github-сopilot.txt
|
Torrent Trackers: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-ttrackers.txt
|
||||||
Twitch: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-twitch.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
|
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
|
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
|
upload.adobe.io
|
||||||
user.adobe.io
|
user.adobe.io
|
||||||
watch.adobe.io
|
watch.adobe.io
|
||||||
web.adobe.io
|
web.adobe.io
|
||||||
www.adobe.com
|
|
||||||
@@ -1,211 +1,209 @@
|
|||||||
a.ns.apple.com,
|
a.ns.apple.com
|
||||||
ab.apple.com.akadns.net,
|
ab.apple.com.akadns.net
|
||||||
aidc.apple.com,
|
aidc.apple.com
|
||||||
albert.apple.com,
|
albert.apple.com
|
||||||
amp-api.apps.apple.com,
|
amp-api.apps.apple.com
|
||||||
amp-api.apps.apple.com.edgekey.net,
|
amp-api.apps.apple.com.edgekey.net
|
||||||
amp-api.books.apple.com.edgekey.net,
|
amp-api.books.apple.com.edgekey.net
|
||||||
amp-api.fitness.apple.com,
|
amp-api.fitness.apple.com
|
||||||
amp-api.media.apple.com,
|
amp-api.media.apple.com
|
||||||
amp-api.music.apple.com,
|
amp-api.music.apple.com
|
||||||
amp-api.podcasts.apple.com,
|
amp-api.podcasts.apple.com
|
||||||
amp-api.videos.apple.com,
|
amp-api.videos.apple.com
|
||||||
aod.itunes.apple.com,
|
aod.itunes.apple.com
|
||||||
api.apple-cloudkit.com,
|
api.apple-cloudkit.com
|
||||||
api.apple-cloudkit.fe.apple-dns.net,
|
api.apple-cloudkit.fe.apple-dns.net
|
||||||
api.apple-cloudkit.fe2.apple-dns.net,
|
api.apple-cloudkit.fe2.apple-dns.net
|
||||||
api.apps.apple.com,
|
api.apps.apple.com
|
||||||
api.smoot.apple.com,
|
api.smoot.apple.com
|
||||||
api-adservices.apple.com,
|
api-adservices.apple.com
|
||||||
apple.co,
|
apple.co
|
||||||
apple.com,
|
apple.com
|
||||||
apple.com.cn,
|
apple.com.cn
|
||||||
appleid.apple.com,
|
appleid.apple.com
|
||||||
appleid.cdn-apple.com,
|
appleid.cdn-apple.com
|
||||||
appleid.idms-apple.com,
|
appleid.idms-apple.com
|
||||||
apple-mapkit.com,
|
apple-mapkit.com
|
||||||
appleseedcdn.apple.com,
|
appleseedcdn.apple.com
|
||||||
apps.apple.com,
|
apps.apple.com
|
||||||
auth.itunes.apple.com,
|
auth.itunes.apple.com
|
||||||
ax.itunes.apple.com.edgesuite.net,
|
ax.itunes.apple.com.edgesuite.net
|
||||||
bag.itunes.apple.com,
|
bag.itunes.apple.com
|
||||||
bag-cdn.itunes-apple.com.akadns.net,
|
bag-cdn.itunes-apple.com.akadns.net
|
||||||
basejumper.apple.com,
|
basejumper.apple.com
|
||||||
bcrw.apple.com,
|
bcrw.apple.com
|
||||||
beta.music.apple.com.edgesuite.net,
|
beta.music.apple.com.edgesuite.net
|
||||||
big.itunes.apple.com,
|
big.itunes.apple.com
|
||||||
bookkeeper.itunes.apple.com,
|
bookkeeper.itunes.apple.com
|
||||||
books.apple.com.edgekey.net,
|
books.apple.com.edgekey.net
|
||||||
bpapi.apple.com,
|
bpapi.apple.com
|
||||||
buy.itunes.apple.com,
|
buy.itunes.apple.com
|
||||||
buylite.itunes.apple.com,
|
buylite.itunes.apple.com
|
||||||
c.apple.news,
|
c.apple.news
|
||||||
ca.iadsdk.apple.com,
|
ca.iadsdk.apple.com
|
||||||
captive.apple.com,
|
captive.apple.com
|
||||||
carrierbundle.itunes.apple.com,
|
carrierbundle.itunes.apple.com
|
||||||
cdn.apple.com.c.footprint.net,
|
cdn.apple.com.c.footprint.net
|
||||||
cdn.apple-cloudkit.com,
|
cdn.apple-cloudkit.com
|
||||||
cdn.apple-mapkit.com,
|
cdn.apple-mapkit.com
|
||||||
cdn-apple.com,
|
cdn-apple.com
|
||||||
cds.apple.com,
|
cds.apple.com
|
||||||
ce.apple-dns.net,
|
ce.apple-dns.net
|
||||||
certs.apple.com,
|
certs.apple.com
|
||||||
cf.iadsdk.apple.com,
|
cf.iadsdk.apple.com
|
||||||
challenge.gc.apple.com,
|
challenge.gc.apple.com
|
||||||
cl1.apple.com,
|
cl1.apple.com
|
||||||
cl2.apple.com,
|
cl2.apple.com
|
||||||
cl3.apple.com,
|
cl3.apple.com
|
||||||
cl4.apple.com,
|
cl4.apple.com
|
||||||
cl5.apple.com,
|
cl5.apple.com
|
||||||
classical.music.apple.com.edgesuite.net,
|
classical.music.apple.com.edgesuite.net
|
||||||
client-api.itunes.apple.com,
|
client-api.itunes.apple.com
|
||||||
clientflow.apple.com,
|
clientflow.apple.com
|
||||||
comm-cohort.ess.apple.com,
|
comm-cohort.ess.apple.com
|
||||||
communities.apple.com,
|
communities.apple.com
|
||||||
configuration.apple.com,
|
configuration.apple.com
|
||||||
courier-ab-vs.push.apple.com,
|
courier-ab-vs.push.apple.com
|
||||||
cssubmissions.apple.com,
|
cssubmissions.apple.com
|
||||||
cstat.cdn-apple.com,
|
cstat.cdn-apple.com
|
||||||
d.ns.apple.com,
|
d.ns.apple.com
|
||||||
dejavu.apple.com,
|
dejavu.apple.com
|
||||||
device-config.pcms.apple.com,
|
device-config.pcms.apple.com
|
||||||
discussions.apple.com.edgekey.net,
|
discussions.apple.com.edgekey.net
|
||||||
dns.apple.com,
|
dns.apple.com
|
||||||
docs-assets.developer.apple.com,
|
docs-assets.developer.apple.com
|
||||||
doh.dns.apple.com,
|
doh.dns.apple.com
|
||||||
downloaddispatch.itunes.apple.com,
|
downloaddispatch.itunes.apple.com
|
||||||
edge.apple,
|
edge.apple
|
||||||
entitlements.itunes.apple.com,
|
entitlements.itunes.apple.com
|
||||||
ess.apple.com,
|
ess.apple.com
|
||||||
euro.apple.com,
|
euro.apple.com
|
||||||
experiments.apple.com,
|
experiments.apple.com
|
||||||
fides-pol.apple.com,
|
fides-pol.apple.com
|
||||||
finance-app.itunes.apple.com,
|
finance-app.itunes.apple.com
|
||||||
forums.developer.apple.com,
|
forums.developer.apple.com
|
||||||
fpinit.itunes.apple.com,
|
fpinit.itunes.apple.com
|
||||||
friend.gc.apple.com,
|
friend.gc.apple.com
|
||||||
g.apple.com,
|
g.apple.com
|
||||||
gc.apple.com,
|
gc.apple.com
|
||||||
gdmf.apple.com,
|
gdmf.apple.com
|
||||||
genius-3.itunes.apple.com.edgekey.net,
|
genius-3.itunes.apple.com.edgekey.net
|
||||||
geo.itunes.apple.com,
|
geo.itunes.apple.com
|
||||||
gs.apple.com,
|
gs.apple.com
|
||||||
gsa.apple.com,
|
gsa.apple.com
|
||||||
gsas.apple.com,
|
gsas.apple.com
|
||||||
gs-loc.apple.com,
|
gs-loc.apple.com
|
||||||
gsp10-ssl.apple.com,
|
gsp10-ssl.apple.com
|
||||||
gsp36-ssl.ls.apple.com,
|
gsp36-ssl.ls.apple.com
|
||||||
gsp47-ssl.ls.apple.com,
|
gsp47-ssl.ls.apple.com
|
||||||
gsp51-ssl.ls.apple.com,
|
gsp51-ssl.ls.apple.com
|
||||||
gsp57-ssl-background.ls.apple.com,
|
gsp57-ssl-background.ls.apple.com
|
||||||
gsp64-ssl.ls.apple.com,
|
gsp64-ssl.ls.apple.com
|
||||||
gsp85-ssl.ls.apple.com,
|
gsp85-ssl.ls.apple.com
|
||||||
gspe11-ssl.ls.apple.com.edgekey.net,
|
gspe11-ssl.ls.apple.com.edgekey.net
|
||||||
gspe19-ssl.ls.apple.com,
|
gspe19-ssl.ls.apple.com
|
||||||
gspe21-ssl.ls.apple.com,
|
gspe21-ssl.ls.apple.com
|
||||||
gspe35-ssl.ls.apple.com,
|
gspe35-ssl.ls.apple.com
|
||||||
gspe72-ssl.ls.apple.com.akamaized.net,
|
gspe72-ssl.ls.apple.com.akamaized.net
|
||||||
guzzoni.apple.com,
|
guzzoni.apple.com
|
||||||
help.apple.com,
|
help.apple.com
|
||||||
hls-svod.itunes.apple.com,
|
hls-svod.itunes.apple.com
|
||||||
iadcontent.apple.com.edgekey.net,
|
iadcontent.apple.com.edgekey.net
|
||||||
iadsdk.apple.com,
|
iadsdk.apple.com
|
||||||
identity.apple.com,
|
identity.apple.com
|
||||||
inappcheck.itunes.apple.com,
|
inappcheck.itunes.apple.com
|
||||||
init.ess.apple.com,
|
init.ess.apple.com
|
||||||
init.gc.apple.com,
|
init.gc.apple.com
|
||||||
init.itunes.apple.com,
|
init.itunes.apple.com
|
||||||
init.push.apple.com,
|
init.push.apple.com
|
||||||
iphone-ld.apple.com,
|
iphone-ld.apple.com
|
||||||
iphonesubmissions.apple.com,
|
iphonesubmissions.apple.com
|
||||||
itunes.apple.com,
|
itunes.apple.com
|
||||||
js-cdn.music.apple.com,
|
js-cdn.music.apple.com
|
||||||
km.support.apple.com,
|
km.support.apple.com
|
||||||
kt-prod.ess.apple.com,
|
kt-prod.ess.apple.com
|
||||||
lcdn-locator.apple.com,
|
lcdn-locator.apple.com
|
||||||
librarydaap.itunes.apple.com,
|
librarydaap.itunes.apple.com
|
||||||
linkmaker.itunes.apple.com.edgekey.net,
|
linkmaker.itunes.apple.com.edgekey.net
|
||||||
lookup-api.apple.com,
|
lookup-api.apple.com
|
||||||
ls.apple.com,
|
ls.apple.com
|
||||||
ma-albert-prod.apple.com,
|
ma-albert-prod.apple.com
|
||||||
ma-sq-device.apple.com,
|
ma-sq-device.apple.com
|
||||||
me.apple-dns.net,
|
me.apple-dns.net
|
||||||
mesu.apple.com,
|
mesu.apple.com
|
||||||
ml.cdn-apple.com,
|
ml.cdn-apple.com
|
||||||
mobileapp.apple.com.edgekey.net,
|
mobileapp.apple.com.edgekey.net
|
||||||
musicstatus.itunes.apple.com,
|
musicstatus.itunes.apple.com
|
||||||
mzstorekit.itunes.apple.com,
|
mzstorekit.itunes.apple.com
|
||||||
nc-pod2-smp-device-asset.apple.com,
|
nc-pod2-smp-device-asset.apple.com
|
||||||
news-assets.apple.com,
|
news-assets.apple.com
|
||||||
news-client-search.apple.com,
|
news-client-search.apple.com
|
||||||
news-edge.apple.com,
|
news-edge.apple.com
|
||||||
news-events.apple.com,
|
news-events.apple.com
|
||||||
newsletter-edge.apple.com,
|
newsletter-edge.apple.com
|
||||||
northamerica-1.object-storage.apple.com,
|
northamerica-1.object-storage.apple.com
|
||||||
notes-analytics-events.apple.com,
|
notes-analytics-events.apple.com
|
||||||
ocsp.apple.com,
|
ocsp.apple.com
|
||||||
odr.itunes.apple.com,
|
odr.itunes.apple.com
|
||||||
ontology.health.apple.com,
|
ontology.health.apple.com
|
||||||
osxapps.itunes.apple.com,
|
osxapps.itunes.apple.com
|
||||||
p16-buy.itunes.apple.com,
|
p16-buy.itunes.apple.com
|
||||||
p24-buy.itunes.apple.com,
|
p24-buy.itunes.apple.com
|
||||||
p26-buy.itunes.apple.com,
|
p26-buy.itunes.apple.com
|
||||||
p50-buy.itunes.apple.com,
|
p50-buy.itunes.apple.com
|
||||||
p6-buy.itunes.apple.com,
|
p6-buy.itunes.apple.com
|
||||||
pancake.apple.com,
|
pancake.apple.com
|
||||||
partiality.itunes.apple.com,
|
partiality.itunes.apple.com
|
||||||
pba.apple.com,
|
pba.apple.com
|
||||||
pd.itunes.apple.com,
|
pd.itunes.apple.com
|
||||||
play.itunes.apple.com,
|
play.itunes.apple.com
|
||||||
podcasts.apple.com.edgekey.net,
|
podcasts.apple.com.edgekey.net
|
||||||
portal-repair-uat-apple.com,
|
portal-repair-uat-apple.com
|
||||||
profile.ess.apple.com,
|
profile.ess.apple.com
|
||||||
pr-pod1-smp-device-asset.apple.com,
|
pr-pod1-smp-device-asset.apple.com
|
||||||
publicassets.cdn-apple.com,
|
publicassets.cdn-apple.com
|
||||||
push.apple.com,
|
push.apple.com
|
||||||
query.ess.apple.com,
|
query.ess.apple.com
|
||||||
quid-apple.com,
|
quid-apple.com
|
||||||
radarsubmissions.apple.com,
|
radarsubmissions.apple.com
|
||||||
radio.itunes.apple.com,
|
radio.itunes.apple.com
|
||||||
rn-albert-prod.apple.com,
|
rn-albert-prod.apple.com
|
||||||
safebrowsing.apple,
|
safebrowsing.apple
|
||||||
safety-alert.apple.com,
|
safety-alert.apple.com
|
||||||
sandbox.itunes.apple.com,
|
sandbox.itunes.apple.com
|
||||||
sas.pcms.apple.com,
|
sas.pcms.apple.com
|
||||||
sb.music.apple.com,
|
sb.music.apple.com
|
||||||
se2.itunes.apple.com,
|
se2.itunes.apple.com
|
||||||
seed.siri.apple.com,
|
seed.siri.apple.com
|
||||||
sequoia.cdn-apple.com,
|
sequoia.cdn-apple.com
|
||||||
sf-api-token-service.itunes.apple.com,
|
sf-api-token-service.itunes.apple.com
|
||||||
sgp-albert-prod.apple.com,
|
sgp-albert-prod.apple.com
|
||||||
shazam-insights.cdn-apple.com,
|
shazam-insights.cdn-apple.com
|
||||||
shop-apple.com,
|
shop-apple.com
|
||||||
siri.apple.com,
|
siri.apple.com
|
||||||
smoot.apple.com,
|
smoot.apple.com
|
||||||
smp-device-content.apple.com,
|
smp-device-content.apple.com
|
||||||
speedysub.itunes.apple.com,
|
speedysub.itunes.apple.com
|
||||||
sps-media.apple.com,
|
sps-media.apple.com
|
||||||
static.cdn-apple.com.edgekey.net,
|
static.cdn-apple.com.edgekey.net
|
||||||
stats.gc.apple.com,
|
stats.gc.apple.com
|
||||||
stocks-data-service.apple.com,
|
stocks-data-service.apple.com
|
||||||
store.storeimages.cdn-apple.com.edgekey.net,
|
store.storeimages.cdn-apple.com.edgekey.net
|
||||||
streamingaudio.itunes.apple.com,
|
streamingaudio.itunes.apple.com
|
||||||
su.itunes.apple.com,
|
su.itunes.apple.com
|
||||||
support.apple.com,
|
support.apple.com
|
||||||
swscan.apple.com,
|
swscan.apple.com
|
||||||
sync.itunes.apple.com,
|
sync.itunes.apple.com
|
||||||
testflight.apple.com,
|
testflight.apple.com
|
||||||
time.apple.com,
|
time.apple.com
|
||||||
tr.iadsdk.apple.com,
|
tr.iadsdk.apple.com
|
||||||
unlinkability.apple.com,
|
unlinkability.apple.com
|
||||||
updates.cdn-apple.com,
|
updates.cdn-apple.com
|
||||||
upp.itunes.apple.com,
|
upp.itunes.apple.com
|
||||||
us-courier.push.apple.com,
|
us-courier.push.apple.com
|
||||||
use1-tdm-prod.apple.com,
|
use1-tdm-prod.apple.com
|
||||||
weather-data.apple.com,
|
weather-data.apple.com
|
||||||
websitereview.corp.apple.com,
|
websitereview.corp.apple.com
|
||||||
wps.apple.com,
|
wps.apple.com
|
||||||
wu.apple.com.akadns.net,
|
wu.apple.com.akadns.net
|
||||||
www.apple.com,
|
|
||||||
www.apple.com.cn,
|
|
||||||
xp.apple.com
|
xp.apple.com
|
||||||
|
|||||||
@@ -20,5 +20,4 @@ services.bingapis.com
|
|||||||
ssl.bing.com
|
ssl.bing.com
|
||||||
sydney.bing.com
|
sydney.bing.com
|
||||||
th.bing.com
|
th.bing.com
|
||||||
www.bing.com
|
|
||||||
www2.bing.com
|
www2.bing.com
|
||||||
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
|
cloud.google.com
|
||||||
gvt2.com
|
gvt2.com
|
||||||
gvt3.com
|
gvt3.com
|
||||||
google.ru
|
google.ru
|
||||||
www.google.com
|
|
||||||
@@ -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
|
carstagram.com
|
||||||
cdninstagram.com
|
|
||||||
chickstagram.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
|
ig.me
|
||||||
igcdn.com
|
|
||||||
igsonar.com
|
|
||||||
igtv.com
|
|
||||||
imstagram.com
|
imstagram.com
|
||||||
imtagram.com
|
imtagram.com
|
||||||
instaadder.com
|
instaadder.com
|
||||||
@@ -20,9 +79,82 @@ instagor.com
|
|||||||
instagram-brand.com
|
instagram-brand.com
|
||||||
instagram-engineering.com
|
instagram-engineering.com
|
||||||
instagram-help.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.com
|
||||||
instagram-press.net
|
instagram-press.net
|
||||||
|
instagram.c10r.instagram.com
|
||||||
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
|
instagramhashtags.net
|
||||||
instagramhilecim.com
|
instagramhilecim.com
|
||||||
instagramhilesi.org
|
instagramhilesi.org
|
||||||
@@ -42,9 +174,284 @@ instanttelegram.com
|
|||||||
instaplayer.net
|
instaplayer.net
|
||||||
instastyle.tv
|
instastyle.tv
|
||||||
instgram.com
|
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
|
oninstagram.com
|
||||||
online-instagram.com
|
online-instagram.com
|
||||||
onlineinstagram.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-instagram.net
|
||||||
|
web.facebook.com
|
||||||
|
wellbeing.instagram.com
|
||||||
|
www.ig.me
|
||||||
|
www.instagram.com
|
||||||
|
www.secure.instagram.com
|
||||||
wwwinstagram.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
|
||||||
|
|||||||
@@ -3,6 +3,27 @@ jb.gg
|
|||||||
myjetbrains.com
|
myjetbrains.com
|
||||||
jetbrains.com
|
jetbrains.com
|
||||||
intellij.net
|
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
|
academy.jetbrains.com
|
||||||
account.jetbrains.com
|
account.jetbrains.com
|
||||||
adobe.fls.jetbrains.com
|
adobe.fls.jetbrains.com
|
||||||
@@ -54,7 +75,6 @@ internship.jetbrains.com
|
|||||||
jb-team.fls.jetbrains.com
|
jb-team.fls.jetbrains.com
|
||||||
jbstats.jetbrains.com
|
jbstats.jetbrains.com
|
||||||
jetarchive.jetbrains.com
|
jetarchive.jetbrains.com
|
||||||
jetbrains.com
|
|
||||||
jetpeople.jetbrains.com
|
jetpeople.jetbrains.com
|
||||||
local.api.jetbrains.com
|
local.api.jetbrains.com
|
||||||
lp.jetbrains.com
|
lp.jetbrains.com
|
||||||
@@ -90,8 +110,7 @@ uploads.jetbrains.com
|
|||||||
uploads.services.jetbrains.com
|
uploads.services.jetbrains.com
|
||||||
upsource.jetbrains.com
|
upsource.jetbrains.com
|
||||||
view.datalore.jetbrains.com
|
view.datalore.jetbrains.com
|
||||||
www.jetbrains.com
|
onboard.jetbrains.com
|
||||||
www.onboard.jetbrains.com
|
|
||||||
youtube.master-zdchint.mau.jetbrains.com
|
youtube.master-zdchint.mau.jetbrains.com
|
||||||
youtube.staging-zdchint.mau.jetbrains.com
|
youtube.staging-zdchint.mau.jetbrains.com
|
||||||
zillow.fls.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
|
||||||
netflix.com.au
|
netflix.com.au
|
||||||
|
netflix.net
|
||||||
netflixdnstest1.com
|
netflixdnstest1.com
|
||||||
netflixdnstest10.com
|
netflixdnstest10.com
|
||||||
netflixdnstest2.com
|
netflixdnstest2.com
|
||||||
@@ -13,4 +793,163 @@ netflixdnstest8.com
|
|||||||
netflixdnstest9.com
|
netflixdnstest9.com
|
||||||
netflixinvestor.com
|
netflixinvestor.com
|
||||||
netflixstudios.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
|
||||||
|
|||||||
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
|
platform.openai.com
|
||||||
spinningup.openai.com
|
spinningup.openai.com
|
||||||
universe.openai.com
|
universe.openai.com
|
||||||
www.openai.com
|
|
||||||
chatgpt.com
|
chatgpt.com
|
||||||
@@ -1,9 +1,5 @@
|
|||||||
ya.ru
|
ya.ru
|
||||||
www.google.com
|
|
||||||
google.com
|
google.com
|
||||||
www.google.ru
|
|
||||||
google.ru
|
google.ru
|
||||||
www.bing.com
|
|
||||||
bing.com
|
bing.com
|
||||||
www.yahoo.com
|
|
||||||
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
@@ -23,4 +23,4 @@ us.tiktok.com
|
|||||||
verify-sg.tiktok.com
|
verify-sg.tiktok.com
|
||||||
v16-tiktokcdn-com.akamaized.net
|
v16-tiktokcdn-com.akamaized.net
|
||||||
v16-va.tiktokcdn.com
|
v16-va.tiktokcdn.com
|
||||||
mcs-va.tiktokv.com
|
mcs-va.tiktokv.com
|
||||||
@@ -20,7 +20,7 @@ thepirate-bay.org
|
|||||||
torrentgalaxy.to
|
torrentgalaxy.to
|
||||||
torrent-games.best
|
torrent-games.best
|
||||||
torrentz2eu.org
|
torrentz2eu.org
|
||||||
www.limetorrents.info
|
limetorrents.info
|
||||||
www.pirateproxy-bay.com
|
pirateproxy-bay.com
|
||||||
www.torlock.com
|
torlock.com
|
||||||
www.torrentdownloads.me
|
torrentdownloads.me
|
||||||
@@ -187,7 +187,6 @@ tst.twitch.tv
|
|||||||
ttv-redirect.m7g.twitch.tv
|
ttv-redirect.m7g.twitch.tv
|
||||||
tv.twitch.tv
|
tv.twitch.tv
|
||||||
tw.blog.twitch.tv
|
tw.blog.twitch.tv
|
||||||
twitch.tv
|
|
||||||
upload.twitch.tv
|
upload.twitch.tv
|
||||||
upload2.twitch.tv
|
upload2.twitch.tv
|
||||||
usher.twitch.tv
|
usher.twitch.tv
|
||||||
@@ -201,17 +200,7 @@ watch.twitch.tv
|
|||||||
webdisk.staging.twitch.tv
|
webdisk.staging.twitch.tv
|
||||||
wwq.rc.twitch.tv
|
wwq.rc.twitch.tv
|
||||||
www-origin-anycast.twitch.tv
|
www-origin-anycast.twitch.tv
|
||||||
www.cis.blog.twitch.tv
|
staging.twitch.tv
|
||||||
www.cp2.rc.twitch.tv
|
stash.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
|
|
||||||
zh-cn.twitch.tv
|
zh-cn.twitch.tv
|
||||||
zh-tw.twitch.tv
|
zh-tw.twitch.tv
|
||||||
@@ -43,18 +43,12 @@ api-44-0-0.twitter.com
|
|||||||
api-45-0-0.twitter.com
|
api-45-0-0.twitter.com
|
||||||
api-46-0-0.twitter.com
|
api-46-0-0.twitter.com
|
||||||
api-stream.twitter.com
|
api-stream.twitter.com
|
||||||
cdn.syndication.twimg.com
|
|
||||||
dc-api.twitter.com
|
dc-api.twitter.com
|
||||||
pbs.twimg.com
|
|
||||||
pbs.twimg.com.akamaized.net
|
|
||||||
pbs-ak.twimg.com
|
|
||||||
platform.twitter.com
|
platform.twitter.com
|
||||||
s.twitter.com
|
s.twitter.com
|
||||||
syndication.twitter.com
|
syndication.twitter.com
|
||||||
t.co
|
|
||||||
ton.twitter.com
|
ton.twitter.com
|
||||||
twitter.com
|
x.com
|
||||||
tweetdeck.com
|
abs.twimg.com
|
||||||
twimg.com
|
abs-0.twimg.com
|
||||||
video.twimg.com
|
pscp.tv
|
||||||
x.com
|
|
||||||
|
|||||||
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
@@ -1,6 +1,8 @@
|
|||||||
# Вспомогательные утилиты:
|
# Вспомогательные утилиты:
|
||||||
- [subdomain - поиск субдоменов](#subdomain)
|
- [subdomain - поиск субдоменов](#subdomain)
|
||||||
- [verified - проверка активности доменов](#verified)
|
- [verified - проверка активности доменов](#verified)
|
||||||
|
- [convert - конвертер маршрутов](#convert)
|
||||||
|
- [split - разбить список на файлы по 1000 строк](#split)
|
||||||
|
|
||||||
## subdomain
|
## subdomain
|
||||||
|
|
||||||
@@ -9,12 +11,13 @@
|
|||||||
|
|
||||||
### Функции
|
### Функции
|
||||||
|
|
||||||
- Загружает страницу по указанному URL и извлекает домены из таблиц, где тип записи равен "A". Пытается повторить запрос до 5 раз в случае ошибки или отсутствия данных.
|
- Загружает страницу по указанному URL и извлекает субдомены из таблиц, где тип записи равен "A".
|
||||||
- Отправляет запросы к страницам, начиная с первой, и обрабатывает до трех страниц одновременно. Останавливается, если данные на последних трех страницах одинаковы или если три страницы подряд пустые.
|
- Пытается повторить запрос до 3х раз в случае ошибки или отсутствия данных.
|
||||||
|
- Останавливается, если данные на последних трех страницах одинаковы или если три страницы подряд пустые.
|
||||||
|
|
||||||
### Использование
|
### Использование
|
||||||
|
|
||||||
1. Установите зависимости:
|
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
@@ -41,12 +44,12 @@
|
|||||||
### Функции
|
### Функции
|
||||||
|
|
||||||
- Проверяет домены используя DNS-серверы: Google Public DNS, Cloudflare DNS и Yandex. Пул потоков ограничен 40 рабочими потоками.
|
- Проверяет домены используя DNS-серверы: Google Public DNS, Cloudflare DNS и Yandex. Пул потоков ограничен 40 рабочими потоками.
|
||||||
- Возвращает статус домена (делегирован, припаркован/неактивен) или ошибку.
|
- Возвращает статус домена: делегирован, припаркован/неактивен или ошибку.
|
||||||
- Если статус домена не был подтвержден как делегированный проводит его контрольную проверку.
|
- Если статус домена не был подтвержден как делегированный проводит его контрольную проверку.
|
||||||
|
|
||||||
### Использование
|
### Использование
|
||||||
|
|
||||||
1. Установите зависимости:
|
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
@@ -61,3 +64,75 @@
|
|||||||
```
|
```
|
||||||
|
|
||||||
4. Скрипт проверит домены и сохранит результат в файл `verified_domains.txt`.
|
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)
|
||||||
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