188 Commits

Author SHA1 Message Date
Ground-Zerro
b8ec267ae3 Merge branch 'main' of https://github.com/Ground-Zerro/DomainMapper 2025-10-29 20:29:11 +11:00
Ground-Zerro
dca5e107b4 Update dns-youtube.txt 2025-10-29 20:29:06 +11:00
Ground-Zerro
02970393f6 Merge pull request #102 from MysticalHeat/main
SyntaxError: f-string expression part cannot include a backslash
2025-10-07 20:44:20 +11:00
Ilya
4251bd3e3c Update main.py 2025-10-07 01:03:54 +03:00
Ilya
60dc6d7ae1 Update main.py 2025-10-07 01:02:52 +03:00
Ilya
4568e426a7 Update main.py 2025-10-07 00:57:40 +03:00
Ground-Zerro
d673d30498 Add files via upload 2025-10-06 11:10:21 +11:00
Ground-Zerro
8b25b5c28e Delete Win.bat 2025-10-06 11:09:20 +11:00
Ground-Zerro
0921e326f4 Update Win.bat 2025-10-06 11:07:39 +11:00
Ground-Zerro
527cc4aae8 Update Win.bat 2025-10-06 11:05:34 +11:00
Ground-Zerro
a527bf8f8a Merge branch 'main' of https://github.com/Ground-Zerro/DomainMapper 2025-10-06 11:04:28 +11:00
Ground-Zerro
27d525ae60 Create .gitattributes 2025-10-06 11:03:54 +11:00
Ground-Zerro
c631c4cf44 Add files via upload 2025-10-06 11:00:34 +11:00
Ground-Zerro
03c18c52fc Update Win.bat 2025-10-06 10:52:34 +11:00
Ground-Zerro
7b3190a00a Update Win.bat 2025-10-06 10:51:51 +11:00
Ground-Zerro
b5f8aeb65f Delete main.py 2025-10-03 12:53:59 +11:00
Ground-Zerro
bba8015ae5 Update README.md 2025-10-03 12:48:30 +11:00
Ground-Zerro
94b523c85f Create main.py 2025-10-03 12:46:58 +11:00
Ground-Zerro
78f2bf93e8 Create config.ini 2025-10-03 12:43:46 +11:00
Ground-Zerro
ff0e50f790 Delete .gitignore 2025-10-03 12:43:44 +11:00
Ground-Zerro
f937106d52 Update convert.bat 2025-10-03 12:42:06 +11:00
Ground-Zerro
a6caea23e3 Update .gitignore 2025-10-03 12:41:38 +11:00
Ground-Zerro
535f01a2c0 Update convert.bat 2025-10-03 12:37:38 +11:00
Ground-Zerro
1a8476a1e5 Update Win.bat 2025-10-03 12:20:12 +11:00
Ground-Zerro
92b70ea00e Create README.md 2025-10-03 12:20:09 +11:00
Ground-Zerro
9219ba8edb Update dns-windsurf.txt 2025-09-29 23:25:44 +11:00
Ground-Zerro
83eee42275 Create main.py 2025-09-25 21:29:40 +11:00
Ground-Zerro
e449c45fa9 Delete main-old.py 2025-09-25 21:29:38 +11:00
Ground-Zerro
723144ce41 Delete config-old.ini 2025-09-25 21:29:35 +11:00
Ground-Zerro
f6fccaf791 Create convert.bat 2025-09-25 20:13:14 +11:00
Ground-Zerro
b77daee426 Update README.md 2025-09-07 12:22:05 +11:00
Ground-Zerro
980ec67d2f Update README.md 2025-09-07 12:17:31 +11:00
Ground-Zerro
4a0acfa4ae Update README.md 2025-09-07 12:16:34 +11:00
Ground-Zerro
9b91d6f9df Create split.py 2025-09-07 12:16:32 +11:00
Ground-Zerro
55d9b424d2 Update platformdb 2025-09-04 03:02:29 +11:00
Ground-Zerro
1f07c468a2 Create dns-windsurf.txt 2025-09-04 03:01:26 +11:00
Ground-Zerro
dd21223b61 update 2025-09-04 01:59:41 +11:00
Ground-Zerro
1834ffee26 Update dns-onlinetheater.txt 2025-06-22 12:57:18 +11:00
Ground-Zerro
9085e59067 Update dns-onlinetheater.txt 2025-06-22 12:52:32 +11:00
Ground-Zerro
d8945f1ecf Merge branch 'main' of https://github.com/Ground-Zerro/DomainMapper 2025-05-12 23:37:17 +11:00
Ground-Zerro
bed4db1926 Update dns-facebook.txt 2025-05-12 23:37:15 +11:00
Ground-Zerro
21c77cc79d Merge pull request #88 from cjmaxik/patch-1
Add `pscp.tv` to Twitter
2025-04-09 11:16:32 +11:00
CJMAXiK
15599dffa0 Add pscp.tv to Twitter
`pscp.tv` (old Periscope) runs Spaces on Twitter.
2025-04-07 21:24:44 +03:00
Ground-Zerro
0654f45125 Merge branch 'main' of https://github.com/Ground-Zerro/DomainMapper 2025-03-29 19:57:46 +11:00
Ground-Zerro
d638d707de Update dns-onlinetheater.txt 2025-03-29 19:57:44 +11:00
Ground-Zerro
4d894d7fa4 Update dns record for GitHub Copilot (#84)
* Added .gitignore

* Update dns-github-pilot.txt
2025-03-11 22:19:38 +11:00
Erilov Nikita
30f596b74a Update dns-github-pilot.txt 2025-03-06 17:15:44 +04:00
Erilov Nikita
89c390a887 Added .gitignore 2025-03-06 17:12:27 +04:00
Ground-Zerro
8df4921e5c Update dns-instagram.txt 2025-02-05 09:51:42 +11:00
Ground-Zerro
09866c704b Update dns-instagram.txt 2025-02-05 09:43:17 +11:00
Ground-Zerro
94a09b4670 Update config.ini 2025-02-04 17:03:18 +11:00
Ground-Zerro
46565ce2ab Update README.md 2025-02-04 17:02:03 +11:00
Ground-Zerro
a15aba7963 Update platformdb 2025-02-04 16:59:20 +11:00
Ground-Zerro
fbe369f62d Add files via upload 2025-02-04 16:56:52 +11:00
Ground-Zerro
675ca12691 Update dns-xbox.txt 2025-02-04 09:43:35 +11:00
Ground-Zerro
80a4a40bfc Update dns-netflix.txt 2025-02-04 09:39:20 +11:00
Roman
29763414d6 More domains are required for Copilot. Taken from https://docs.github.com/en/copilot/managing-copilot/managing-github-copilot-in-your-organization/configuring-your-proxy-server-or-firewall-for-copilot (#79) 2025-02-01 02:57:41 +11:00
Ground-Zerro
3f64f5ab8f Update disneyplus_notfull.txt 2025-01-28 22:31:07 +11:00
Ground-Zerro
6d75bcb5fa на будущее 2025-01-28 22:19:46 +11:00
Ground-Zerro
c5cb415a7d add Telegram 2025-01-26 22:01:40 +11:00
Ground-Zerro
ba72a0460e Update dns-telegram.txt 2025-01-26 21:58:48 +11:00
Ground-Zerro
98e7df3e14 Create dns-telegram.txt 2025-01-26 21:24:11 +11:00
Ground-Zerro
71b6159536 update 2025-01-26 13:32:49 +11:00
Ground-Zerro
cffef549c4 Update dns-discord.txt 2025-01-20 09:36:48 +11:00
Ground-Zerro
122a6701ad Update dns-discord.txt 2025-01-20 09:29:49 +11:00
Ground-Zerro
d1582c7fc8 Update dns-discord.txt 2025-01-20 09:15:35 +11:00
Ground-Zerro
3a264b3cf9 spelling error 2025-01-19 23:50:46 +11:00
Ground-Zerro
6bb9b4eef9 Update platformdb 2025-01-19 23:03:12 +11:00
Ground-Zerro
804c71a013 Update platformdb 2025-01-19 22:52:02 +11:00
Ground-Zerro
559194db07 Merge branch 'main' of https://github.com/Ground-Zerro/DomainMapper 2025-01-19 22:44:41 +11:00
Ground-Zerro
a4e0ac2d22 spelling error 2025-01-19 22:44:38 +11:00
Ground-Zerro
6d7729e0f4 Update dns-apple.txt
Что там делали запятые?!
2025-01-14 09:38:28 +11:00
Ground-Zerro
3e281539db update 2025-01-11 13:22:32 +11:00
Ground-Zerro
749f2c8327 Update dns-youtube.txt 2025-01-11 13:01:36 +11:00
Ground-Zerro
de091d2e6e Update platformdb 2025-01-11 11:51:41 +11:00
Ground-Zerro
165cc69889 dns-github-pilot 2025-01-11 11:50:54 +11:00
Ground-Zerro
d0ed146bf0 Update platformdb 2025-01-11 11:49:15 +11:00
Ground-Zerro
b0f9dab1d5 Update platformdb 2025-01-11 11:47:19 +11:00
Ground-Zerro
4ae22f7163 Update platformdb 2025-01-11 11:46:23 +11:00
Ground-Zerro
083502b3e6 update 2025-01-11 11:42:05 +11:00
Ground-Zerro
b45de91236 orthography 2025-01-11 11:41:57 +11:00
Ground-Zerro
80b8f0e42d Update web_install.sh 2025-01-08 18:56:19 +11:00
Ground-Zerro
3f640db79d Update web_install.sh 2025-01-01 17:42:10 +11:00
Ground-Zerro
fdc4968ba6 Update web_install.sh 2025-01-01 17:20:59 +11:00
Ground-Zerro
b2f90fe690 Update web_install.sh 2025-01-01 17:10:27 +11:00
Ground-Zerro
310c43be95 Update app.py 2025-01-01 17:10:25 +11:00
Ground-Zerro
df0c74deb9 up 2025-01-01 13:19:34 +11:00
Ground-Zerro
5ef44a1f17 Update web_install.sh 2025-01-01 12:59:49 +11:00
Ground-Zerro
c46f7a8f33 up 2025-01-01 12:43:39 +11:00
Ground-Zerro
7b8b594eaf up 2025-01-01 12:21:09 +11:00
Ground-Zerro
bb44ee2f51 Update index.html 2024-12-31 20:04:03 +11:00
Ground-Zerro
7f0dceb632 up 2024-12-31 20:01:03 +11:00
Ground-Zerro
43d7a85913 Update index.html 2024-12-31 19:46:17 +11:00
Ground-Zerro
f09e1175e9 Update README.md 2024-12-31 19:12:32 +11:00
Ground-Zerro
c299efc6bf web 2024-12-31 19:07:12 +11:00
Ground-Zerro
4474a7ef8d Update dns-discord.txt 2024-12-30 02:32:22 +11:00
Ground-Zerro
9d9c6a5806 Update dns-xbox.txt 2024-12-28 15:27:19 +11:00
Ground-Zerro
f0915de5fb Update dns-xbox.txt 2024-12-28 15:19:12 +11:00
Ground-Zerro
bba67b421f Update dns-discord.txt 2024-12-28 14:57:03 +11:00
Ground-Zerro
cbebcdb522 Merge pull request #70 from L2jLiga/patch-1
Update dns-youtube.txt
2024-12-27 09:06:57 +11:00
Andrey Chalkin
5c6c2a3f8c удалены дубликаты
Один и тот же сервер гугла имеет несколько доменов в следующих форматах:
- rr8---sn-5oxmp55u-8pxe.googlevideo.com
- rr8.sn-5oxmp55u-8pxe.googlevideo.com
- rr8.sn-5oxmp55u-8pxe.c.youtube.com
- rr8---sn-5oxmp55u-8pxe.c.youtube.com

Форматов может быть и больше , но пока встречался с такими
2024-12-26 19:58:07 +03:00
Andrey Chalkin
2be0d6be75 Update dns-youtube.txt 2024-12-26 19:48:58 +03:00
Andrey Chalkin
d74be5cc50 Update dns-youtube.txt 2024-12-26 19:46:01 +03:00
Ground-Zerro
e25a1119e4 Merge pull request #68 from nmakeev/bugfix/fix_charmap_codec_error
Fixed charmap codec error
2024-12-24 22:12:52 +11:00
Nikita Makeev
30f46bdc5d Fixed charmap codec error 2024-12-24 09:57:33 +03:00
Ground-Zerro
b671c670ce instagram 2024-12-15 04:42:45 +11:00
Ground-Zerro
d59374bc38 Update dm-docker.sh 2024-12-13 18:26:52 +11:00
Ground-Zerro
96a6800f9f Update dm-docker.sh 2024-12-13 18:20:56 +11:00
Ground-Zerro
ff34677dc8 Update dm-docker.sh 2024-12-13 18:10:16 +11:00
Ground-Zerro
ff378007ad Update dm-docker.sh 2024-12-13 17:42:51 +11:00
Ground-Zerro
151897083d Update dm-docker.sh 2024-12-13 17:40:05 +11:00
Ground-Zerro
b85b0287dd Update dm-docker.sh 2024-12-13 17:26:36 +11:00
Ground-Zerro
6d15e0d508 Update dm-docker.sh 2024-12-13 17:23:13 +11:00
Ground-Zerro
908ae1cc61 xBox 2024-12-10 20:50:23 +11:00
Ground-Zerro
3981241720 xBox 2024-12-10 19:59:04 +11:00
Ground-Zerro
336d64777a Update dm-docker.sh 2024-12-01 21:30:19 +11:00
Ground-Zerro
a89ac22e86 Update dm-docker.sh 2024-12-01 20:12:57 +11:00
Ground-Zerro
cecef30c58 Update dm-docker.sh 2024-12-01 20:08:30 +11:00
Ground-Zerro
fd5e408100 Update README.md 2024-12-01 18:47:41 +11:00
Ground-Zerro
676e76ab9d docker 2024-12-01 17:26:56 +11:00
Ground-Zerro
a298294f3e Update dns-youtube.txt 2024-11-14 09:31:18 +11:00
Ground-Zerro
87ca85ad23 Update dns-youtube.txt 2024-11-14 09:08:45 +11:00
Ground-Zerro
fc2377c097 Update README.md 2024-11-13 22:30:00 +11:00
Ground-Zerro
3bf41ae20d Update config.ini 2024-11-13 10:30:05 +11:00
Ground-Zerro
99f5ec19dc Merge pull request #57 from Vlad15lav/fix_syntax_error
fix SyntaxError
2024-11-13 10:25:02 +11:00
Ground-Zerro
3e7161190e Fix add @Vlad15lav 2024-11-13 10:16:51 +11:00
Vlad15lav
9ad361ae8e fix SyntaxError 2024-11-12 23:03:17 +03:00
Ground-Zerro
4e33e6d31d Update README.md 2024-11-10 13:05:04 +11:00
Ground-Zerro
4f9d3dc5ec update
Комментарий для mikrotik по умолчанию выключен, вернуть его можно только при локальном запуске `main.py` при наличии рядом с ним `config.ini` с опцией `mk_comment = on`
2024-11-10 12:47:16 +11:00
Ground-Zerro
0df8cdc8e8 Update convert.py 2024-11-10 12:07:58 +11:00
Ground-Zerro
9891a874df Update main.py 2024-11-10 11:57:45 +11:00
Ground-Zerro
e33ff83da4 Update main.py 2024-11-10 11:45:43 +11:00
Ground-Zerro
c77fe5e250 Update README.md 2024-11-10 11:09:23 +11:00
Ground-Zerro
4c0eb40d17 Update README.md 2024-11-10 11:08:29 +11:00
Ground-Zerro
919d53b458 Update README.md 2024-11-10 11:07:42 +11:00
Ground-Zerro
00f72e5690 add mikrotik comment="" option 2024-11-10 10:53:02 +11:00
Ground-Zerro
ebc21747a6 Update main.py 2024-11-09 16:23:23 +11:00
Ground-Zerro
6750b06eb8 Merge pull request #52 from DanzoGit/main
Убрал дубликаты и добавил 2 новых хоста для твиттера
2024-11-03 17:08:27 +11:00
DanzoGit
eb415925ab Отсеял хосты, начинающиеся с www. 2024-11-03 12:43:39 +08:00
DanzoGit
48c15018c9 Убрал дубликаты и добавил 2 новых хоста 2024-11-03 12:31:56 +08:00
Ground-Zerro
870a805d96 Update README.md 2024-10-30 17:57:22 +11:00
Ground-Zerro
bd601b3b0f Update dns-jetbrains.txt 2024-10-27 15:36:53 +11:00
Ground-Zerro
095cee5d09 update 2024-10-16 23:45:41 +11:00
Ground-Zerro
886ab88a1c Update README.md 2024-10-16 00:37:56 +11:00
Ground-Zerro
1ec006a4a7 Update README.md 2024-10-16 00:36:10 +11:00
Ground-Zerro
62093763ff добавлен конвертер форматов маршрутов 2024-10-16 00:32:09 +11:00
Ground-Zerro
8e4d3e3348 Update README.md 2024-10-15 23:31:14 +11:00
Ground-Zerro
b88b1505ab Update README.md 2024-10-15 23:29:20 +11:00
Ground-Zerro
47184b4128 Update README.md 2024-10-15 20:12:11 +11:00
Ground-Zerro
423d402f98 Merge branch 'main' of https://github.com/Ground-Zerro/DomainMapper 2024-10-15 13:40:29 +11:00
Ground-Zerro
ebb5a405db Delete requirements.txt 2024-10-15 13:40:13 +11:00
Ground-Zerro
e9a6930711 Merge pull request #41 from SocketSomeone/patch-1
Update dns-tiktok.txt
2024-10-10 22:04:56 +11:00
Ground-Zerro
a332a2c3a5 add Jetbrains 2024-10-10 15:35:50 +11:00
Ground-Zerro
c74bbc6e97 Update subdomain.py
Многопоточность убрана.  Сайт критически воспринимает множественные обращения от одного хоста и начинает выдавать страницы с пустыми субдоменами.
2024-10-10 14:36:50 +11:00
Ground-Zerro
6283d2d872 add Jetbrains service 2024-10-10 14:23:53 +11:00
Ground-Zerro
42856a4b31 add Jetbrains 2024-10-10 14:22:17 +11:00
Ground-Zerro
496454eb03 add Jetbrains 2024-10-10 14:21:43 +11:00
Ground-Zerro
e3794dff97 add jetbrains service 2024-10-10 14:20:36 +11:00
Alexey Filippov
966e996160 Update dns-tiktok.txt 2024-10-10 05:47:18 +03:00
Ground-Zerro
ae95c589bb ADD discord voice domains
RAW Link to source https://gitlab.com/GhostRooter0953/discord-voice-ips/-/raw/main/discord-voice-domains-list?ref_type=heads
2024-10-09 14:36:19 +11:00
Ground-Zerro
1193ae11a5 add Discord DNS list 2024-10-09 10:54:44 +11:00
Ground-Zerro
31eeb55792 add Discord DNS list 2024-10-09 10:53:53 +11:00
Ground-Zerro
eb234e261b add Discord DNS list 2024-10-09 10:51:39 +11:00
Ground-Zerro
567bef6a58 discord DNS names 2024-10-09 10:50:24 +11:00
Ground-Zerro
db6c7fd811 solutions @WonderCRM 2024-10-05 13:13:38 +11:00
Ground-Zerro
dfe73df66a Create dns-num.txt 2024-09-24 22:47:48 +11:00
Ground-Zerro
7cc7815fb3 /24 + /32 mix mode 2024-09-24 22:46:52 +11:00
Ground-Zerro
cd060dcee3 Update README.md 2024-09-19 23:27:03 +11:00
Ground-Zerro
eba22848ee Update Win.bat 2024-09-19 01:53:32 +11:00
Ground-Zerro
0edc4b5193 Update requirements.txt 2024-09-19 01:27:32 +11:00
Ground-Zerro
906e95cbc4 Update main.py 2024-09-19 01:26:31 +11:00
Ground-Zerro
41b2d62647 Update README.md 2024-09-19 01:22:16 +11:00
Ground-Zerro
67ab4758ed Update README.md 2024-09-19 01:15:36 +11:00
Ground-Zerro
7b51669140 Update README.md 2024-09-19 01:08:00 +11:00
Ground-Zerro
471400e27f Update README.md 2024-09-19 01:01:57 +11:00
Ground-Zerro
e8f1f58474 Update README.md 2024-09-19 00:56:44 +11:00
Ground-Zerro
ec2bc3eeb3 Update README.md 2024-09-19 00:54:03 +11:00
Ground-Zerro
ed4b35dbd6 Update README.md 2024-09-19 00:50:10 +11:00
Ground-Zerro
80c6106aa1 Update README.md 2024-09-19 00:48:49 +11:00
Ground-Zerro
854d559f59 Update README.md 2024-09-19 00:46:54 +11:00
Ground-Zerro
8a46dce764 Update README.md 2024-09-19 00:43:08 +11:00
Ground-Zerro
1979b77567 Update README.md 2024-09-19 00:38:38 +11:00
Ground-Zerro
1c333426b4 Update README.md 2024-09-18 23:40:19 +11:00
Ground-Zerro
9ee7ae7e0d Update README.md 2024-09-18 23:29:57 +11:00
Ground-Zerro
9890368164 Update README.md 2024-09-18 23:29:06 +11:00
Ground-Zerro
9ce98ce052 Update README.md 2024-09-18 23:26:06 +11:00
Ground-Zerro
0bf247a225 Update README.md 2024-09-18 23:12:47 +11:00
Ground-Zerro
4291f321f5 local mode 2024-09-17 01:28:15 +11:00
48 changed files with 36303 additions and 1829 deletions

3
.gitattributes vendored Normal file
View File

@@ -0,0 +1,3 @@
* text=auto
*.bat text eol=crlf
*.cmd text eol=crlf

209
README.md
View File

@@ -1,10 +1,42 @@
## Domain Mapper
<details>
<summary>Что нового (нажать, чтобы открыть)</summary>
- Keenetic BAT формат сохранения. Небольшие изменения в интерфейсе. Некоторые доработки/улучшения.
- Доабвлены некоторые [оналйн кинотеатры](https://github.com/Ground-Zerro/DomainMapper/blob/main/platforms/dns-onlinetheater.txt). Запрос @Andrey_schumacher
- Добавлены списки от [ITDog](https://t.me/itdoginfo/36).
- Добавлен сервис xBox. Запрос @Deni5c
- Запуск в докере. Запрос [Запрос @andrejs82git](https://github.com/Ground-Zerro/DomainMapper/issues/21), [Реализация @MrEagle123](https://github.com/Ground-Zerro/DomainMapper/issues/21#issuecomment-2509565392)
- Опция в config.ini: не добавлять comment="%SERVICE_NAME%" при сохранении IP-адресов в mikrotik формате. [Запрос @ITNetSystem](https://github.com/Ground-Zerro/DomainMapper/issues/45)
- Изменена кодиовка файла результатов на UTF-8 без BOM. [Запрос @Savanture](https://github.com/Ground-Zerro/DomainMapper/issues/54)
- [Конвертер маршутов](https://github.com/Ground-Zerro/DomainMapper/tree/main/utilities) как отдельная утилита. [Запрос @Andrey999r](https://github.com/Ground-Zerro/DomainMapper/discussions/43)
- Добавлен сервис Jetbrains. [Запрос @SocketSomeone](https://github.com/Ground-Zerro/DomainMapper/issues/40)
- Добавлен сервис Discord. [Запрос @AHuMex](https://github.com/Ground-Zerro/DomainMapper/issues/38)
- [Комбинированный режим объединения IP-адресов в подсеть.](https://github.com/Ground-Zerro/DomainMapper/issues/36)
- Возможность загрузки списков сервисов и DNS-серверов из локального файла. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/26)
- Вспомагательные [утилиты](https://github.com/Ground-Zerro/DomainMapper/tree/main/utilities) для поиска субдоменов.
- Добавлен сервис Twitch. [Запрос @shevernitskiy](https://github.com/Ground-Zerro/DomainMapper/issues/31)
- Добавлен Yandex DNS сервер. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/26)
- Опция в config.ini: Отключить отображение сведений о загруженой конфигурации.
- Передача имени конфигурационного файла ключом в терминале/командной строке. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/25)
- Добавлен сервис Github Copilot. [Запрос @aspirisen](https://github.com/Ground-Zerro/DomainMapper/issues/23)
- Keenetic CLI формат сохранения. [Запрос @vchikalkin](https://github.com/Ground-Zerro/DomainMapper/pull/20)
- Wireguard формат сохранения. [Запрос @sanikroot](https://github.com/Ground-Zerro/DomainMapper/issues/18)
- Агрегация маршрутов до /24, /16. [Запрос @sergeeximius](https://github.com/Ground-Zerro/DomainMapper/issues/8)
- OVPN формат сохранения. [Запрос @SonyLo](https://github.com/Ground-Zerro/DomainMapper/pull/13)
- Mikrotik формат сохранения. [Запрос @Shaman2010](https://github.com/Ground-Zerro/DomainMapper/pull/9)
</details>
**Описание:** Инструмент на языке Python, предназначенный для разрешения DNS имен популярных веб-сервисов в IP-адреса.
Имеется поддержка следующих сервисов:
<details>
<summary>Поддерживаемые сервисы (нажать, чтобы открыть)</summary>
- [Antifilter - community edition](https://community.antifilter.download/)
- [ITDog Inside](https://github.com/itdoginfo/allow-domains)
- [ITDog Outside](https://github.com/itdoginfo/allow-domains)
- Youtube
- Facebook
- Openai
@@ -16,68 +48,131 @@
- Adobe
- Apple
- Google
- Torrent Truckers
- Torrent Trackers
- Search engines
- [Github сopilot](https://github.com/features/copilot)
- Twitch
- Discord
- Jetbrains
- Xbox
- Telegram
- Личный список
**Функции:**
- Скрипт использует списки доменных имен популярных сервисов и разрешает их в IP-адреса.
- Итоговый список содержит только уникальные IP-адреса исключая дубликаты, также фильтруются IP-адреса самих DNS-серверов, заглушки в виде редиректа на localhost и (по желанию) IP-адреса Cloudflare.
- Выбор между системным DNS сервером, популярными публичными, либо их комбинации.
- Разрешение DNS имени происходит используя каждый из указанных пользователем DNS серверов и не останавливается при первом же успешном получении его IP-адреса.
- Пользователь может создать свой список с DNS именами, необходимыми лично ему.
- Агрегация маршрутов до /16 (255.255.0.0), /24 (255.255.255.0).
**Автоматизация:**
Конфигурационный файл позволяет настроить работу скрипта в "молчаливом" режиме - без промтов к пользователю.
Так же в конфигурационном файле можно добавить выполнение кастомной команды в консоли для запуска другого скрипта или программы при завершении его работы.
**Зависимости:** Для работы Domain Mapper необходимо наличие следующих библиотек Python:
- configparser, ipaddress, dnspython, httpx, colorama.
*Не забудьте установить их перед запуском:*
```
pip3 install -r requirements.txt
```
**Использование:**
- Запустить с помощью Python. Для работы необходим только "main.py" и (по желанию) файл "config.ini".
**Работа с личным списком DNS:**
- Создать файл "custom-dns-list.txt", записать в него DNS имена (одна строчка - одно имя) и положить рядом со скриптом. Список будет подхвачен при запуске и отображен в меню как "Custom DNS list".
**Использование скрипта с кастомным конфигурационным файлом**
- Можно передавать путь к конфигурационному файлу при запуске скрипта с помощью опции `-c` (или `--config`). Если параметр не указан, по умолчанию будет использоваться файл config.ini.
Пример использования: `main.py -с myconfig.ini` или `python main.py -с config2.ini` или `main.py -с srv5.ini` и т.п.
**Кто не знает "как", но кому "очень нужно":**
- Загляните в директорию "Windows" репозитория.
<details>
<summary>Что нового</summary>
- Вспомагательные [утилиты](https://github.com/Ground-Zerro/DomainMapper/tree/main/utilities) для поиска субдоменов.
- Добавлен сервис Twitch. [Запрос @shevernitskiy](https://github.com/Ground-Zerro/DomainMapper/issues/31)
- Добавлен Yandex DNS сервер. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/26)
- Опция в config.ini: Отключить отображение сведений о загруженой конфигурации.
- Кастомное имя конфигурационного файла. [Запрос @Noksa](https://github.com/Ground-Zerro/DomainMapper/issues/25)
- Добавлен сервис Github Copilot. [Запрос @aspirisen](https://github.com/Ground-Zerro/DomainMapper/issues/23)
- Keenetic CLI формат сохранения. [Запрос @vchikalkin](https://github.com/Ground-Zerro/DomainMapper/pull/20)
- Wireguard формат сохранения. [Запрос @sanikroot](https://github.com/Ground-Zerro/DomainMapper/issues/18)
- Агрегация маршрутов до /24, /16. [Запрос @sergeeximius](https://github.com/Ground-Zerro/DomainMapper/issues/8)
- OVPN формат сохранения. [Запрос @SonyLo](https://github.com/Ground-Zerro/DomainMapper/pull/13)
- Mikrotik формат сохранения.[Запрос @Shaman2010](https://github.com/Ground-Zerro/DomainMapper/pull/9)
</details>
**Функции:**
- Преобразование доменных имен популярных сервисов в IP-адреса.
- Агрегация маршрутов в /16 (255.255.0.0) и /24 (255.255.255.0) подсети. Комбинированный режим /24 + /32.
- Фильтрация IP-адресов Cloudflare (опционально).
- Множество форматов сохранения результата.
##### Протестировано в Ubuntu 20.04, macOS Sonoma и Windows 10/11
**Ключевые особенности**
- Возможность выбора системного, публичного DNS-сервера или их комбинации.
- При разрешении доменного имени используется каждый из указанных DNS-серверов, при этом процесс продолжается до получения всех возможных IP-адресов, а не останавливается на первом успешном ответе.
- Автоматическое исключение дубликатов IP-адресов, а также "заглушек" (например, IP самих DNS-серверов, редиректов на `0.0.0.0` и `localhost`).
- Поддержка работы в "тихом" режиме без взаимодействия с пользователем - настройка через конфигурационный файл.
- В конфигурационном файле можно указать команду для автоматического запуска другого скрипта или программы по завершении работы.
### Использование:
1. Установите зависимости:
```bash
pip install -r requirements.txt
```
2. Отредактируйте `config.ini` под свои задачи (опционально)
3. Запустите скрипт:
```bash
python main.py
```
<details>
<summary>Локальный режим работы (нажать, чтобы открыть)</summary>
В этом режиме списки DNS-серверов и сервисов загружаются из локальных файлов в папке со скриптом, а не из сети.
Для включения загрузки списка сервисов из локального файла `platformdb`, укажите `localplatform = yes` в config.ini.
- Формат файла `platformdb`: название сервиса и путь к локальному файлу через двоеточие.
Поддерживается работа как с файлами на локальной машине, так и их загрузка из сети по http(s).
Пример:
```
Torrent Truckers: platforms/dns-ttruckers.lst
Search engines: dns-search-engines.txt
Twitch: platforms/service/dns-twitch.txt
Adobe: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-adobe.txt
```
Для включения загрузки списка DNS-серверов из локального файла `dnsdb`, укажите `localdns = yes` в config.ini.
- Формат файла `dnsdb`: название DNS-сервера и его IP-адреса через двоеточие и пробел.
Важно - нужно обязательно указать два IP-адреса для каждого названия (можно один и тот же), это необходимо для правильной работы кода.
Пример:
```
SkyDNS: 77.88.8.8 77.88.8.8
Alternate DNS: 76.76.19.19 76.223.122.150
AdGuard DNS: 94.140.14.14 94.140.15.15
```
Важно: названия сервисов и нумерация DNS-серверов в config.ini должны соответствовать тем, что указаны в файлах `platformdb` и `dnsdb`.
- Формат файла с доменными именами: по одному домену на строку.
Пример:
```
ab.chatgpt.com
api.openai.com
arena.openai.com
```
Указание URL вместо доменного имени (например, `ab.chatgpt.com/login` вместо `ab.chatgpt.com`) приведет к ошибке.
</details>
<details>
<summary>Запуск скрипта с файлом конфигурации, отличным от `config.ini` (нажать, чтобы открыть)</summary>
- Указать путь к другому конфигурационному файлу при запуске скрипта можно с помощью опции `-c` (или `--config`). Если параметр не указан, по умолчанию будет использоваться файл `config.ini`.
Пример использования: `main.py -c myconfig.ini`, `python main.py -c config2.ini` или `main.py -c srv5.ini` и т.д.
</details>
<details>
<summary>Личный (локальный) список с доменными именами (нажать, чтобы открыть)</summary>
- Создайте файл `custom-dns-list.txt`, запишите в него доменные имена и разместите его рядом со скриптом. Список будет автоматически подхвачен при запуске и появится в меню как "Custom DNS list".
- Пример файла `custom-dns-list.txt`:
```
ab.chatgpt.com
api.openai.com
arena.openai.com
```
Указание URL вместо доменного имени (например, `ab.chatgpt.com/login` вместо `ab.chatgpt.com`) приведет к ошибке.
</details>
<details>
<summary>Запуск в Docker (нажать, чтобы открыть)</summary>
```
curl -L -s "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/dm-docker.sh" > /tmp/dm-docker.sh && chmod +x /tmp/dm-docker.sh && sh /tmp/dm-docker.sh
```
</details>
<details>
<summary>Для пользователей Windows (нажать, чтобы открыть)</summary>
- Загляните в директорию [Windows](https://github.com/Ground-Zerro/DomainMapper/tree/main/Windows) репозитория.
</details>
# ☕ Поддержка
Если проект оказался Вам полезен — можно поддержать автора:
- [Поддержать на Boosty](https://boosty.to/ground_zerro)

View File

@@ -91,6 +91,6 @@ move /y domain-ip-resolve.txt %UserProfile%\Desktop\domain-ip-resolve.txt
echo Программа завершена.
del /q /f main.py
endlocal
echo файл скопирован в %UserProfile%\Desktop\domain-ip-resolve.txt
pause
exit /b 0
::То-ли при выгрузке на github, то-ли при скачивании с него, в файл как-то попадает BOM... Как это починить я ХЗ.

View File

@@ -1,109 +1,41 @@
[DomainMapper]
# Имена сервисов, разделенные запятыми, для разрешения доменных имен в IP-адреса без запроса у пользователя
# опции:
# пустое значение - пользователю будет выведено меню выбора
# all - проверить все сервисы
# Antifilter community edition - список заблокированных DNS имен формируемый сообществом
# Youtube
# Facebook
# Openai
# Tik-Tok
# Instagram
# Twitter
# Netflix
# Bing
# Adobe
# Apple
# Google
# Torrent Truckers - торрент трекеры
# Search engines - поисковые системы
# Github Copilot - ИИ помощник от github
# Twitch
# custom - Custom DNS list, это файл "custom-dns-list.txt" расположенный в одном каталоге со скриптом
# Локальный режим загрузки (yes/no)
localplatform = no
localdns = no
# Сервисы для проверки (например: all, youtube, google, telegram, custom и т.д.)
service =
# DNS сервера (номер), разделенные пробелом, которые будут использоваться для разрешения доменных имен
# опции:
# пустое значение - пользователю будет выведено меню выбора
# 0 - использовать все доступные DNS серверы
# 1 - Системный DNS
# 2 - Google Public DNS
# 3 - Quad9
# 4 - Cloudflare DNS
# 5 - OpenDNS
# 6 - Cisco Umbrella
# 7 - DNS.Watch
# 8 - Dyn
# 9 - CleanBrowsing
# 10 - Alternate DNS
# 11 - AdGuard DNS
# 12 - Control D
# 13 - Yandex (основной)
# Список DNS серверов по номерам (0 - все, 1 - системный, 2 - google, 3 - quad9 и т.д.)
dnsserver =
# Включить фильтрацию IP-адресов cloudflare и не записывать их в файл результатов
# опции:
# пустое значение - пользователю будет выведено меню выбора
# yes - исключить IP адреса cloudflare из итогового списка
# no - оставить IP адреса cloudflare в итоговом списке
# Исключить Cloudflare IP (yes/no)
cloudflare =
# Сгруппировать подсети
# опции:
# пустое значение - пользователю будет выведено меню выбора
# 16 - группировка подсетей до /16 (255.255.0.0)
# 24 - группировка подсетей до /24 (255.255.255.0)
# no - оставить как есть
# Агрегация подсетей (16, 24, mix, no)
subnet =
# Имя конечного файла
# опции:
# пустое значение - "domain-ip-resolve.txt" в каталоге со скриптом
# имя_файла - файл с указанным именем будет сохранени в каталоге со скриптом
# полный_путь/имя_файла - файл будет сохранен с указанным именем в указанной каталоге
filename =
# Имя выходного файла
filename = domain-ip-resolve.txt
# Количество потоков сканирования, если не указано - будет использоваться 20 потоков
# Количество потоков (по умолчанию 20)
threads =
# Формат сохранения файла результатов
# опции:
# пустое значение - пользователю будет выведено меню выбора
# ip - только IP адрес
# unix - ip rote %IP%/32 %gateway%
# cidr - %IP%/32
# win - rote add %IP% mask 255.255.255.255 %gateway%
# mikrotik - /ip/firewall/address-list add list=%LIST_NAME% comment=%SERVICE_NAME% address=%IP%/32
# ovpn - push "route %IP% 255.255.255.255"
# wireguard - %IP%/32, и т.д...
# keenetic - ip route %IP%/32 %gateway% auto !%LIST_NAME%
# Формат результата (ip, unix, win, mikrotik, ovpn, wireguard, cidr, keenetic bat и т.д.)
filetype =
# адрес шлюза или имя интерфейса - используется при сохранении IP-адресов в 'win' и 'unix' формате
# опции:
# пустое значение - пользователю будет выведен запрос с подсказкой
# укажите IP-адрес шлюза или имя интерфейса
# Параметры для форматов:
## для win/unix — IP шлюза или имя интерфейса
gateway =
# адрес шлюза или имя интерфейса - используется при сохранении IP-адресов в 'keenetic' формате
# опции:
# пустое значение - пользователю будет выведен запрос с подсказкой
# укажите IP-адрес шлюза или имя интерфейса или IP-адрес шлюза и через пробел имя интерфейса
## для keenetic — IP шлюза или имя интерфейса, можно оба через пробел
keenetic =
# имя списка - используется при сохранении IP-адресов в 'mikrotik' формате
# опции:
# пустое значение - пользователю будет выведен запрос с подсказкой
# укажите имя
## для mikrotik — имя списка address-list
listname =
## для mikrotik - добавить или убирать "comment=%SERVICE_NAME%" в правилах Mikrotik (on/off)
mk_comment = off
# Показывать сведения о загруженной конфигурации при запуске скрипта
# опции:
# yes или пустое значение - показывать
# no - скрыть
# Показывать конфигурацию при запуске (yes/no)
cfginfo = yes
# Команда для консоли после завершения скриптом всех операций, может быть полезно для автоматизации и комбинирования с другим скриптом, кодом или программой
# опции:
# исполняемая_команда_для_консоли
run =
# Выполнить команду или запустить приложение после завершения (команда/полный путь к приложению)
run =

116
dm-docker.sh Normal file
View File

@@ -0,0 +1,116 @@
#!/bin/bash
# Функция для проверки наличия Docker
check_docker() {
if command -v docker >/dev/null 2>&1; then
echo "Docker уже установлен. Версия: $(docker --version)"
return 0 # Docker установлен
else
echo "Docker не найден. Устанавливаем Docker..."
return 1 # Docker не установлен
fi
}
# Проверяем и устанавливаем Docker, если его нет
if ! check_docker; then
echo "Обновляем список пакетов и устанавливаем необходимые компоненты..."
apt update && apt install -y git curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh ./get-docker.sh
rm get-docker.sh # Удаляем установочный скрипт после установки
fi
# Клонируем репозиторий, если его нет
if [ ! -d "./DomainMapper" ]; then
echo "Клонируем репозиторий DomainMapper..."
git clone https://github.com/Ground-Zerro/DomainMapper.git
else
echo "Репозиторий DomainMapper уже клонирован."
fi
# Проверяем наличие Docker образа
if ! docker image inspect domainmapper >/dev/null 2>&1; then
echo "Docker образ не найден. Собираем новый образ..."
echo "Устанавливаем только необходимые для работы компоненты..."
apt update && apt install -y software-properties-common wget build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev \
liblzma-dev tzdata && \
rm -rf /var/lib/apt/lists/*
# Создаём Dockerfile с исправлениями
echo "Создаём Dockerfile..."
cat > Dockerfile <<EOL
FROM ubuntu:jammy
# Устанавливаем необходимые пакеты для сборки Python
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
RUN apt-get update && \
apt-get install -y wget build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev tzdata && \
ln -fs /usr/share/zoneinfo/\$TZ /etc/localtime && \
echo \$TZ > /etc/timezone && \
dpkg-reconfigure --frontend noninteractive tzdata && \
rm -rf /var/lib/apt/lists/*
# Скачиваем и устанавливаем Python 3.12
RUN wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz && \
tar -xvf Python-3.12.0.tgz && \
cd Python-3.12.0 && \
./configure --enable-optimizations && \
make -j$(nproc) && \
make altinstall && \
cd .. && \
rm -rf Python-3.12.0 Python-3.12.0.tgz
# Устанавливаем pip для Python 3.12
RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.12
WORKDIR /app
ADD ./DomainMapper /app
# Устанавливаем зависимости проекта, если они указаны
RUN if [ -f "requirements.txt" ]; then \
python3.12 -m pip install --upgrade pip && \
python3.12 -m pip install -r requirements.txt; \
fi
CMD ["python3.12", "main.py"]
EOL
# Создаём файл domain-ip-resolve.txt, если его нет
if [ ! -f "./domain-ip-resolve.txt" ]; then
echo "Создаём файл domain-ip-resolve.txt..."
touch domain-ip-resolve.txt
echo "Файл domain-ip-resolve.txt создан."
else
echo "Файл domain-ip-resolve.txt уже существует."
fi
# Собираем Docker образ
echo "Собираем Docker образ..."
docker build -t domainmapper .
# Очищаем кеш Docker после сборки
echo "Очищаем build cache Docker..."
docker builder prune -f
else
echo "Docker образ domainmapper уже существует."
fi
# Проверяем наличие контейнера и запускаем main.py из существующего контейнера
if docker ps -a | grep -q domainmapper_container; then
echo "Контейнер уже существует. Запускаем main.py..."
docker start -i domainmapper_container
else
echo "Создаем и запускаем новый контейнер..."
docker run --name domainmapper_container -v "$(pwd)/domain-ip-resolve.txt:/app/domain-ip-resolve.txt" -it domainmapper
fi
# Сообщаем пользователю о местонахождении файла
echo "Контейнер завершил работу. Файл domain-ip-resolve.txt находится в $(pwd)/domain-ip-resolve.txt"
# Удаляем скрипт после выполнения
echo "Скрипт завершен."
rm -- "$0"

712
main.py
View File

@@ -5,12 +5,12 @@ import ipaddress
import os
from asyncio import Semaphore
from collections import defaultdict
from typing import Dict, List, Set, Tuple, Optional
import dns.asyncresolver
import httpx
from colorama import Fore, Style, init
# Цвета
init(autoreset=True)
def yellow(text):
@@ -31,16 +31,36 @@ def magneta(text):
def blue(text):
return f"{Fore.BLUE}{text}{Style.RESET_ALL}"
# Читаем конфигурацию
http_client = None
dns_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/dnsdb"
platform_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platformdb"
async def get_http_client():
global http_client
if http_client is None:
http_client = httpx.AsyncClient(
timeout=20.0,
limits=httpx.Limits(max_connections=50, max_keepalive_connections=10),
follow_redirects=True
)
return http_client
async def cleanup_http_client():
global http_client
if http_client:
await http_client.aclose()
http_client = None
def read_config(cfg_file):
try:
config = configparser.ConfigParser()
with open(cfg_file, 'r', encoding='utf-8-sig') as file:
with open(cfg_file, 'r', encoding='utf-8') as file:
config.read_file(file)
if 'DomainMapper' in config:
config = config['DomainMapper']
service = config.get('service') or ''
request_limit = int(config.get('threads') or 20)
request_limit = int(config.get('threads') or 15)
filename = config.get('filename') or 'domain-ip-resolve.txt'
cloudflare = config.get('cloudflare') or ''
filetype = config.get('filetype') or ''
@@ -51,30 +71,36 @@ def read_config(cfg_file):
subnet = config.get('subnet') or ''
cfginfo = config.get('cfginfo') or 'yes'
ken_gateway = config.get('keenetic') or ''
localplatform = config.get('localplatform') or ''
localdns = config.get('localdns') or ''
mk_comment = config.get('mk_comment') or 'off'
if cfginfo == 'yes':
if cfginfo in ['yes', 'y']:
print(f"{yellow(f'Загружена конфигурация из {cfg_file}:')}")
print(f"{Style.BRIGHT}Сервисы для проверки:{Style.RESET_ALL} {service if service else 'спросить у пользователя'}")
print(f"{Style.BRIGHT}Использовать DNS сервер:{Style.RESET_ALL} {dns_server_indices if dns_server_indices else 'спросить у пользователя'}")
print(f"{Style.BRIGHT}Количество одновременных запросов к одному DNS серверу:{Style.RESET_ALL} {request_limit}")
print(f"{Style.BRIGHT}Фильтрация IP-адресов Cloudflare:{Style.RESET_ALL} {'включена' if cloudflare in ['y', 'yes'] else 'вЫключена' if cloudflare in ['n', 'no'] else 'спросить у пользователя'}")
print(f"{Style.BRIGHT}Агрегация IP-адресов:{Style.RESET_ALL} {'до /16 подсети (255.255.0.0)' if subnet == '16' else 'до /24 подсети (255.255.255.0)' if subnet == '24' else 'вЫключена' if subnet in ['n', 'no'] else 'спросить у пользователя'}")
print(f"{Style.BRIGHT}Фильтрация IP-адресов Cloudflare:{Style.RESET_ALL} {'включена' if cloudflare in ['y', 'yes'] else 'выключена' if cloudflare in ['n', 'no'] else 'спросить у пользователя'}")
print(f"{Style.BRIGHT}Агрегация IP-адресов:{Style.RESET_ALL} {'mix режим /24 (255.255.255.0) + /32 (255.255.255.255)' if subnet == 'mix' else 'до /16 подсети (255.255.0.0)' if subnet == '16' else 'до /24 подсети (255.255.255.0)' if subnet == '24' else 'выключена' if subnet in ['n', 'no'] else 'спросить у пользователя'}")
print(f"{Style.BRIGHT}Формат сохранения:{Style.RESET_ALL} {'только IP' if filetype == 'ip' else 'Linux route' if filetype == 'unix' else 'CIDR-нотация' if filetype == 'cidr' else 'Windows route' if filetype == 'win' else 'Mikrotik CLI' if filetype == 'mikrotik' else 'open vpn' if filetype == 'ovpn' else 'Keenetic CLI' if filetype == 'keenetic' else 'Wireguard' if filetype == 'wireguard' else 'спросить у пользователя'}")
if filetype not in ['ip', 'cidr', 'mikrotik', 'ovpn', 'wireguard', 'keenetic']:
if filetype in ['win', 'unix', '']:
print(f"{Style.BRIGHT}Шлюз/Имя интерфейса для Windows и Linux route:{Style.RESET_ALL} {gateway if gateway else 'спросить у пользователя'}")
if filetype not in ['ip', 'unix', 'cidr', 'win', 'mikrotik', 'ovpn', 'wireguard']:
if filetype in ['keenetic', '']:
print(f"{Style.BRIGHT}Шлюз/Имя интерфейса для Keenetic CLI:{Style.RESET_ALL} {ken_gateway if ken_gateway else 'спросить у пользователя'}")
if filetype not in ['ip', 'unix', 'cidr', 'win', 'ovpn', 'wireguard', 'keenetic']:
if filetype in ['mikrotik', '']:
print(f"{Style.BRIGHT}Имя списка для Mikrotik firewall:{Style.RESET_ALL} {mk_list_name if mk_list_name else 'спросить у пользователя'}")
print(f"{Style.BRIGHT}'comment=' в Mikrotik firewall:{Style.RESET_ALL} {'выключен' if mk_comment == 'off' else 'включен'}")
print(f"{Style.BRIGHT}Сохранить результат в файл:{Style.RESET_ALL} {filename}")
print(f"{Style.BRIGHT}Выполнить по завершению:{Style.RESET_ALL} {run_command if run_command else 'не указано'}")
print(f"{Style.BRIGHT}Локальный список платформ:{Style.RESET_ALL} {'включен' if str(localplatform).strip().lower() in ('yes', 'y') else 'выключен'}")
print(f"{Style.BRIGHT}Локальный список DNS серверов:{Style.RESET_ALL} {'включен' if str(localdns).strip().lower() in ('yes', 'y') else 'выключен'}")
return service, request_limit, filename, cloudflare, filetype, gateway, run_command, dns_server_indices, mk_list_name, subnet, ken_gateway
return service, request_limit, filename, cloudflare, filetype, gateway, run_command, dns_server_indices, mk_list_name, subnet, ken_gateway, localplatform, localdns, mk_comment
except Exception as e:
print(f"{yellow(f'Ошибка загрузки {cfg_file}:')} {e}\n{Style.BRIGHT}Используются настройки 'по умолчанию'.{Style.RESET_ALL}")
return '', 20, 'domain-ip-resolve.txt', '', '', '', '', [], '', '', ''
return '', 20, 'domain-ip-resolve.txt', '', '', '', '', [], '', '', '', '', '', 'off'
def gateway_input(gateway):
if not gateway:
@@ -83,7 +109,6 @@ def gateway_input(gateway):
else:
return gateway
def ken_gateway_input(ken_gateway):
if not ken_gateway:
input_ken_gateway = input(f"Укажите {green('IP шлюза')} или {green('имя интерфейса')} или {green('IP шлюза')} и через пробел {green('имя интерфейса')}: ")
@@ -91,126 +116,185 @@ def ken_gateway_input(ken_gateway):
else:
return ken_gateway
# Ограничение числа запросов
def get_semaphore(request_limit):
return defaultdict(lambda: Semaphore(request_limit))
# Инициализация semaphore для ограничения запросов
def init_semaphores(request_limit):
return get_semaphore(request_limit)
async def load_urls(url):
async def load_urls(url: str) -> Dict[str, str]:
try:
async with httpx.AsyncClient() as client:
response = await client.get(url)
response.raise_for_status()
text = response.text
lines = text.split('\n')
urls = {}
for line in lines:
if line.strip():
service, url = line.split(': ', 1)
urls[service.strip()] = url.strip()
return urls
client = await get_http_client()
response = await client.get(url)
response.raise_for_status()
text = response.text
lines = text.split('\n')
urls = {}
for line in lines:
if line.strip() and ': ' in line:
service, url_val = line.split(': ', 1)
urls[service.strip()] = url_val.strip()
return urls
except Exception as e:
print(f"Ошибка при загрузке списка платформ: {e}")
return {}
# Загрузка списка DNS серверов
async def load_dns_servers(url):
async def load_urls_from_file() -> Dict[str, str]:
try:
async with httpx.AsyncClient() as client:
response = await client.get(url)
response.raise_for_status()
text = response.text
lines = text.split('\n')
dns_servers = {}
for line in lines:
if line.strip():
service, servers = line.split(': ', 1)
dns_servers[service.strip()] = servers.strip().split()
return dns_servers
with open('platformdb', 'r', encoding='utf-8') as file:
urls = {}
for line in file:
if line.strip() and ': ' in line:
service, url = line.split(': ', 1)
urls[service.strip()] = url.strip()
return urls
except Exception as e:
print(f"\n{red('Локальный список сервисов не найден - загружаем из сети.')}")
urls = await load_urls(platform_db_url)
return urls
async def load_dns_servers(url: str) -> Dict[str, List[str]]:
try:
client = await get_http_client()
response = await client.get(url)
response.raise_for_status()
text = response.text
lines = text.split('\n')
dns_servers = {}
for line in lines:
if line.strip() and ': ' in line:
service, servers = line.split(': ', 1)
dns_servers[service.strip()] = servers.strip().split()
return dns_servers
except Exception as e:
print(f"Ошибка при загрузке списка DNS серверов: {e}")
return {}
# Загрузка IP-адресов cloudflare
async def get_cloudflare_ips():
async def load_dns_from_file() -> Dict[str, List[str]]:
try:
async with httpx.AsyncClient() as client:
response = await client.get("https://www.cloudflare.com/ips-v4/")
response.raise_for_status()
text = response.text
cloudflare_ips = set()
for line in text.splitlines():
line = line.strip()
if '/' in line:
try:
ip_network = ipaddress.ip_network(line)
for ip in ip_network:
cloudflare_ips.add(str(ip))
except ValueError:
continue
return cloudflare_ips
with open('dnsdb', 'r') as file:
dns_servers = {}
for line in file:
if line.strip() and ': ' in line:
service, servers = line.split(': ', 1)
dns_servers[service.strip()] = servers.strip().split()
return dns_servers
except Exception as e:
print(f"\n{red('Локальный список DNS серверов не найден - загружаем из сети.')}")
dns_servers = await load_dns_servers(dns_db_url)
return dns_servers
async def get_cloudflare_ips() -> Set[str]:
try:
client = await get_http_client()
response = await client.get("https://www.cloudflare.com/ips-v4/")
response.raise_for_status()
text = response.text
cloudflare_ips = set()
for line in text.splitlines():
line = line.strip()
if '/' in line:
try:
network = ipaddress.ip_network(line)
for ip in network:
cloudflare_ips.add(str(ip))
except ValueError:
continue
return cloudflare_ips
except Exception as e:
print("Ошибка при получении IP адресов Cloudflare:", e)
return set()
async def resolve_domain(domain, resolver, semaphore, dns_server_name, null_ips_count, cloudflare_ips, cloudflare_ips_count, total_domains_processed, include_cloudflare):
async with semaphore:
async def load_dns_names(url_or_file: str) -> List[str]:
if url_or_file.startswith("http"):
client = await get_http_client()
try:
total_domains_processed[0] += 1
response = await resolver.resolve(domain)
ips = [ip.address for ip in response]
filtered_ips = []
for ip_address in ips:
if ip_address in ('127.0.0.1', '0.0.0.0') or ip_address in resolver.nameservers:
null_ips_count[0] += 1
elif include_cloudflare and ip_address in cloudflare_ips:
cloudflare_ips_count[0] += 1
else:
filtered_ips.append(ip_address)
print(f"{Fore.BLUE}{domain} IP-адрес: {ip_address} - {dns_server_name}{Style.RESET_ALL}")
return filtered_ips
except Exception as e: # Ловим все ошибки чтобы код не прервался
print(f"{Fore.RED}Не удалось получить IP-адрес: {domain} - {dns_server_name}{Style.RESET_ALL}")
response = await client.get(url_or_file)
response.raise_for_status()
return [line.strip() for line in response.text.splitlines() if line.strip()]
except httpx.HTTPStatusError as e:
print(f"Ошибка при загрузке DNS имен: {e}")
return []
else:
try:
with open(url_or_file, 'r', encoding='utf-8') as file:
return [line.strip() for line in file.readlines() if line.strip()]
except Exception as e:
print(f"Ошибка при чтении файла {url_or_file}: {e}")
return []
async def resolve_domain_batch(domains: List[str], resolver: dns.asyncresolver.Resolver,
semaphore: Semaphore, dns_server_name: str,
stats: Dict[str, int], cloudflare_ips: Set[str],
include_cloudflare: bool) -> List[str]:
async with semaphore:
resolved_ips = []
for domain in domains:
try:
stats['total_domains_processed'] += 1
response = await resolver.resolve(domain)
ips = [ip.address for ip in response]
for ip_address in ips:
if ip_address in ('127.0.0.1', '0.0.0.0') or ip_address in resolver.nameservers:
stats['null_ips_count'] += 1
elif include_cloudflare and ip_address in cloudflare_ips:
stats['cloudflare_ips_count'] += 1
else:
resolved_ips.append(ip_address)
print(f"{Fore.BLUE}{domain} IP-адрес: {ip_address} - {dns_server_name}{Style.RESET_ALL}")
except Exception:
stats['domain_errors'] += 1
return resolved_ips
async def resolve_dns(service, dns_names, dns_servers, cloudflare_ips, unique_ips_all_services, semaphore, null_ips_count, cloudflare_ips_count, total_domains_processed, include_cloudflare):
async def resolve_dns_optimized(service: str, dns_names: List[str],
dns_servers: List[Tuple[str, List[str]]],
cloudflare_ips: Set[str], unique_ips_all_services: Set[str],
semaphore_dict: Dict, stats: Dict[str, int],
include_cloudflare: bool, batch_size: int = 50) -> str:
try:
print(f"{Fore.YELLOW}Анализ DNS имен платформы {service}...{Style.RESET_ALL}")
print(f"{Fore.YELLOW}Загрузка DNS имен платформы {service}...{Style.RESET_ALL}")
domain_batches = [dns_names[i:i + batch_size] for i in range(0, len(dns_names), batch_size)]
tasks = []
for server_name, servers in dns_servers:
resolver = dns.asyncresolver.Resolver()
resolver.nameservers = servers
for domain in dns_names:
domain = domain.strip()
if domain:
tasks.append(resolve_domain(domain, resolver, semaphore[server_name], server_name, null_ips_count, cloudflare_ips, cloudflare_ips_count, total_domains_processed, include_cloudflare))
results = await asyncio.gather(*tasks)
for batch in domain_batches:
for server_name, servers in dns_servers:
resolver = dns.asyncresolver.Resolver()
resolver.nameservers = servers
tasks.append(resolve_domain_batch(
batch, resolver, semaphore_dict[server_name],
server_name, stats, cloudflare_ips, include_cloudflare
))
max_concurrent_tasks = min(len(tasks), 100)
results = []
for i in range(0, len(tasks), max_concurrent_tasks):
batch_tasks = tasks[i:i + max_concurrent_tasks]
batch_results = await asyncio.gather(*batch_tasks, return_exceptions=True)
for result in batch_results:
if not isinstance(result, Exception):
results.extend(result)
unique_ips_current_service = set()
for result in results:
for ip_address in result:
if ip_address not in unique_ips_all_services:
unique_ips_current_service.add(ip_address)
unique_ips_all_services.add(ip_address)
return '\n'.join(unique_ips_current_service) + '\n'
for ip_address in results:
if ip_address not in unique_ips_all_services:
unique_ips_current_service.add(ip_address)
unique_ips_all_services.add(ip_address)
return '\n'.join(sorted(unique_ips_current_service)) + '\n' if unique_ips_current_service else ''
except Exception as e:
print(f"Не удалось сопоставить IP адреса {service} его доменным именам.", e)
print(f"Не удалось сопоставить IP адреса {service} его доменным именам: {e}")
return ""
def check_service_config(service, urls, local_dns_names):
if service:
services = [s.strip() for s in service.split(',')]
@@ -230,8 +314,8 @@ def check_service_config(service, urls, local_dns_names):
while True:
print(f"\n{yellow('Выберите сервисы:')}")
print("0. Выбрать все")
for idx, (service, url) in enumerate(urls.items(), 1):
print(f"{idx}. {service.capitalize()}")
for idx, (service_name, url) in enumerate(urls.items(), 1):
print(f"{idx}. {service_name.capitalize()}")
if local_dns_names:
print(f"{len(urls) + 1}. Custom DNS list")
@@ -251,40 +335,38 @@ def check_service_config(service, urls, local_dns_names):
break
return services
def check_include_cloudflare(cloudflare):
if cloudflare.lower() == 'yes':
return True
elif cloudflare.lower() == 'no':
return False
else:
return input(f"\n{yellow('Исключить IP адреса Cloudflare из итогового списка?')}"
f"\n{green('yes')} - исключить"
f"\n{green('Enter')} - оставить: ").strip().lower() == "yes"
if cloudflare in ['yes', 'y', 'no', 'n']:
return cloudflare in ['yes', 'y']
user_input = input(
f"\n{yellow('Исключить IP адреса Cloudflare из итогового списка?')}"
f"\n1. исключить"
f"\n{green('Enter')} - оставить"
f"\nВаш выбор: "
).strip()
if user_input == '1':
return True
else:
return False
def check_dns_servers(dns_servers, dns_server_indices):
# Получение системных DNS серверов
system_dns_servers = dns.asyncresolver.Resolver().nameservers
# Формирование списка всех доступных серверов
dns_server_options = [('Системный DNS', system_dns_servers)] + list(dns_servers.items())
selected_dns_servers = []
# Если указаны индексы серверов в конфиге
if dns_server_indices:
if 0 in dns_server_indices: # Если указано 0, выбираем все доступные DNS серверы
if 0 in dns_server_indices:
selected_dns_servers = dns_server_options
else:
for idx in dns_server_indices:
if 1 <= idx <= len(dns_server_options): # Корректируем индекс на 1 меньше, чтобы соответствовать списку
if 1 <= idx <= len(dns_server_options):
selected_dns_servers.append(dns_server_options[idx - 1])
return selected_dns_servers
# Если индексы не указаны, запрашиваем у пользователя выбор серверов
while True:
print(f"\n{yellow('Какие DNS сервера использовать?')}")
print(f"\n{yellow('Какие DNS серверы использовать?')}")
print("0. Выбрать все")
for idx, (name, servers) in enumerate(dns_server_options, 1):
print(f"{idx}. {name}: {', '.join(servers)}")
@@ -305,8 +387,6 @@ def check_dns_servers(dns_servers, dns_server_indices):
return selected_dns_servers
# microtik ввод комментария для firewall
def mk_list_name_input(mk_list_name):
if not mk_list_name:
input_mk_list_name = input(f"Введите {green('LIST_NAME')} для Mikrotik firewall: ")
@@ -314,148 +394,167 @@ def mk_list_name_input(mk_list_name):
else:
return mk_list_name
# Для mikrotik уплотняем имена сервисов
def mk_comment(selected_service):
def comment(selected_service):
return ",".join(["".join(word.title() for word in s.split()) for s in selected_service])
def subnet_input(subnet):
if not subnet:
choice = input(
f"\n{yellow('Объединить IP-адреса в подсети?')}"
f"\n1. сократить до {green('/16')} (255.255.0.0)"
f"\n2. сократить до {green('/24')} (255.255.255.0)"
f"\n3. сократить до {green('/24')} + {green('/32')} (255.255.255.0 и 255.255.255.255)"
f"\n{green('Enter')} - пропустить"
f"\nВаш выбор: "
).strip()
# Выбор формата сохранения списка разрешенных DNS имен
def subnetting(subnet):
if subnet.lower() == '': # Если значение пустое, запрашиваем ввод от пользователя
subnet = input(f"\n{yellow('Объединить IP-адреса в подсети?')} "
f"\n{green('16')} - сократить до /16 (255.255.0.0)"
f"\n{green('24')} - сократить до /24 (255.255.255.0)"
f"\n{green('Enter')} - пропустить: ").strip().lower()
if choice == '1':
subnet = '16'
elif choice == '2':
subnet = '24'
elif choice == '3':
subnet = 'mix'
else:
subnet = '32'
# Обрабатываем ввод или параметр
if subnet == '16':
return "16", "255.255.0.0"
elif subnet == '24':
return "24", "255.255.255.0"
else:
return "32", "255.255.255.255"
return subnet if subnet in {'16', '24', 'mix'} else '32'
def group_ips_in_subnets(filename, submask):
def group_ips_in_subnets_optimized(filename: str, subnet: str):
try:
# Чтение всех IP-адресов из файла
with open(filename, 'r', encoding='utf-8-sig') as file:
ips = {line.strip() for line in file if line.strip()} # Собираем уникальные IP адреса
with open(filename, 'r', encoding='utf-8') as file:
ips = {line.strip() for line in file if line.strip()}
# Обработка подсетей в зависимости от маски
if submask == "24":
# Множество для хранения всех подсетей /24
subnets = set()
subnets = set()
# Преобразование всех IP в их подсети /24
if subnet == "16":
for ip in ips:
try:
# Преобразуем IP в сеть /24 (маска 255.255.255.0)
network_24 = ipaddress.ip_network(f"{ip}/24", strict=False)
subnets.add(str(network_24.network_address))
except ValueError as e:
print(f"{red('Ошибка в IP адресе:')} {ip} - {e}")
network = ipaddress.IPv4Network(f"{ip}/16", strict=False)
subnets.add(str(network.network_address))
except ValueError:
continue
print(f"{Style.BRIGHT}IP-адреса агрегированы до /16 подсети{Style.RESET_ALL}")
# Перезаписываем файл с уникальными подсетями /24
with open(filename, 'w', encoding='utf-8-sig') as file:
for subnet in sorted(subnets):
file.write(subnet + '\n')
print(f"{Style.BRIGHT}IP-адреса агрегированы до /{submask} подсети{Style.RESET_ALL}")
elif submask == "16":
# Множество для хранения всех объединенных подсетей /16
subnets = set()
# Преобразование всех IP в их подсети /16
elif subnet == "24":
for ip in ips:
try:
# Преобразуем IP в сеть /16 (маска 255.255.0.0)
network_16 = ipaddress.ip_network(f"{ip}/16", strict=False)
subnets.add(str(network_16.network_address))
except ValueError as e:
print(f"{red('Ошибка в IP адресе:')} {ip} - {e}")
network = ipaddress.IPv4Network(f"{ip}/24", strict=False)
subnets.add(str(network.network_address))
except ValueError:
continue
print(f"{Style.BRIGHT}IP-адреса агрегированы до /24 подсети{Style.RESET_ALL}")
# Перезаписываем файл с уникальными подсетями /16
with open(filename, 'w', encoding='utf-8-sig') as file:
for subnet in sorted(subnets):
file.write(subnet + '\n')
elif subnet == "mix":
octet_groups = defaultdict(list)
for ip in ips:
key = '.'.join(ip.split('.')[:3])
octet_groups[key].append(ip)
print(f"{Style.BRIGHT}IP-адреса агрегированы до /{submask} подсети{Style.RESET_ALL}")
for key, group in octet_groups.items():
if len(group) > 1:
subnets.add(key + '.0')
else:
subnets.update(group)
print(f"{Style.BRIGHT}IP-адреса агрегированы до масок /24 и /32{Style.RESET_ALL}")
with open(filename, 'w', encoding='utf-8') as file:
for subnet_ip in sorted(subnets, key=lambda x: ipaddress.IPv4Address(x.split('/')[0])):
file.write(subnet_ip + '\n')
except Exception as e:
print(f"{red('Ошибка при обработке файла:')} {e}")
print(f"Ошибка при обработке файла: {e}")
def process_file_format(filename, filetype, gateway, selected_service, mk_list_name, submask, ken_gateway):
def process_file_format(filename, filetype, gateway, selected_service, mk_list_name, mk_comment, subnet, ken_gateway):
def read_file(filename):
try:
with open(filename, 'r', encoding='utf-8-sig') as file:
with open(filename, 'r', encoding='utf-8') as file:
return file.readlines()
except Exception as e:
print(f"Ошибка чтения файла: {e}")
return None
def write_file(filename, ips, formatter):
if filetype.lower() == 'wireguard':
formatted_ips = [formatter(ip.strip()) for ip in ips]
with open(filename, 'w', encoding='utf-8-sig') as file:
file.write(', '.join(formatted_ips)) # Join with ", " to include a space after each comma
else:
with open(filename, 'w', encoding='utf-8-sig') as file:
for ip in ips:
file.write(formatter(ip.strip()) + '\n')
formatted_ips = [formatter(ip.strip()) for ip in ips]
with open(filename, 'w', encoding='utf-8') as file:
if filetype.lower() == 'wireguard':
file.write(', '.join(formatted_ips))
else:
file.write('\n'.join(formatted_ips))
# Определение маски подсети для отображения пользователю и ее корректной записи в файл
display_submask = "255.255.0.0" if submask == "16" else "255.255.255.0" if submask == "24" else "255.255.255.255"
net_mask = subnet if subnet == "mix" else "255.255.0.0" if subnet == "16" else "255.255.255.0" if subnet == "24" else "255.255.255.255"
if not filetype:
filetype = input(f"""
user_input = input(f"""
{yellow('В каком формате сохранить файл?')}
{green('win')} - route add {cyan('IP')} mask {display_submask} {cyan('GATEWAY')}
{green('unix')} - ip route {cyan('IP')}/{submask} {cyan('GATEWAY')}
{green('keenetic')} - ip route {cyan('IP')}/{submask} {cyan('GATEWAY GATEWAY_NAME')} auto !{mk_comment(selected_service)}
{green('cidr')} - {cyan('IP')}/{submask}
{green('mikrotik')} - /ip/firewall/address-list add list={cyan("LIST_NAME")} comment="{mk_comment(selected_service)}" address={cyan("IP")}/{submask}
{green('ovpn')} - push "route {cyan('IP')} {display_submask}"
{green('wireguard')} - {cyan('IP')}/{submask}, {cyan('IP')}/{submask}, и т.д...
1. {green('win')} - route add {cyan('IP')} mask {net_mask} {cyan('GATEWAY')}
2. {green('unix')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY')}
3. {green('keenetic bat')} - route add {cyan('IP')} mask {net_mask} 0.0.0.0
4. {green('keenetic cli')} - ip route {cyan('IP')}/{subnet} {cyan('GATEWAY GATEWAY_NAME')} auto !{comment(selected_service)}
5. {green('cidr')} - {cyan('IP')}/{subnet}
6. {green('mikrotik')} - /ip/firewall/address-list add list={cyan("LIST_NAME")}{f' comment="{comment(selected_service)}"' if mk_comment != "off" else ""} address={cyan("IP")}/{subnet}
7. {green('ovpn')} - push "route {cyan('IP')} {net_mask}"
8. {green('wireguard')} - {cyan('IP')}/{subnet}, {cyan('IP')}/{subnet}, и т.д...
{green('Enter')} - {cyan('IP')}
Ваш выбор: """)
Ваш выбор: """).strip()
mapping = {
'1': 'win',
'2': 'unix',
'3': 'keenetic bat',
'4': 'keenetic cli',
'5': 'cidr',
'6': 'mikrotik',
'7': 'ovpn',
'8': 'wireguard'
}
filetype = mapping.get(user_input, '')
ips = read_file(filename)
if not ips:
return
# Запрашиваем IP шлюза для win и unix
if filetype.lower() in ['win', 'unix']:
if filetype in ['win', 'unix']:
gateway = gateway_input(gateway)
# Запрашиваем IP шлюза и Имя интерфейса для keenetic
if filetype.lower() in ['keenetic']:
elif filetype == 'keenetic cli':
ken_gateway = ken_gateway_input(ken_gateway)
# Запрашиваем mk_list_name для Mikrotik
if filetype.lower() == 'mikrotik':
elif filetype == 'mikrotik':
mk_list_name = mk_list_name_input(mk_list_name)
formatters = {
'win': lambda ip: f"route add {ip} mask {display_submask} {gateway}",
'unix': lambda ip: f"ip route {ip}/{submask} {gateway}",
'keenetic': lambda ip: f"ip route {ip}/{submask} {ken_gateway} auto !{mk_comment(selected_service)}",
'cidr': lambda ip: f"{ip}/{submask}",
'ovpn': lambda ip: f'push "route {ip} {display_submask}"',
'mikrotik': lambda ip: f'/ip/firewall/address-list add list={mk_list_name} comment="{mk_comment(selected_service)}" address={ip}/{submask}',
'wireguard': lambda ip: f"{ip}/{submask}"
'win': lambda ip: f"route add {ip} mask {net_mask} {gateway}",
'unix': lambda ip: f"ip route {ip}/{subnet} {gateway}",
'keenetic bat': lambda ip: f"route add {ip} mask {net_mask} 0.0.0.0",
'keenetic cli': lambda ip: f"ip route {ip}/{subnet} {ken_gateway} auto !{comment(selected_service)}",
'cidr': lambda ip: f"{ip}/{subnet}",
'ovpn': lambda ip: f'push "route {ip} {net_mask}"',
'mikrotik': lambda ip: f'/ip/firewall/address-list add list={mk_list_name}' + (f' comment="{comment(selected_service)}"' if mk_comment != "off" else "") + f' address={ip}/{subnet}',
'wireguard': lambda ip: f"{ip}/{subnet}"
}
if subnet == "mix":
if filetype in ['win', 'keenetic bat']:
mix_formatter = lambda ip: f"{ip.strip()} mask 255.255.255.0" if ip.endswith('.0') else f"{ip.strip()} mask 255.255.255.255"
elif filetype.lower() == 'ovpn':
mix_formatter = lambda ip: f"{ip.strip()} 255.255.255.0" if ip.endswith('.0') else f"{ip.strip()} 255.255.255.255"
else:
mix_formatter = lambda ip: f"{ip.strip()}/24" if ip.endswith('.0') else f"{ip.strip()}/32"
formatters.update({
'win': lambda ip: f"route add {mix_formatter(ip)} {gateway}",
'unix': lambda ip: f"ip route {mix_formatter(ip)} {gateway}",
'keenetic bat': lambda ip: f"route add {mix_formatter(ip)} 0.0.0.0",
'keenetic cli': lambda ip: f"ip route {mix_formatter(ip)} {ken_gateway} auto !{comment(selected_service)}",
'cidr': lambda ip: f"{mix_formatter(ip)}",
'ovpn': lambda ip: f'push "route {mix_formatter(ip)}"',
'mikrotik': lambda ip: f'/ip/firewall/address-list add list={mk_list_name}' + (f' comment="{comment(selected_service)}"' if mk_comment != "off" else "") + f' address={mix_formatter(ip)}',
'wireguard': lambda ip: f"{mix_formatter(ip)}"
})
if filetype.lower() in formatters:
write_file(filename, ips, formatters[filetype.lower()])
# Стартуем
async def main():
# Парсинг аргументов командной строки
parser = argparse.ArgumentParser(description="DNS resolver script with custom config file.")
parser.add_argument(
'-c', '--config',
@@ -465,87 +564,114 @@ async def main():
)
args = parser.parse_args()
# Инициализация настроек из переданного конфигурационного файла
config_file = args.config
service, request_limit, filename, cloudflare, filetype, gateway, run_command, dns_server_indices, mk_list_name, subnet, ken_gateway = read_config(config_file)
try:
config_file = args.config
(service, request_limit, filename, cloudflare, filetype, gateway, run_command,
dns_server_indices, mk_list_name, subnet, ken_gateway, localplatform,
localdns, mk_comment) = read_config(config_file)
# Load URLs
platform_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platformdb"
urls = await load_urls(platform_db_url)
# Load local DNS names from "custom-dns-list.txt" if it exists
local_dns_names = []
if os.path.exists('custom-dns-list.txt'):
with open('custom-dns-list.txt', 'r', encoding='utf-8-sig') as file:
local_dns_names = [line.strip() for line in file if line.strip()]
# Выбор платформ
selected_services = check_service_config(service, urls, local_dns_names)
# Загрузка списка DNS-серверов
dns_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/dnsdb"
dns_servers = await load_dns_servers(dns_db_url)
# Выбор DNS-серверов
selected_dns_servers = check_dns_servers(dns_servers, dns_server_indices)
# Инициализация IP-адресов Cloudflare
cloudflare_ips = await get_cloudflare_ips()
# Фильтр Cloudflare
include_cloudflare = check_include_cloudflare(cloudflare)
unique_ips_all_services = set()
semaphore = init_semaphores(request_limit)
null_ips_count = [0]
cloudflare_ips_count = [0]
total_domains_processed = [0]
tasks = []
for service in selected_services:
if service == 'Custom DNS list':
tasks.append(resolve_dns(service, local_dns_names, selected_dns_servers, cloudflare_ips,
unique_ips_all_services, semaphore, null_ips_count, cloudflare_ips_count,
total_domains_processed, include_cloudflare))
if localplatform in ['yes', 'y']:
urls = await load_urls_from_file()
else:
dns_names_url = urls[service]
async with httpx.AsyncClient() as client:
response = await client.get(dns_names_url)
response.raise_for_status()
dns_names = response.text.splitlines()
tasks.append(resolve_dns(service, dns_names, selected_dns_servers, cloudflare_ips, unique_ips_all_services,
semaphore, null_ips_count, cloudflare_ips_count, total_domains_processed,
include_cloudflare))
urls = await load_urls(platform_db_url)
results = await asyncio.gather(*tasks)
local_dns_names = []
if os.path.exists('custom-dns-list.txt'):
with open('custom-dns-list.txt', 'r', encoding='utf-8') as file:
local_dns_names = [line.strip() for line in file if line.strip()]
with open(filename, 'w', encoding='utf-8-sig') as file:
for result in results:
file.write(result)
selected_services = check_service_config(service, urls, local_dns_names)
print(f"\n{yellow('Проверка завершена.')}")
print(f"{Style.BRIGHT}Использовались DNS сервера:{Style.RESET_ALL} " + ', '.join(
[f'{pair[0]} ({", ".join(pair[1])})' for pair in selected_dns_servers]))
print(f"{Style.BRIGHT}Всего обработано DNS имен:{Style.RESET_ALL} {total_domains_processed[0]}")
if include_cloudflare:
print(f"{Style.BRIGHT}Исключено IP-адресов Cloudflare:{Style.RESET_ALL} {cloudflare_ips_count[0]}")
print(f"{Style.BRIGHT}Исключено IP-адресов 'заглушек':{Style.RESET_ALL} {null_ips_count[0]}")
print(f"{Style.BRIGHT}Разрешено IP-адресов из DNS имен:{Style.RESET_ALL} {len(unique_ips_all_services)}")
if localdns in ['yes', 'y']:
dns_servers = await load_dns_from_file()
else:
dns_servers = await load_dns_servers(dns_db_url)
# Группировка IP-адресов в подсети
submask, _ = subnetting(subnet)
group_ips_in_subnets(filename, submask)
selected_dns_servers = check_dns_servers(dns_servers, dns_server_indices)
process_file_format(filename, filetype, gateway, selected_services, mk_list_name, submask, ken_gateway)
include_cloudflare = check_include_cloudflare(cloudflare)
if include_cloudflare:
cloudflare_ips = await get_cloudflare_ips()
else:
cloudflare_ips = set()
if run_command:
print("\nВыполнение команды после завершения скрипта...")
os.system(run_command)
else:
print(f"\n{Style.BRIGHT}Результаты сохранены в файл:{Style.RESET_ALL}", filename)
if os.name == 'nt':
input(f"Нажмите {green('Enter')} для выхода...")
unique_ips_all_services = set()
semaphore = init_semaphores(request_limit)
stats = {
'null_ips_count': 0,
'cloudflare_ips_count': 0,
'total_domains_processed': 0,
'domain_errors': 0
}
tasks = []
for service_name in selected_services:
if service_name == 'Custom DNS list':
tasks.append(resolve_dns_optimized(
service_name, local_dns_names, selected_dns_servers,
cloudflare_ips, unique_ips_all_services, semaphore,
stats, include_cloudflare
))
else:
url_or_file = urls[service_name]
dns_names = await load_dns_names(url_or_file)
if dns_names:
tasks.append(resolve_dns_optimized(
service_name, dns_names, selected_dns_servers,
cloudflare_ips, unique_ips_all_services, semaphore,
stats, include_cloudflare
))
if tasks:
results = await asyncio.gather(*tasks, return_exceptions=True)
with open(filename, 'w', encoding='utf-8') as file:
for result in results:
if isinstance(result, str) and result.strip():
file.write(result)
else:
with open(filename, 'w', encoding='utf-8') as file:
pass
print(f"\n{yellow('Проверка завершена.')}")
print(f"{Style.BRIGHT}Всего обработано DNS имен:{Style.RESET_ALL} {stats['total_domains_processed']}")
print(f"{Style.BRIGHT}Разрешено IP-адресов из DNS имен:{Style.RESET_ALL} {len(unique_ips_all_services)}")
print(f"{Style.BRIGHT}Ошибок разрешения доменов:{Style.RESET_ALL} {stats['domain_errors']}")
if stats['null_ips_count'] > 0:
print(f"{Style.BRIGHT}Исключено IP-адресов 'заглушек':{Style.RESET_ALL} {stats['null_ips_count']}")
if include_cloudflare:
print(f"{Style.BRIGHT}Исключено IP-адресов Cloudflare:{Style.RESET_ALL} {stats['cloudflare_ips_count']}")
print(f"{Style.BRIGHT}Использовались DNS серверы:{Style.RESET_ALL} " + ', '.join(
[f'{pair[0]} ({", ".join(pair[1])})' for pair in selected_dns_servers]))
subnet = subnet_input(subnet)
if subnet != '32':
group_ips_in_subnets_optimized(filename, subnet)
process_file_format(filename, filetype, gateway, selected_services, mk_list_name, mk_comment, subnet, ken_gateway)
if run_command:
print("\nВыполнение команды после завершения скрипта...")
os.system(run_command)
else:
print(f"\n{Style.BRIGHT}Результаты сохранены в файл:{Style.RESET_ALL}", filename)
if os.name == 'nt':
input(f"Нажмите {green('Enter')} для выхода...")
except KeyboardInterrupt:
print(f"\n{red('Программа прервана пользователем')}")
except Exception as e:
print(f"\n{red('Критическая ошибка:')} {e}")
finally:
await cleanup_http_client()
if __name__ == "__main__":
asyncio.run(main())
try:
asyncio.run(main())
except KeyboardInterrupt:
print(f"\n{red('Программа прервана пользователем')}")
except Exception as e:
print(f"\n{red('Критическая ошибка:')} {e}")

130
old/config.ini Normal file
View 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
View 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())

View File

@@ -1,16 +1,24 @@
Antifilter community edition: https://community.antifilter.download/list/domains.lst
Youtube: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-youtube.txt
Facebook: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-facebook.txt
Openai: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-openai.txt
Tik-Tok: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-tiktok.txt
Instagram: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-instagram.txt
Twitter: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-twitter.txt
Netflix: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-netflix.txt
Bing: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-bing.txt
Adobe: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-adobe.txt
Apple: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-apple.txt
Google: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-google.txt
Torrent Truckers: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-ttruckers.txt
Search engines: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-search-engines.txt
Github Copilot: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-github-сopilot.txt
Twitch: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platforms/dns-twitch.txt
ITDog Inside: https://raw.githubusercontent.com/itdoginfo/allow-domains/main/Russia/inside-raw.lst
ITDog Outside: https://raw.githubusercontent.com/itdoginfo/allow-domains/main/Russia/outside-raw.lst
Youtube: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-youtube.txt
Facebook: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-facebook.txt
Openai: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-openai.txt
Tik-Tok: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-tiktok.txt
Instagram: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-instagram.txt
Twitter: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-twitter.txt
Netflix: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-netflix.txt
Bing: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-bing.txt
Adobe: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-adobe.txt
Apple: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-apple.txt
Google: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-google.txt
Torrent Trackers: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-ttrackers.txt
Search engines: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-search-engines.txt
Github Copilot: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-github-pilot.txt
Twitch: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-twitch.txt
Discord: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-discord.txt
Jetbrains: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-jetbrains.txt
Xbox: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-xbox.txt
Telegram: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-telegram.txt
Online movie theaters: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-onlinetheater.txt
Windsurf: https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platforms/dns-windsurf.txt

View 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

View File

@@ -56,5 +56,4 @@ uk-adobe.com
upload.adobe.io
user.adobe.io
watch.adobe.io
web.adobe.io
www.adobe.com
web.adobe.io

View File

@@ -1,211 +1,209 @@
a.ns.apple.com,
ab.apple.com.akadns.net,
aidc.apple.com,
albert.apple.com,
amp-api.apps.apple.com,
amp-api.apps.apple.com.edgekey.net,
amp-api.books.apple.com.edgekey.net,
amp-api.fitness.apple.com,
amp-api.media.apple.com,
amp-api.music.apple.com,
amp-api.podcasts.apple.com,
amp-api.videos.apple.com,
aod.itunes.apple.com,
api.apple-cloudkit.com,
api.apple-cloudkit.fe.apple-dns.net,
api.apple-cloudkit.fe2.apple-dns.net,
api.apps.apple.com,
api.smoot.apple.com,
api-adservices.apple.com,
apple.co,
apple.com,
apple.com.cn,
appleid.apple.com,
appleid.cdn-apple.com,
appleid.idms-apple.com,
apple-mapkit.com,
appleseedcdn.apple.com,
apps.apple.com,
auth.itunes.apple.com,
ax.itunes.apple.com.edgesuite.net,
bag.itunes.apple.com,
bag-cdn.itunes-apple.com.akadns.net,
basejumper.apple.com,
bcrw.apple.com,
beta.music.apple.com.edgesuite.net,
big.itunes.apple.com,
bookkeeper.itunes.apple.com,
books.apple.com.edgekey.net,
bpapi.apple.com,
buy.itunes.apple.com,
buylite.itunes.apple.com,
c.apple.news,
ca.iadsdk.apple.com,
captive.apple.com,
carrierbundle.itunes.apple.com,
cdn.apple.com.c.footprint.net,
cdn.apple-cloudkit.com,
cdn.apple-mapkit.com,
cdn-apple.com,
cds.apple.com,
ce.apple-dns.net,
certs.apple.com,
cf.iadsdk.apple.com,
challenge.gc.apple.com,
cl1.apple.com,
cl2.apple.com,
cl3.apple.com,
cl4.apple.com,
cl5.apple.com,
classical.music.apple.com.edgesuite.net,
client-api.itunes.apple.com,
clientflow.apple.com,
comm-cohort.ess.apple.com,
communities.apple.com,
configuration.apple.com,
courier-ab-vs.push.apple.com,
cssubmissions.apple.com,
cstat.cdn-apple.com,
d.ns.apple.com,
dejavu.apple.com,
device-config.pcms.apple.com,
discussions.apple.com.edgekey.net,
dns.apple.com,
docs-assets.developer.apple.com,
doh.dns.apple.com,
downloaddispatch.itunes.apple.com,
edge.apple,
entitlements.itunes.apple.com,
ess.apple.com,
euro.apple.com,
experiments.apple.com,
fides-pol.apple.com,
finance-app.itunes.apple.com,
forums.developer.apple.com,
fpinit.itunes.apple.com,
friend.gc.apple.com,
g.apple.com,
gc.apple.com,
gdmf.apple.com,
genius-3.itunes.apple.com.edgekey.net,
geo.itunes.apple.com,
gs.apple.com,
gsa.apple.com,
gsas.apple.com,
gs-loc.apple.com,
gsp10-ssl.apple.com,
gsp36-ssl.ls.apple.com,
gsp47-ssl.ls.apple.com,
gsp51-ssl.ls.apple.com,
gsp57-ssl-background.ls.apple.com,
gsp64-ssl.ls.apple.com,
gsp85-ssl.ls.apple.com,
gspe11-ssl.ls.apple.com.edgekey.net,
gspe19-ssl.ls.apple.com,
gspe21-ssl.ls.apple.com,
gspe35-ssl.ls.apple.com,
gspe72-ssl.ls.apple.com.akamaized.net,
guzzoni.apple.com,
help.apple.com,
hls-svod.itunes.apple.com,
iadcontent.apple.com.edgekey.net,
iadsdk.apple.com,
identity.apple.com,
inappcheck.itunes.apple.com,
init.ess.apple.com,
init.gc.apple.com,
init.itunes.apple.com,
init.push.apple.com,
iphone-ld.apple.com,
iphonesubmissions.apple.com,
itunes.apple.com,
js-cdn.music.apple.com,
km.support.apple.com,
kt-prod.ess.apple.com,
lcdn-locator.apple.com,
librarydaap.itunes.apple.com,
linkmaker.itunes.apple.com.edgekey.net,
lookup-api.apple.com,
ls.apple.com,
ma-albert-prod.apple.com,
ma-sq-device.apple.com,
me.apple-dns.net,
mesu.apple.com,
ml.cdn-apple.com,
mobileapp.apple.com.edgekey.net,
musicstatus.itunes.apple.com,
mzstorekit.itunes.apple.com,
nc-pod2-smp-device-asset.apple.com,
news-assets.apple.com,
news-client-search.apple.com,
news-edge.apple.com,
news-events.apple.com,
newsletter-edge.apple.com,
northamerica-1.object-storage.apple.com,
notes-analytics-events.apple.com,
ocsp.apple.com,
odr.itunes.apple.com,
ontology.health.apple.com,
osxapps.itunes.apple.com,
p16-buy.itunes.apple.com,
p24-buy.itunes.apple.com,
p26-buy.itunes.apple.com,
p50-buy.itunes.apple.com,
p6-buy.itunes.apple.com,
pancake.apple.com,
partiality.itunes.apple.com,
pba.apple.com,
pd.itunes.apple.com,
play.itunes.apple.com,
podcasts.apple.com.edgekey.net,
portal-repair-uat-apple.com,
profile.ess.apple.com,
pr-pod1-smp-device-asset.apple.com,
publicassets.cdn-apple.com,
push.apple.com,
query.ess.apple.com,
quid-apple.com,
radarsubmissions.apple.com,
radio.itunes.apple.com,
rn-albert-prod.apple.com,
safebrowsing.apple,
safety-alert.apple.com,
sandbox.itunes.apple.com,
sas.pcms.apple.com,
sb.music.apple.com,
se2.itunes.apple.com,
seed.siri.apple.com,
sequoia.cdn-apple.com,
sf-api-token-service.itunes.apple.com,
sgp-albert-prod.apple.com,
shazam-insights.cdn-apple.com,
shop-apple.com,
siri.apple.com,
smoot.apple.com,
smp-device-content.apple.com,
speedysub.itunes.apple.com,
sps-media.apple.com,
static.cdn-apple.com.edgekey.net,
stats.gc.apple.com,
stocks-data-service.apple.com,
store.storeimages.cdn-apple.com.edgekey.net,
streamingaudio.itunes.apple.com,
su.itunes.apple.com,
support.apple.com,
swscan.apple.com,
sync.itunes.apple.com,
testflight.apple.com,
time.apple.com,
tr.iadsdk.apple.com,
unlinkability.apple.com,
updates.cdn-apple.com,
upp.itunes.apple.com,
us-courier.push.apple.com,
use1-tdm-prod.apple.com,
weather-data.apple.com,
websitereview.corp.apple.com,
wps.apple.com,
wu.apple.com.akadns.net,
www.apple.com,
www.apple.com.cn,
a.ns.apple.com
ab.apple.com.akadns.net
aidc.apple.com
albert.apple.com
amp-api.apps.apple.com
amp-api.apps.apple.com.edgekey.net
amp-api.books.apple.com.edgekey.net
amp-api.fitness.apple.com
amp-api.media.apple.com
amp-api.music.apple.com
amp-api.podcasts.apple.com
amp-api.videos.apple.com
aod.itunes.apple.com
api.apple-cloudkit.com
api.apple-cloudkit.fe.apple-dns.net
api.apple-cloudkit.fe2.apple-dns.net
api.apps.apple.com
api.smoot.apple.com
api-adservices.apple.com
apple.co
apple.com
apple.com.cn
appleid.apple.com
appleid.cdn-apple.com
appleid.idms-apple.com
apple-mapkit.com
appleseedcdn.apple.com
apps.apple.com
auth.itunes.apple.com
ax.itunes.apple.com.edgesuite.net
bag.itunes.apple.com
bag-cdn.itunes-apple.com.akadns.net
basejumper.apple.com
bcrw.apple.com
beta.music.apple.com.edgesuite.net
big.itunes.apple.com
bookkeeper.itunes.apple.com
books.apple.com.edgekey.net
bpapi.apple.com
buy.itunes.apple.com
buylite.itunes.apple.com
c.apple.news
ca.iadsdk.apple.com
captive.apple.com
carrierbundle.itunes.apple.com
cdn.apple.com.c.footprint.net
cdn.apple-cloudkit.com
cdn.apple-mapkit.com
cdn-apple.com
cds.apple.com
ce.apple-dns.net
certs.apple.com
cf.iadsdk.apple.com
challenge.gc.apple.com
cl1.apple.com
cl2.apple.com
cl3.apple.com
cl4.apple.com
cl5.apple.com
classical.music.apple.com.edgesuite.net
client-api.itunes.apple.com
clientflow.apple.com
comm-cohort.ess.apple.com
communities.apple.com
configuration.apple.com
courier-ab-vs.push.apple.com
cssubmissions.apple.com
cstat.cdn-apple.com
d.ns.apple.com
dejavu.apple.com
device-config.pcms.apple.com
discussions.apple.com.edgekey.net
dns.apple.com
docs-assets.developer.apple.com
doh.dns.apple.com
downloaddispatch.itunes.apple.com
edge.apple
entitlements.itunes.apple.com
ess.apple.com
euro.apple.com
experiments.apple.com
fides-pol.apple.com
finance-app.itunes.apple.com
forums.developer.apple.com
fpinit.itunes.apple.com
friend.gc.apple.com
g.apple.com
gc.apple.com
gdmf.apple.com
genius-3.itunes.apple.com.edgekey.net
geo.itunes.apple.com
gs.apple.com
gsa.apple.com
gsas.apple.com
gs-loc.apple.com
gsp10-ssl.apple.com
gsp36-ssl.ls.apple.com
gsp47-ssl.ls.apple.com
gsp51-ssl.ls.apple.com
gsp57-ssl-background.ls.apple.com
gsp64-ssl.ls.apple.com
gsp85-ssl.ls.apple.com
gspe11-ssl.ls.apple.com.edgekey.net
gspe19-ssl.ls.apple.com
gspe21-ssl.ls.apple.com
gspe35-ssl.ls.apple.com
gspe72-ssl.ls.apple.com.akamaized.net
guzzoni.apple.com
help.apple.com
hls-svod.itunes.apple.com
iadcontent.apple.com.edgekey.net
iadsdk.apple.com
identity.apple.com
inappcheck.itunes.apple.com
init.ess.apple.com
init.gc.apple.com
init.itunes.apple.com
init.push.apple.com
iphone-ld.apple.com
iphonesubmissions.apple.com
itunes.apple.com
js-cdn.music.apple.com
km.support.apple.com
kt-prod.ess.apple.com
lcdn-locator.apple.com
librarydaap.itunes.apple.com
linkmaker.itunes.apple.com.edgekey.net
lookup-api.apple.com
ls.apple.com
ma-albert-prod.apple.com
ma-sq-device.apple.com
me.apple-dns.net
mesu.apple.com
ml.cdn-apple.com
mobileapp.apple.com.edgekey.net
musicstatus.itunes.apple.com
mzstorekit.itunes.apple.com
nc-pod2-smp-device-asset.apple.com
news-assets.apple.com
news-client-search.apple.com
news-edge.apple.com
news-events.apple.com
newsletter-edge.apple.com
northamerica-1.object-storage.apple.com
notes-analytics-events.apple.com
ocsp.apple.com
odr.itunes.apple.com
ontology.health.apple.com
osxapps.itunes.apple.com
p16-buy.itunes.apple.com
p24-buy.itunes.apple.com
p26-buy.itunes.apple.com
p50-buy.itunes.apple.com
p6-buy.itunes.apple.com
pancake.apple.com
partiality.itunes.apple.com
pba.apple.com
pd.itunes.apple.com
play.itunes.apple.com
podcasts.apple.com.edgekey.net
portal-repair-uat-apple.com
profile.ess.apple.com
pr-pod1-smp-device-asset.apple.com
publicassets.cdn-apple.com
push.apple.com
query.ess.apple.com
quid-apple.com
radarsubmissions.apple.com
radio.itunes.apple.com
rn-albert-prod.apple.com
safebrowsing.apple
safety-alert.apple.com
sandbox.itunes.apple.com
sas.pcms.apple.com
sb.music.apple.com
se2.itunes.apple.com
seed.siri.apple.com
sequoia.cdn-apple.com
sf-api-token-service.itunes.apple.com
sgp-albert-prod.apple.com
shazam-insights.cdn-apple.com
shop-apple.com
siri.apple.com
smoot.apple.com
smp-device-content.apple.com
speedysub.itunes.apple.com
sps-media.apple.com
static.cdn-apple.com.edgekey.net
stats.gc.apple.com
stocks-data-service.apple.com
store.storeimages.cdn-apple.com.edgekey.net
streamingaudio.itunes.apple.com
su.itunes.apple.com
support.apple.com
swscan.apple.com
sync.itunes.apple.com
testflight.apple.com
time.apple.com
tr.iadsdk.apple.com
unlinkability.apple.com
updates.cdn-apple.com
upp.itunes.apple.com
us-courier.push.apple.com
use1-tdm-prod.apple.com
weather-data.apple.com
websitereview.corp.apple.com
wps.apple.com
wu.apple.com.akadns.net
xp.apple.com

View File

@@ -20,5 +20,4 @@ services.bingapis.com
ssl.bing.com
sydney.bing.com
th.bing.com
www.bing.com
www2.bing.com

4118
platforms/dns-discord.txt Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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

View File

@@ -1,3 +0,0 @@
copilot-telemetry.githubusercontent.com
copilot-proxy.githubusercontent.com
githubcopilot.com

View File

@@ -28,5 +28,4 @@ support.google.com
cloud.google.com
gvt2.com
gvt3.com
google.ru
www.google.com
google.ru

View File

@@ -1,11 +1,70 @@
bookstagram.com
Www.instagram.com
a.ns.instagram.com
about.instagram.com
accountscenter.instagram.com
admin.instagram.com
api.instagram.com
applink.instagram.com
autodiscover.instagram.com
b.i.instagram.com
b.ns.instagram.com
b.secure.instagram.com
badges.instagram.com
blog.instagram.com
bookstagram.com
business.instagram.com
c.ns.instagram.com
carstagram.com
cdninstagram.com
chickstagram.com
community.instagram.com
connect.facebook.net
d.ns.instagram.com
dyi.www.instagram.com
edge-mqtt-fallback.facebook.com
edge-mqtt.facebook.com
edge-chat.instagram.com
engineering.instagram.com
fna-instagram-shv-01-fagc1.fbcdn.net
fna-instagram-shv-01-fdel1.fbcdn.net
fna-instagram-shv-01-ffcm1.fbcdn.net
fna-instagram-shv-01-ffjr1.fbcdn.net
fna-instagram-shv-01-fjai2.fbcdn.net
fna-instagram-shv-01-fktw1.fbcdn.net
fna-instagram-shv-01-fmaa1.fbcdn.net
fna-instagram-shv-01-fpat2.fbcdn.net
fna-instagram-shv-01-fric1.fbcdn.net
fna-instagram-shv-01-fsac1.fbcdn.net
fna-instagram-shv-01-fvga2.fbcdn.net
fna-instagram-shv-02-fagc1.fbcdn.net
fna-instagram-shv-02-fdel1.fbcdn.net
fna-instagram-shv-02-ffcm1.fbcdn.net
fna-instagram-shv-02-ffjr1.fbcdn.net
fna-instagram-shv-02-fhyd1.fbcdn.net
fna-instagram-shv-02-fixc1.fbcdn.net
fna-instagram-shv-02-fmaa1.fbcdn.net
fna-instagram-shv-02-fmem1.fbcdn.net
fna-instagram-shv-02-fsac1.fbcdn.net
fna-instagram-shv-03-fblr1.fbcdn.net
fna-instagram-shv-03-fdel1.fbcdn.net
fna-instagram-shv-03-ffjr1.fbcdn.net
fna-instagram-shv-03-fmaa1.fbcdn.net
fna-instagram-shv-04-fblr1.fbcdn.net
fna-instagram-shv-04-fdel1.fbcdn.net
fna-instagram-shv-04-ffjr1.fbcdn.net
fna-instagram-shv-04-fmaa1.fbcdn.net
gateway.instagram.com
geo-p42.instagram.com
geo.instagram.com
graph-fallback.instagram.com
graph.facebook.com
graph.instagram.com
graphql.instagram.com
help.instagram.com
help.latest.instagram.com
hyperlapse.instagram.com
i-fallback.instagram.com
i.instagram.com
ig.me
igcdn.com
igsonar.com
igtv.com
imstagram.com
imtagram.com
instaadder.com
@@ -20,9 +79,82 @@ instagor.com
instagram-brand.com
instagram-engineering.com
instagram-help.com
instagram-p15-shv-01-arn2.fbcdn.net
instagram-p15-shv-01-lga3.fbcdn.net
instagram-p15-shv-01-mia3.fbcdn.net
instagram-p15-shv-01-sea1.fbcdn.net
instagram-p15-shv-02-bom1.fbcdn.net
instagram-p3-shv-01-arn2.fbcdn.net
instagram-p3-shv-01-atl3.fbcdn.net
instagram-p3-shv-01-ber1.fbcdn.net
instagram-p3-shv-01-bom1.fbcdn.net
instagram-p3-shv-01-bru2.fbcdn.net
instagram-p3-shv-01-cgk1.fbcdn.net
instagram-p3-shv-01-del1.fbcdn.net
instagram-p3-shv-01-dus1.fbcdn.net
instagram-p3-shv-01-eze1.fbcdn.net
instagram-p3-shv-01-gmp1.fbcdn.net
instagram-p3-shv-01-gru1.fbcdn.net
instagram-p3-shv-01-gru2.fbcdn.net
instagram-p3-shv-01-hel3.fbcdn.net
instagram-p3-shv-01-iad3.fbcdn.net
instagram-p3-shv-01-lax3.fbcdn.net
instagram-p3-shv-01-lga3.fbcdn.net
instagram-p3-shv-01-los2.fbcdn.net
instagram-p3-shv-01-maa2.fbcdn.net
instagram-p3-shv-01-mad1.fbcdn.net
instagram-p3-shv-01-mia3.fbcdn.net
instagram-p3-shv-01-mrs2.fbcdn.net
instagram-p3-shv-01-msp1.fbcdn.net
instagram-p3-shv-01-mxp1.fbcdn.net
instagram-p3-shv-01-nrt1.fbcdn.net
instagram-p3-shv-01-otp1.fbcdn.net
instagram-p3-shv-01-prg1.fbcdn.net
instagram-p3-shv-01-qro1.fbcdn.net
instagram-p3-shv-01-scl2.fbcdn.net
instagram-p3-shv-01-sea1.fbcdn.net
instagram-p3-shv-01-sjc3.fbcdn.net
instagram-p3-shv-01-sof1.fbcdn.net
instagram-p3-shv-01-ssn1.fbcdn.net
instagram-p3-shv-01-syd2.fbcdn.net
instagram-p3-shv-01-tpe1.fbcdn.net
instagram-p3-shv-01-vie1.fbcdn.net
instagram-p3-shv-01-yyz1.fbcdn.net
instagram-p3-shv-02-bom1.fbcdn.net
instagram-p3-shv-02-gru2.fbcdn.net
instagram-p3-shv-02-maa2.fbcdn.net
instagram-p3-shv-02-mia3.fbcdn.net
instagram-p3-shv-02-mrs2.fbcdn.net
instagram-p4-shv-01-arn2.fbcdn.net
instagram-p4-shv-01-lga3.fbcdn.net
instagram-p4-shv-01-mia3.fbcdn.net
instagram-p4-shv-01-sea1.fbcdn.net
instagram-p4-shv-02-bom1.fbcdn.net
instagram-p42-shv-01-arn2.fbcdn.net
instagram-p42-shv-01-bru2.fbcdn.net
instagram-p42-shv-01-lga3.fbcdn.net
instagram-p42-shv-01-mad1.fbcdn.net
instagram-p42-shv-01-mia3.fbcdn.net
instagram-p42-shv-01-mrs2.fbcdn.net
instagram-p42-shv-01-mxp1.fbcdn.net
instagram-p42-shv-01-nrt1.fbcdn.net
instagram-p42-shv-01-otp1.fbcdn.net
instagram-p42-shv-01-prg1.fbcdn.net
instagram-p42-shv-01-sea1.fbcdn.net
instagram-p42-shv-01-sof1.fbcdn.net
instagram-p42-shv-01-syd2.fbcdn.net
instagram-p42-shv-01-vie1.fbcdn.net
instagram-p42-shv-01-yyz1.fbcdn.net
instagram-p42-shv-02-bom1.fbcdn.net
instagram-press.com
instagram-press.net
instagram.c10r.instagram.com
instagram.com
instagram.fbeg10-1.fna.fbcdn.net
instagram.fkiv7-1.fna.fbcdn.net
instagram.frix7-1.fna.fbcdn.net
instagram.fsof11-1.fna.fbcdn.net
instagram.fsof8-1.fna.fbcdn.net
instagramhashtags.net
instagramhilecim.com
instagramhilesi.org
@@ -42,9 +174,284 @@ instanttelegram.com
instaplayer.net
instastyle.tv
instgram.com
l.instagram.com
live-dev.instagram.com
live-upload-staging.instagram.com
live-upload.instagram.com
logger.instagram.com
lookaside.facebook.com
lookaside.instagram.com
m.instagram.com
maps.instagram.com
my-od-3.instagram.com
my-od.instagram.com
oninstagram.com
online-instagram.com
onlineinstagram.com
parents.instagram.com
platform.instagram.com
preprod.instagram.com
privacycenter.instagram.com
scontent-a-ams.cdninstagram.com
scontent-a-atl.cdninstagram.com
scontent-a-bru.cdninstagram.com
scontent-a-cdg.cdninstagram.com
scontent-a-dfw.cdninstagram.com
scontent-a-gru.cdninstagram.com
scontent-a-hkg.cdninstagram.com
scontent-a-hkg4-2.cdninstagram.com
scontent-a-iad.cdninstagram.com
scontent-a-iev1-1.cdninstagram.com
scontent-a-lax.cdninstagram.com
scontent-a-lga.cdninstagram.com
scontent-a-lhr.cdninstagram.com
scontent-a-mad.cdninstagram.com
scontent-a-mct1-1.cdninstagram.com
scontent-a-mia.cdninstagram.com
scontent-a-mxp.cdninstagram.com
scontent-a-nrt.cdninstagram.com
scontent-a-sea.cdninstagram.com
scontent-a-sin.cdninstagram.com
scontent-a-sjc.cdninstagram.com
scontent-a-vie.cdninstagram.com
scontent-a.cdninstagram.com
scontent-akl1-1.cdninstagram.com
scontent-ams.cdninstagram.com
scontent-ams2-1.cdninstagram.com
scontent-ams4-1.cdninstagram.com
scontent-arn2-1.cdninstagram.com
scontent-arn2-1.xx.fbcdn.net
scontent-atl.cdninstagram.com
scontent-atl3-1.cdninstagram.com
scontent-atl3-2.cdninstagram.com
scontent-b-ams.cdninstagram.com
scontent-b-atl.cdninstagram.com
scontent-b-bru.cdninstagram.com
scontent-b-dfw.cdninstagram.com
scontent-b-gru.cdninstagram.com
scontent-b-hkg.cdninstagram.com
scontent-b-hkg4-1.cdninstagram.com
scontent-b-hkg4-2.cdninstagram.com
scontent-b-iad.cdninstagram.com
scontent-b-iev1-1.cdninstagram.com
scontent-b-lax.cdninstagram.com
scontent-b-lga.cdninstagram.com
scontent-b-lhr.cdninstagram.com
scontent-b-mct1-1.cdninstagram.com
scontent-b-mia.cdninstagram.com
scontent-b-mxp.cdninstagram.com
scontent-b-nrt.cdninstagram.com
scontent-b-sin.cdninstagram.com
scontent-b-vie.cdninstagram.com
scontent-b.cdninstagram.com
scontent-ber1-1.cdninstagram.com
scontent-bom1-1.cdninstagram.com
scontent-bom1-2.cdninstagram.com
scontent-bos5-1.cdninstagram.com
scontent-bru.cdninstagram.com
scontent-bru2-1.cdninstagram.com
scontent-ccu1-1.cdninstagram.com
scontent-cdg.cdninstagram.com
scontent-cdg4-1.cdninstagram.com
scontent-cdg4-2.cdninstagram.com
scontent-cdg4-3.cdninstagram.com
scontent-cgk.cdninstagram.com
scontent-cgk1-1.cdninstagram.com
scontent-cgk1-2.cdninstagram.com
scontent-cph2-1.cdninstagram.com
scontent-cpt1-1.cdninstagram.com
scontent-del1-1.cdninstagram.com
scontent-del1-2.cdninstagram.com
scontent-dfw.cdninstagram.com
scontent-dfw5-1.cdninstagram.com
scontent-dfw5-2.cdninstagram.com
scontent-dub4-1.cdninstagram.com
scontent-dus.cdninstagram.com
scontent-dus1-1.cdninstagram.com
scontent-eze1-1.cdninstagram.com
scontent-fco2-1.cdninstagram.com
scontent-fml1-1.cdninstagram.com
scontent-fra3-1.cdninstagram.com
scontent-fra3-2.cdninstagram.com
scontent-fra5-1.cdninstagram.com
scontent-fra5-2.cdninstagram.com
scontent-gmp1-1.cdninstagram.com
scontent-gru.cdninstagram.com
scontent-gru1-1.cdninstagram.com
scontent-gru1-2.cdninstagram.com
scontent-gru2-1.cdninstagram.com
scontent-gru2-2.cdninstagram.com
scontent-gua1-1.cdninstagram.com
scontent-ham3-1.cdninstagram.com
scontent-hbe1-1.cdninstagram.com
scontent-hel3-1.cdninstagram.com
scontent-hel3-1.xx.fbcdn.net
scontent-hkg.cdninstagram.com
scontent-hkg4-1.cdninstagram.com
scontent-hkg4-2.cdninstagram.com
scontent-hou1-1.cdninstagram.com
scontent-iad.cdninstagram.com
scontent-iad3-1.cdninstagram.com
scontent-iad3-2.cdninstagram.com
scontent-iev1-1.cdninstagram.com
scontent-ist1-1.cdninstagram.com
scontent-itm1-1.cdninstagram.com
scontent-lax.cdninstagram.com
scontent-lax3-1.cdninstagram.com
scontent-lax3-2.cdninstagram.com
scontent-lga.cdninstagram.com
scontent-lga3-1.cdninstagram.com
scontent-lga3-2.cdninstagram.com
scontent-lhr.cdninstagram.com
scontent-lhr8-1.cdninstagram.com
scontent-lhr8-2.cdninstagram.com
scontent-lim1-1.cdninstagram.com
scontent-lis1-1.cdninstagram.com
scontent-los2-1.cdninstagram.com
scontent-maa2-1.cdninstagram.com
scontent-maa2-2.cdninstagram.com
scontent-mad.cdninstagram.com
scontent-mad1-1.cdninstagram.com
scontent-mad2-1.cdninstagram.com
scontent-man2-1.cdninstagram.com
scontent-mct1-1.cdninstagram.com
scontent-mia.cdninstagram.com
scontent-mia3-1.cdninstagram.com
scontent-mia3-2.cdninstagram.com
scontent-mrs.cdninstagram.com
scontent-mrs2-1.cdninstagram.com
scontent-mrs2-2.cdninstagram.com
scontent-msp1-1.cdninstagram.com
scontent-muc2-1.cdninstagram.com
scontent-mxp.cdninstagram.com
scontent-mxp1-1.cdninstagram.com
scontent-mxp2-1.cdninstagram.com
scontent-nrt.cdninstagram.com
scontent-nrt1-1.cdninstagram.com
scontent-nrt1-2.cdninstagram.com
scontent-ord5-1.cdninstagram.com
scontent-ord5-2.cdninstagram.com
scontent-otp1-1.cdninstagram.com
scontent-otp1-1.xx.fbcdn.net
scontent-pmo1-1.cdninstagram.com
scontent-prg1-1.cdninstagram.com
scontent-prg1-1.xx.fbcdn.net
scontent-qro1-1.cdninstagram.com
scontent-qro1-2.cdninstagram.com
scontent-scl2-1.cdninstagram.com
scontent-sea.cdninstagram.com
scontent-sea1-1.cdninstagram.com
scontent-sin.cdninstagram.com
scontent-sin6-1.cdninstagram.com
scontent-sin6-2.cdninstagram.com
scontent-sin6-3.cdninstagram.com
scontent-sin6-4.cdninstagram.com
scontent-sjc.cdninstagram.com
scontent-sjc3-1.cdninstagram.com
scontent-sof1-1.cdninstagram.com
scontent-sof1-2.cdninstagram.com
scontent-sof1-2.xx.fbcdn.net
scontent-ssn1-1.cdninstagram.com
scontent-syd2-1.cdninstagram.com
scontent-tpe.cdninstagram.com
scontent-tpe1-1.cdninstagram.com
scontent-vie.cdninstagram.com
scontent-vie1-1.cdninstagram.com
scontent-yyz1-1.cdninstagram.com
scontent-zrh1-1.cdninstagram.com
scontent.cdninstagram.com
scontent.fbeg10-1.fna.fbcdn.net
secure.latest.instagram.com
shortwave.instagram.com
unknownjapan.instagram.com
upload-ec2.instagram.com
upload.instagram.com
video-ber1-1.cdninstagram.com
video-dus1-1.cdninstagram.com
video-eze1-1.cdninstagram.com
video-gru1-2.cdninstagram.com
video-hkg4-1.cdninstagram.com
video-hkg4-2.cdninstagram.com
video-iad3-1.cdninstagram.com
video-qro1-1.cdninstagram.com
video-ssn1-1.cdninstagram.com
video-tpe1-1.cdninstagram.com
web-instagram.net
web.facebook.com
wellbeing.instagram.com
www.ig.me
www.instagram.com
www.secure.instagram.com
wwwinstagram.com
instagram.fkiv7-1.fna.fbcdn.net
z-p15-scontent-a-hkg4-1.cdninstagram.com
z-p15-scontent-a-hkg4-2.cdninstagram.com
z-p15-scontent-a-iev1-1.cdninstagram.com
z-p15-scontent-a-mct1-1.cdninstagram.com
z-p15-scontent-b-hkg4-1.cdninstagram.com
z-p15-scontent-b-hkg4-2.cdninstagram.com
z-p15-scontent-b-iev1-1.cdninstagram.com
z-p15-scontent-b-mct1-1.cdninstagram.com
z-p15-scontent-bru2-1.cdninstagram.com
z-p15-scontent-hkg4-1.cdninstagram.com
z-p15-scontent-hkg4-2.cdninstagram.com
z-p15-scontent-iev1-1.cdninstagram.com
z-p15-scontent-mct1-1.cdninstagram.com
z-p15-scontent.cdninstagram.com
z-p15.www.instagram.com
z-p3.www.instagram.com
z-p4-scontent-a-hkg4-1.cdninstagram.com
z-p4-scontent-a-hkg4-2.cdninstagram.com
z-p4-scontent-a-iev1-1.cdninstagram.com
z-p4-scontent-a-mct1-1.cdninstagram.com
z-p4-scontent-ams4-1.cdninstagram.com
z-p4-scontent-arn2-1.cdninstagram.com
z-p4-scontent-b-hkg4-1.cdninstagram.com
z-p4-scontent-b-hkg4-2.cdninstagram.com
z-p4-scontent-b-iev1-1.cdninstagram.com
z-p4-scontent-b-mct1-1.cdninstagram.com
z-p4-scontent-cgk1-1.cdninstagram.com
z-p4-scontent-cgk1-2.cdninstagram.com
z-p4-scontent-cph2-1.cdninstagram.com
z-p4-scontent-dfw5-1.cdninstagram.com
z-p4-scontent-hkg4-1.cdninstagram.com
z-p4-scontent-hkg4-2.cdninstagram.com
z-p4-scontent-iev1-1.cdninstagram.com
z-p4-scontent-mct1-1.cdninstagram.com
z-p4-scontent-mxp1-1.cdninstagram.com
z-p4-scontent-nrt1-1.cdninstagram.com
z-p4-scontent-otp1-1.cdninstagram.com
z-p4-scontent-sea1-1.cdninstagram.com
z-p4-scontent-sin6-1.cdninstagram.com
z-p4-scontent-sin6-2.cdninstagram.com
z-p4-scontent-sin6-3.cdninstagram.com
z-p4-scontent-ssn1-1.cdninstagram.com
z-p4-scontent-vie1-1.cdninstagram.com
z-p4-scontent.cdninstagram.com
z-p4.graph.instagram.com
z-p42-chat-e2ee-ig.facebook.com
z-p42-instagram.c10r.instagram.com
z-p42-scontent-a-hkg4-1.cdninstagram.com
z-p42-scontent-a-hkg4-2.cdninstagram.com
z-p42-scontent-a-iev1-1.cdninstagram.com
z-p42-scontent-a-mct1-1.cdninstagram.com
z-p42-scontent-arn2-1.cdninstagram.com
z-p42-scontent-b-hkg4-1.cdninstagram.com
z-p42-scontent-b-hkg4-2.cdninstagram.com
z-p42-scontent-b-iev1-1.cdninstagram.com
z-p42-scontent-b-mct1-1.cdninstagram.com
z-p42-scontent-b-sjc3-1.cdninstagram.com
z-p42-scontent-bru2-1.cdninstagram.com
z-p42-scontent-dus1-1.cdninstagram.com
z-p42-scontent-gru2-1.cdninstagram.com
z-p42-scontent-gru2-2.cdninstagram.com
z-p42-scontent-hkg4-1.cdninstagram.com
z-p42-scontent-hkg4-2.cdninstagram.com
z-p42-scontent-iev1-1.cdninstagram.com
z-p42-scontent-los2-1.cdninstagram.com
z-p42-scontent-mct1-1.cdninstagram.com
z-p42-scontent-prg1-1.cdninstagram.com
z-p42-scontent-sea1-1.cdninstagram.com
z-p42-scontent-sof1-1.cdninstagram.com
z-p42-scontent-vie1-1.cdninstagram.com
z-p42-scontent.cdninstagram.com
z-p42.i.instagram.com

116
platforms/dns-jetbrains.txt Normal file
View File

@@ -0,0 +1,116 @@
jetbrains.com.cn
jb.gg
myjetbrains.com
jetbrains.com
intellij.net
jetbrains.space
awsproxy.pkg-cdn.jetbrains.space
byid.eu-1.jetbrains.space
byid.jetbrains.space
cloudfront.pkg-cdn.jetbrains.space
corona.jetbrains.space
dc.jetbrains.space
element.jetbrains.space
eu-1.jetbrains.space
justtoplay.jetbrains.space
maven.jetbrains.space
maven.pkg.jetbrains.space
ngenix.assets.service.jetbrains.space
pkg-cdn.jetbrains.space
pkg.eu-1.jetbrains.space
registry.eu-1.jetbrains.space
registry.jetbrains.space
ruhlaender.jetbrains.space
space-cdn.jetbrains.space
swu-acm.jetbrains.space
walx.jetbrains.space
academy.jetbrains.com
account.jetbrains.com
adobe.fls.jetbrains.com
amazon.fls.jetbrains.com
ap-help.api.jetbrains.com
api-test.sandbox-resellers.jetbrains.com
autoconfig.api.jetbrains.com
autodiscover.api.jetbrains.com
blog.jetbrains.com
blogs.jetbrains.com
ca.jetbrains.com
cai.jetbrains.com
cloudconfig.jetbrains.com
code-with-me.jetbrains.com
code2art.jetbrains.com
codewithme-lobby-production.api.jetbrains.com
codewithme-lobby-staging.api.jetbrains.com
codewithme-lobby.api.jetbrains.com
codewithme-relay-europe-north1-1.api.jetbrains.com
codewithme-relay-europe-north1-2.api.jetbrains.com
comments.blog.jetbrains.com
configr.jetbrains.com
confluence.jetbrains.com
datalore-forum.jetbrains.com
datalore.jetbrains.com
dotcover-support.jetbrains.com
dotmemory-support.jetbrains.com
dotnet-ea.services.jetbrains.com
dotpeek-support.jetbrains.com
dottrace-support.jetbrains.com
download-cdn.jetbrains.com
dunnhumby.fls.jetbrains.com
ea.jetbrains.com
eap.jetbrains.com
employee-guides.jetbrains.com
fleet-relay.api.jetbrains.com
ge.jetbrains.com
geo2.datalore.jetbrains.com
guide.master-zdchint.mau.jetbrains.com
guide.staging-zdchint.mau.jetbrains.com
hacktoberfest2020.mau.jetbrains.com
handle.prod.csat.mau.jetbrains.com
handle.staging.csat.mau.jetbrains.com
hello.jetbrains.com
ij-perf.jetbrains.com
index-cdn.jetbrains.com
int.api.jetbrains.com
internship.jetbrains.com
jb-team.fls.jetbrains.com
jbstats.jetbrains.com
jetarchive.jetbrains.com
jetpeople.jetbrains.com
local.api.jetbrains.com
lp.jetbrains.com
lservice.jetbrains.com
mail.jetbrains.com
marketplace.jetbrains.com
merchandise.jetbrains.com
mkto-mailer.jetbrains.com
mta-sts.jetbrains.com
oauth.fls.jetbrains.com
oauth2-proxy-api.api.jetbrains.com
package-search.jetbrains.com
package-search.services.jetbrains.com
plugins.jetbrains.com
renew-your-ssl-certificate.jetbrains.com
resharper-plugins.jetbrains.com
resources.jetbrains.com
skyscanner.fls.jetbrains.com
slack-bdt.mau.jetbrains.com
slack-mps.jetbrains.com
slack.jetbrains.com
spotify.fls.jetbrains.com
stackexchange.master-zdchint.mau.jetbrains.com
stackexchange.staging-zdchint.mau.jetbrains.com
staging.zdviewcount.mau.jetbrains.com
support.jetbrains.com
sv.fls.jetbrains.com
teamcity-support.jetbrains.com
teamcity.jetbrains.com
tiles.datalore.jetbrains.com
tiles2.datalore.jetbrains.com
uploads.jetbrains.com
uploads.services.jetbrains.com
upsource.jetbrains.com
view.datalore.jetbrains.com
onboard.jetbrains.com
youtube.master-zdchint.mau.jetbrains.com
youtube.staging-zdchint.mau.jetbrains.com
zillow.fls.jetbrains.com

View File

@@ -1,6 +1,786 @@
netflix.ca
aa26lmhjxsb7falok6bns.netflixdnstest1.com
aa7jg34j7jytgcdzro3y4.netflixdnstest1.com
aaf5zdykj6ziau2rns6ei.netflixdnstest1.com
aanuszvxhzfxhlpycmb4u.netflixdnstest1.com
aaodvk3myycri2nyjbhve.netflixdnstest1.com
aapwit4a6lcexwislsabo.netflixdnstest1.com
aaqikascpdx4elgg6ab66.netflixdnstest1.com
aaqr7k7xc5uocmsvawf6u.netflixdnstest1.com
aartrozqxjh6guyvq2wug.netflixdnstest1.com
aau4vbjcmlqbwdrdjk4hk.netflixdnstest1.com
aawqx4jvpurxizattpozu.netflixdnstest1.com
aayenlvil5nebupornk5o.netflixdnstest1.com
aayjhftdiruee32heywiy.netflixdnstest1.com
ab5p42w2pmmvq34ljzcm4.netflixdnstest1.com
ab6pcao47zfy2c35b62ps.netflixdnstest1.com
abapdxvzgb4drwskzh7qk.netflixdnstest1.com
abdqlliza73fgbf3dl3hq.netflixdnstest1.com
abdxsdgkspave335rjk34.netflixdnstest1.com
abe3kjgv5ro75osfee4je.netflixdnstest1.com
abhff6i6wprmeq6y7gniy.netflixdnstest1.com
about.netflix.com
abq6zi7bhaisjkuqf7vzo.netflixdnstest1.com
abqxviog3gsa66jqvempu.netflixdnstest1.com
abu2a3ifiwtnfynsuty4i.netflixdnstest1.com
abv272dwwa2c6jy6ibxny.netflixdnstest1.com
abxjoudtwvdve44u2a2j6.netflixdnstest1.com
abz5ijhc2g4pzzoptpj22.netflixdnstest1.com
abzsahofzuyskwupkzttk.netflixdnstest1.com
ac2s22yd4rfvykzaqlkm2.netflixdnstest1.com
acbntokn2kj6oe7jhq32k.netflixdnstest1.com
access.netflixstudios.com
aciaqfamhcinfjirj3upa.netflixdnstest1.com
acjmn6qfyep32cmpsvlkq.netflixdnstest1.com
ackxq4lrmftovjt3qhafw.netflixdnstest1.com
aclml24lphpesl4yevyju.netflixdnstest1.com
acmat6gqrw4xhfzoa43kluk7kl6afuck32gtjie3.netflixdnstest1.com
acopwws4ttd3h5mkusc6c.netflixdnstest1.com
acpf6vdliri3fcwvcs5oa.netflixdnstest1.com
acrprnffwjnflsh6zmb3a.netflixdnstest1.com
actyar7wobc7kejs6cwri.netflixdnstest1.com
acwctv7wtzkycon2cxxx2.netflixdnstest1.com
adayyg5upy22x5mfko6ik.netflixdnstest1.com
adbpcfuckivyj3woxyrmi.netflixdnstest1.com
adhawcfgx4kkeot6tnoh4.netflixdnstest1.com
adhz63cf5whnqfebvmdfg.netflixdnstest1.com
adjaaoejrtwsb67mf34ds.netflixdnstest1.com
adkwokotfyl2ozixau2jg.netflixdnstest1.com
adl2nt6l3am7pwvn2a4pc.netflixdnstest1.com
adldap.itp.netflix.com
adnkew7disj722aa6uews.netflixdnstest1.com
adoqcx27d2qejarub2awc.netflixdnstest1.com
adwx7zwl4klr3fzef5yww.netflixdnstest1.com
adxnjn56fojfimiezqq7c.netflixdnstest1.com
afoaglymdpdigptn3tpiy.netflixdnstest1.com
afodepclemxkgz3h5fpl4.netflixdnstest1.com
afokskcjxfjgpt4wfdorw.netflixdnstest1.com
alertprocessor.dta.netflix.com
android-appboot.eu-west-1.prodaa.netflix.com
android-appboot.latency.prodaa.netflix.com
android-appboot.us-east-1-sa.prodaa.netflix.com
android-appboot.us-east-1.prodaa.netflix.com
android-appboot.us-west-2.prodaa.netflix.com
android-h2.prod.ftl.netflix.com
android.nccp.eu-west-1.origin.prodaa.netflix.com
android.nccp.eu-west-1.prodaa.netflix.com
android.nccp.latency.prodaa.netflix.com
android.nccp.us-east-1-sa.prodaa.netflix.com
android.nccp.us-east-1.prodaa.netflix.com
android.nccp.us-west-2.prodaa.netflix.com
android.prod.cloud.netflix.com
android.prod.ftl.netflix.com
android13.appboot.netflix.com
anycast.ftl.netflix.com
apdocmandev100.itd.netflix.com
api-ftl.eu-west-1.prodaa.netflix.com
api-ftl.us-east-1-sa.prodaa.netflix.com
api-ftl.us-east-1.prodaa.netflix.com
api-ftl.us-west-2.prodaa.netflix.com
api-global.eu-west-1.origin.prodaa.netflix.com
api-global.eu-west-1.prodaa.netflix.com
api-global.latency.prodaa.netflix.com
api-global.us-east-1-sa.prodaa.netflix.com
api-global.us-east-1.origin.prodaa.netflix.com
api-global.us-east-1.prodaa.netflix.com
api-global.us-west-2.origin.prodaa.netflix.com
api-global.us-west-2.prodaa.netflix.com
api-nodequark.test.netflix.com
api-us.eu-west-1.prodaa.netflix.com
api-us.latency.prodaa.netflix.com
api-us.us-east-1-sa.prodaa.netflix.com
api-us.us-east-1.prodaa.netflix.com
api-us.us-west-2.prodaa.netflix.com
api-user.eu-west-1.prodaa.netflix.com
api-user.latency.prodaa.netflix.com
api-user.us-east-1-sa.prodaa.netflix.com
api-user.us-east-1.prodaa.netflix.com
api-user.us-west-2.prodaa.netflix.com
api.eu-west-1.origin.prodaa.netflix.com
api.eu-west-1.prodaa.netflix.com
api.latency.prodaa.netflix.com
api.sandbox.us-east-1.prodaa.netflix.com
api.us-east-1-sa.prodaa.netflix.com
api.us-east-1.origin.prodaa.netflix.com
api.us-east-1.prodaa.netflix.com
api.us-west-2.origin.prodaa.netflix.com
api.us-west-2.prodaa.netflix.com
appboot.eu-west-1.origin.prodaa.netflix.com
appboot.eu-west-1.prodaa.netflix.com
appboot.latency.prodaa.netflix.com
appboot.us-east-1-sa.prodaa.netflix.com
appboot.us-east-1.origin.prodaa.netflix.com
appboot.us-east-1.prodaa.netflix.com
appboot.us-east-2.origin.prodaa.netflix.com
appboot.us-west-2.origin.prodaa.netflix.com
appboot.us-west-2.prodaa.netflix.com
artisthub.netflixstudios.com
assets.nflxext.com
athena-api.prod.netflixstudios.com
athena.prod.netflixstudios.com
b2b.netflix.com
b2bt.netflix.com
beacon.eu-west-1.prodaa.netflix.com
beacon.latency.prodaa.netflix.com
beacon.us-east-1-sa.prodaa.netflix.com
beacon.us-east-1.prodaa.netflix.com
beacon.us-west-2.prodaa.netflix.com
beaconimages-prod.us-east-1.prodaa.netflix.com
beaconimages-prod.us-west-2.prodaa.netflix.com
cast-oc.netflix.com
catalog.eu-west-1.prodaa.netflix.com
catalog.us-east-1-sa.prodaa.netflix.com
catalog.us-east-1.prodaa.netflix.com
catalog.us-west-2.prodaa.netflix.com
cbp-us.nccp.eu-west-1.prodaa.netflix.com
cbp-us.nccp.latency.prodaa.netflix.com
cbp-us.nccp.us-east-1-sa.prodaa.netflix.com
cbp-us.nccp.us-east-1.prodaa.netflix.com
cbp-us.nccp.us-west-2.prodaa.netflix.com
cbp.nccp.eu-west-1.prodaa.netflix.com
cbp.nccp.latency.prodaa.netflix.com
cbp.nccp.us-east-1-sa.prodaa.netflix.com
cbp.nccp.us-east-1.prodaa.netflix.com
cbp.nccp.us-west-2.prodaa.netflix.com
ccs-int.latency.prodaa.netflix.com
ccs-log.latency.prodaa.netflix.com
ccs-log.us-west-2.prodaa.netflix.com
ccs-manifest.us-west-2.prodaa.netflix.com
ccs.eu-west-1.prodaa.netflix.com
ccs.latency.prodaa.netflix.com
ccs.us-east-1.prodaa.netflix.com
ccs.us-west-2.prodaa.netflix.com
contact.netflix.com
contentrfpqna.netflix.com
creativeservices.itp.netflix.com
crf.netflix.com
crftest.netflix.com
csapi.prod.dvdco.netflix.com
csapi.test.dvdco.netflix.com
ctech-flix6-02.prod.prodtech.netflixstudios.com
customerevents.eu-west-1.prodaa.netflix.com
customerevents.latency.prodaa.netflix.com
customerevents.us-east-1-sa.prodaa.netflix.com
customerevents.us-east-1.prodaa.netflix.com
customerevents.us-west-2.prodaa.netflix.com
dc1-prod.netflix.com
ddi03.sjc004.ix.nflxvideo.net
ddi04.sjc004.ix.nflxvideo.net
dnm.prod.eu-west-1.prodaa.netflix.com
dnm.prod.latency.prodaa.netflix.com
dnm.prod.us-east-1-sa.prodaa.netflix.com
dnm.prod.us-east-1.prodaa.netflix.com
dnm.prod.us-west-2.prodaa.netflix.com
dnmi.prod.eu-west-1.prodaa.netflix.com
dnmi.prod.us-east-1-sa.prodaa.netflix.com
dnmi.prod.us-east-1.prodaa.netflix.com
dnmi.prod.us-west-2.prodaa.netflix.com
dualstack-anycast.prod.ftl.netflix.com
dvd-www-test-baseline-stable.eng.dvdco.netflix.com
dvdfs.netflix.com
efowqjkak7cwdxazlzpwi-usw2.netflixdnstest1.com
efpfoac3ef3zyyvufhfne-usw2.netflixdnstest1.com
estats.netflix.com
eu-west-1-probe.prod.ftl.netflix.com
fast.com
foo.netflixdnstest1.com
ftl.netflix.com
gateway.netflix.com
geolocation.onetrust.com
gfoqmptyoe4jkbdnf3vqi-usw2.netflixdnstest1.com
gfotmmkgqc33ecb2s2pm2-usw2.netflixdnstest1.com
gfp22di7xe45sbo4rxkcc-usw2.netflixdnstest1.com
gfp334gbmvxa6bnelelxu-usw2.netflixdnstest1.com
gfp7wmvikgssstttqvbec-usw2.netflixdnstest1.com
gfpau5cffynq5b76u25vy-usw2.netflixdnstest1.com
gfpaucsvyihh2gxsqk222-usw2.netflixdnstest1.com
gfpr7fqbjlanhgpx3ewjk-usw2.netflixdnstest1.com
gfpu43ja24st42rze3xbo-usw2.netflixdnstest1.com
gfpuosgohypep75gf3xb6-usw2.netflixdnstest1.com
gfpussf2qdon7hfc3qnf6-usw2.netflixdnstest1.com
gfpzivkyt6jegadbua2sy-usw2.netflixdnstest1.com
gfqcwd3pq5cxxvah6q5iw-usw2.netflixdnstest1.com
gfqh2biuujh4df3yvkphw-euw1.netflixdnstest1.com
ichnaea-experiment.prodaa.netflix.com
ichnaea-web.eu-west-1.prodaa.netflix.com
ichnaea-web.latency.prodaa.netflix.com
ichnaea-web.us-east-1-sa.prodaa.netflix.com
ichnaea-web.us-east-1.prodaa.netflix.com
ichnaea-web.us-west-2.prodaa.netflix.com
ichnaea.eu-west-1.origin.prodaa.netflix.com
ichnaea.eu-west-1.prodaa.netflix.com
ichnaea.latency.prodaa.netflix.com
ichnaea.staging.us-east-1.prodaa.netflix.com
ichnaea.staging.us-west-2.prodaa.netflix.com
ichnaea.us-east-1-sa.prodaa.netflix.com
ichnaea.us-east-1.origin.prodaa.netflix.com
ichnaea.us-east-1.prodaa.netflix.com
ichnaea.us-west-2.origin.prodaa.netflix.com
ichnaea.us-west-2.prodaa.netflix.com
ifo4hwfatv3mr4kla42nw-euw1.netflixdnstest1.com
ifo6qcmy5pzqqkpzmlei2-usw2.netflixdnstest1.com
ifo7ligommwucao6uie54-euw1.netflixdnstest1.com
ifodp7yzothfhaznf4tyq-euw1.netflixdnstest1.com
ifogfbt2kr3mxwvt5caos.netflixdnstest1.com
ifopzgcwuwo3pqvr2ycek.netflixdnstest1.com
ifovqmfwkxxlexxln4vns-euw1.netflixdnstest1.com
ifowcowewkukndqiwwyt6-usw2.netflixdnstest1.com
ifoypncxht4rysw3o2y4g-euw1.netflixdnstest1.com
ifp2n4xxjvs24oses4mgs-usw2.netflixdnstest1.com
ifp32fxzykx3x6viipj2i-usw2.netflixdnstest1.com
ifp3g2slwu7nn3ejawif2-usw2.netflixdnstest1.com
ifp3oyzxacvvtgqcnykym-usw2.netflixdnstest1.com
ifp45ur767hemzzohd2ie-usw2.netflixdnstest1.com
ifp4ejnlwgfyqpwzdbhuu-euw1.netflixdnstest1.com
ifp4gkolhfrszm65z7j2w-usw2.netflixdnstest1.com
ifp4rrzspgfgr32wguj62-usw2.netflixdnstest1.com
ifp4y6bwaajp32xncbujq-usw2.netflixdnstest1.com
ifp5bj5pzu6rhvbexoczm-usw2.netflixdnstest1.com
ifp5ne3me4byxvcx65xgm-usw2.netflixdnstest1.com
ifp5uke6wfobfoqxjweak-euw1.netflixdnstest1.com
ifp6uv2hk6n5bwi73r724-usw2.netflixdnstest1.com
ifp6wjhhxdi6vcqi3sfxm-usw2.netflixdnstest1.com
ifp6zlt5mzgjff3bknkza-euw1.netflixdnstest1.com
ifp7fndovqcvtpaokpg4y-usw2.netflixdnstest1.com
ifp7k2txtnnnlrhsag27e-usw2.netflixdnstest1.com
ifp7khsomazca3f2mse66-usw2.netflixdnstest1.com
ifp7skxoaaomsraykm3jo-use1.netflixdnstest1.com
ifpaaymnhdm64e6ytbi56-euw1.netflixdnstest1.com
ifphx6lgqoyk3wen25k4i-usw2.netflixdnstest1.com
ifpif2icptioh2akyj4yg-usw2.netflixdnstest1.com
ifpjx6inl5xk4j7ipsdwu-usw2.netflixdnstest1.com
ifplpzhaibllbcyin2ig4-usw2.netflixdnstest1.com
ifpouhakuduv2x3wmvoec-euw1.netflixdnstest1.com
ifpr2qcx2bkufbwbaew6y-usw2.netflixdnstest1.com
ifpr5u6k3r5w3z7py7lei-euw1.netflixdnstest1.com
ifprctisxppvna3lid76m-usw2.netflixdnstest1.com
ifps7gyjxbay4nfvksvye-usw2.netflixdnstest1.com
ifpsmqk25dnajg7t4pyfo-usw2.netflixdnstest1.com
ifpspnmow62po5bgm6slqeut2agfrk5iqqbmn7gb-usw2.netflixdnstest1.com
ifpsrevqmandndbljfm72-usw2.netflixdnstest1.com
ifpsv4kswomn6xrsxaypo-usw2.netflixdnstest1.com
ifpsvewemdre6qo7qvqio-usw2.netflixdnstest1.com
ifptgxd72c3ylc2rtujd6-usw2.netflixdnstest1.com
ifptl552zicbxyf4pysfc-usw2.netflixdnstest1.com
ifptnvur3etfothfwkdqe-usw2.netflixdnstest1.com
ifptqkljxf7ilezuift34-usw2.netflixdnstest1.com
ifpunwmhne4sxlxv7fxee-usw2.netflixdnstest1.com
ifpve3n7qmxxsolbg2epm-usw2.netflixdnstest1.com
ifpwjnlaxbdnmi7as2do73ypdeprnv5eho4alt2e-usw2.netflixdnstest1.com
ifpwtj2l2jvygq6eiwzhw4zuldmosnemthplifjq-usw2.netflixdnstest1.com
ifpwufuc3ifq4hjg6quuk-usw2.netflixdnstest1.com
ifpx7fu7k2iwds2p6audq-usw2.netflixdnstest1.com
ifpxjhzyotecdcqqhk4lq-usw2.netflixdnstest1.com
ifpxsfck7src3pgjbnzbo-usw2.netflixdnstest1.com
ifpxvavvshx2dcx2axwk6-usw2.netflixdnstest1.com
ifpzee3vel3bihb33hkmu-euw1.netflixdnstest1.com
ifqa6hgf2pe2sd7rancgu-usw2.netflixdnstest1.com
ifqaig3nvoleu7pe4txbq-usw2.netflixdnstest1.com
ifqcag7fwtb7alsbwzdz2-usw2.netflixdnstest1.com
ifqdwcxwectldjn6pvdvo-usw2.netflixdnstest1.com
ifqfgcqesay5ufguik6gm-usw2.netflixdnstest1.com
ifqi6d6roai57bewbgp4a-usw2.netflixdnstest1.com
ifqmkgzovfteq5clq7vuy-usw2.netflixdnstest1.com
ifqp4fmrkk54wlq5wts2e-usw2.netflixdnstest1.com
ios-h2.prod.ftl.netflix.com
ios.nccp.eu-west-1.prodaa.netflix.com
ios.nccp.latency.prodaa.netflix.com
ios.nccp.us-east-1-sa.prodaa.netflix.com
ios.nccp.us-east-1.prodaa.netflix.com
ios.nccp.us-west-2.prodaa.netflix.com
ipv4-c001-aca001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-agu001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-amd002-jio-isp.1.oca.nflxvideo.net
ipv4-c001-blr002-jio-isp.1.oca.nflxvideo.net
ipv4-c001-bpm002-jio-isp.1.oca.nflxvideo.net
ipv4-c001-bro001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-bud001-retn-isp.1.oca.nflxvideo.net
ipv4-c001-cul001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-del002-jio-isp.1.oca.nflxvideo.net
ipv4-c001-dgo001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-gdl005-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-gdl007-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-gdl008-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-ipl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-jai001-jio-isp.1.oca.nflxvideo.net
ipv4-c001-jal003-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-jal004-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-lap001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-lov001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-mex012-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-mex014-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-mex015-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-mnl006-pldt-isp.1.oca.nflxvideo.net
ipv4-c001-mty002-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-oax001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-pat001-jio-isp.1.oca.nflxvideo.net
ipv4-c001-pbc002-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-pvr001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-rix001-retn-isp.1.oca.nflxvideo.net
ipv4-c001-sjc001-nflxoc-isp.1.live.nflxvideo.net
ipv4-c001-sjc001-nflxoc-isp.1.oca.nflxvideo.net
ipv4-c001-slp002-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-sof001-retn-isp.1.oca.nflxvideo.net
ipv4-c001-tpq001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-upn001-telmex-isp.1.oca.nflxvideo.net
ipv4-c001-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-aca001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-agu001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-amd002-jio-isp.1.oca.nflxvideo.net
ipv4-c002-blr002-jio-isp.1.oca.nflxvideo.net
ipv4-c002-bpm002-jio-isp.1.oca.nflxvideo.net
ipv4-c002-bro001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-bud001-retn-isp.1.oca.nflxvideo.net
ipv4-c002-ccu002-jio-isp.1.oca.nflxvideo.net
ipv4-c002-cul001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-del002-jio-isp.1.oca.nflxvideo.net
ipv4-c002-gdl005-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-gdl007-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-gdl008-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-iev001-retn-isp.1.oca.nflxvideo.net
ipv4-c002-ipl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-jai001-jio-isp.1.oca.nflxvideo.net
ipv4-c002-jal003-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-jal004-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-lap001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-mex012-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-mex014-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-mex015-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-mty002-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-oax001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-pat001-jio-isp.1.oca.nflxvideo.net
ipv4-c002-pbc002-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-pvr001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-rix001-retn-isp.1.oca.nflxvideo.net
ipv4-c002-sjc001-nflxoc-isp.1.live.nflxvideo.net
ipv4-c002-sjc001-nflxoc-isp.1.oca.nflxvideo.net
ipv4-c002-slp002-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-sof001-retn-isp.1.oca.nflxvideo.net
ipv4-c002-tpq001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-upn001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv4-c002-waw001-retn-isp.1.oca.nflxvideo.net
ipv4-c003-aca001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-agu001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-amd002-jio-isp.1.oca.nflxvideo.net
ipv4-c003-blr002-jio-isp.1.oca.nflxvideo.net
ipv4-c003-bud001-retn-isp.1.oca.nflxvideo.net
ipv4-c003-ccu002-jio-isp.1.oca.nflxvideo.net
ipv4-c003-cul001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-del002-jio-isp.1.oca.nflxvideo.net
ipv4-c003-dgo001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-gdl006-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-iev001-retn-isp.1.oca.nflxvideo.net
ipv4-c003-ipl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-jal004-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-maa001-jio-isp.1.oca.nflxvideo.net
ipv4-c003-mex014-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-mex015-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-mnl003-pldt-isp.1.oca.nflxvideo.net
ipv4-c003-mty002-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-mzt001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-nag001-jio-isp.1.oca.nflxvideo.net
ipv4-c003-oax001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-pbc002-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-rix001-retn-isp.1.oca.nflxvideo.net
ipv4-c003-slp002-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-tpq001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-upn001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv4-c003-was001-dev-ix.1.oca.nflxvideo.net
ipv4-c003-waw001-retn-isp.1.oca.nflxvideo.net
ipv4-c004-agu001-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-amd002-jio-isp.1.oca.nflxvideo.net
ipv4-c004-blr002-jio-isp.1.oca.nflxvideo.net
ipv4-c004-bpm002-jio-isp.1.oca.nflxvideo.net
ipv4-c004-cjs001-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-cul001-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-del001-jio-isp.1.oca.nflxvideo.net
ipv4-c004-del002-jio-isp.1.oca.nflxvideo.net
ipv4-c004-gdl006-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-iev001-retn-isp.1.oca.nflxvideo.net
ipv4-c004-ipl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-jal003-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-jal004-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-lap001-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-maa001-jio-isp.1.oca.nflxvideo.net
ipv4-c004-mex010-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-mnl003-pldt-isp.1.oca.nflxvideo.net
ipv4-c004-mzt001-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-pbc002-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-tlc001-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-trc001-telmex-isp.1.oca.nflxvideo.net
ipv4-c004-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv4-c005-blr002-jio-isp.1.oca.nflxvideo.net
ipv4-c005-bpm002-jio-isp.1.oca.nflxvideo.net
ipv4-c005-ccu002-jio-isp.1.oca.nflxvideo.net
ipv4-c005-cjs001-telmex-isp.1.oca.nflxvideo.net
ipv4-c005-cul001-telmex-isp.1.oca.nflxvideo.net
ipv4-c005-del001-jio-isp.1.oca.nflxvideo.net
ipv4-c005-jal003-telmex-isp.1.oca.nflxvideo.net
ipv4-c005-maa001-jio-isp.1.oca.nflxvideo.net
ipv4-c005-mex010-telmex-isp.1.oca.nflxvideo.net
ipv4-c005-tlc001-telmex-isp.1.oca.nflxvideo.net
ipv4-c005-trc001-telmex-isp.1.oca.nflxvideo.net
ipv4-c005-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv4-c006-blr002-jio-isp.1.oca.nflxvideo.net
ipv4-c006-ccu002-jio-isp.1.oca.nflxvideo.net
ipv4-c006-cjs001-telmex-isp.1.oca.nflxvideo.net
ipv4-c006-cul001-telmex-isp.1.oca.nflxvideo.net
ipv4-c006-cvj001-telmex-isp.1.oca.nflxvideo.net
ipv4-c006-maa001-jio-isp.1.oca.nflxvideo.net
ipv4-c006-mid001-telmex-isp.1.oca.nflxvideo.net
ipv4-c006-mlm001-telmex-isp.1.oca.nflxvideo.net
ipv4-c006-nag001-jio-isp.1.oca.nflxvideo.net
ipv4-c006-tgz001-telmex-isp.1.oca.nflxvideo.net
ipv4-c006-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv4-c007-blr002-jio-isp.1.oca.nflxvideo.net
ipv4-c007-bom001-jio-isp.1.oca.nflxvideo.net
ipv4-c007-cuu001-telmex-isp.1.oca.nflxvideo.net
ipv4-c007-cvj001-telmex-isp.1.oca.nflxvideo.net
ipv4-c007-maa001-jio-isp.1.oca.nflxvideo.net
ipv4-c007-mid001-telmex-isp.1.oca.nflxvideo.net
ipv4-c007-mnl003-pldt-isp.1.oca.nflxvideo.net
ipv4-c007-nag001-jio-isp.1.oca.nflxvideo.net
ipv4-c007-qro001-telmex-isp.1.oca.nflxvideo.net
ipv4-c007-tgz001-telmex-isp.1.oca.nflxvideo.net
ipv4-c008-cjs001-telmex-isp.1.oca.nflxvideo.net
ipv4-c008-cuu001-telmex-isp.1.oca.nflxvideo.net
ipv4-c008-cvj001-telmex-isp.1.oca.nflxvideo.net
ipv4-c008-del001-jio-isp.1.oca.nflxvideo.net
ipv4-c008-mid001-telmex-isp.1.oca.nflxvideo.net
ipv4-c008-mnl002-pldt-isp.1.oca.nflxvideo.net
ipv4-c008-mnl003-pldt-isp.1.oca.nflxvideo.net
ipv4-c008-nag001-jio-isp.1.oca.nflxvideo.net
ipv4-c008-ntr001-telmex-isp.1.oca.nflxvideo.net
ipv4-c009-bom001-jio-isp.1.oca.nflxvideo.net
ipv4-c009-cuu001-telmex-isp.1.oca.nflxvideo.net
ipv4-c009-cyw001-telmex-isp.1.oca.nflxvideo.net
ipv4-c009-del001-jio-isp.1.oca.nflxvideo.net
ipv4-c009-mid001-telmex-isp.1.oca.nflxvideo.net
ipv4-c009-mnl002-pldt-isp.1.oca.nflxvideo.net
ipv4-c009-ntr001-telmex-isp.1.oca.nflxvideo.net
ipv4-c009-qro001-telmex-isp.1.oca.nflxvideo.net
ipv4-c009-slw001-telmex-isp.1.oca.nflxvideo.net
ipv4-c010-bjx001-telmex-isp.1.oca.nflxvideo.net
ipv4-c010-bom001-jio-isp.1.oca.nflxvideo.net
ipv4-c010-cuu001-telmex-isp.1.oca.nflxvideo.net
ipv4-c010-cvj001-telmex-isp.1.oca.nflxvideo.net
ipv4-c010-cyw001-telmex-isp.1.oca.nflxvideo.net
ipv4-c010-del001-jio-isp.1.oca.nflxvideo.net
ipv4-c010-mex005-telmex-isp.1.oca.nflxvideo.net
ipv4-c011-bom001-jio-isp.1.oca.nflxvideo.net
ipv4-c011-cun001-telmex-isp.1.oca.nflxvideo.net
ipv4-c011-del001-jio-isp.1.oca.nflxvideo.net
ipv4-c011-mex005-telmex-isp.1.oca.nflxvideo.net
ipv4-c012-bom001-jio-isp.1.oca.nflxvideo.net
ipv4-c012-cun001-telmex-isp.1.oca.nflxvideo.net
ipv4-c012-mex005-telmex-isp.1.oca.nflxvideo.net
ipv4-c012-mtt001-telmex-isp.1.oca.nflxvideo.net
ipv4-c013-cun001-telmex-isp.1.oca.nflxvideo.net
ipv4-c013-mex005-telmex-isp.1.oca.nflxvideo.net
ipv4-c013-mtt001-telmex-isp.1.oca.nflxvideo.net
ipv4-c014-cun001-telmex-isp.1.oca.nflxvideo.net
ipv4-c014-mtt001-telmex-isp.1.oca.nflxvideo.net
ipv4-c015-cun001-telmex-isp.1.oca.nflxvideo.net
ipv4-c015-mtt001-telmex-isp.1.oca.nflxvideo.net
ipv4-c021-tij001-telmex-isp.1.oca.nflxvideo.net
ipv4-c022-tij001-telmex-isp.1.oca.nflxvideo.net
ipv4-c023-tij001-telmex-isp.1.oca.nflxvideo.net
ipv4-c024-mty001-telmex-isp.1.oca.nflxvideo.net
ipv4-c024-tij001-telmex-isp.1.oca.nflxvideo.net
ipv4-c025-buh001-ix.1.oca.nflxvideo.net
ipv4-c025-mty001-telmex-isp.1.oca.nflxvideo.net
ipv4-c025-tij001-telmex-isp.1.oca.nflxvideo.net
ipv4-c026-mty001-telmex-isp.1.oca.nflxvideo.net
ipv4-c027-buh001-ix.1.oca.nflxvideo.net
ipv4-c028-buh001-ix.1.oca.nflxvideo.net
ipv4-c028-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c029-buh001-ix.1.oca.nflxvideo.net
ipv4-c029-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c030-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c031-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c032-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c033-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv4-c035-buh001-ix.1.oca.nflxvideo.net
ipv4-c036-buh001-ix.1.oca.nflxvideo.net
ipv4-c037-buh001-ix.1.oca.nflxvideo.net
ipv4-c037-mex002-telmex-isp.1.oca.nflxvideo.net
ipv4-c038-buh001-ix.1.oca.nflxvideo.net
ipv4-c038-mex002-telmex-isp.1.oca.nflxvideo.net
ipv4-c039-mex002-telmex-isp.1.oca.nflxvideo.net
ipv4-c040-buh001-ix.1.oca.nflxvideo.net
ipv4-c040-mex002-telmex-isp.1.oca.nflxvideo.net
ipv4-c041-mex002-telmex-isp.1.oca.nflxvideo.net
ipv4-c042-mex002-telmex-isp.1.oca.nflxvideo.net
ipv4-c043-mex002-telmex-isp.1.oca.nflxvideo.net
ipv4-c044-mex002-telmex-isp.1.oca.nflxvideo.net
ipv4-c045-mex002-telmex-isp.1.oca.nflxvideo.net
ipv4-c065-sjc002-dev-ix.1.oca.nflxvideo.net
ipv4-c090-dus002-ix.1.oca.nflxvideo.net
ipv4-c092-dus002-ix.1.oca.nflxvideo.net
ipv4-c093-dus002-ix.1.oca.nflxvideo.net
ipv4-c094-dus002-ix.1.oca.nflxvideo.net
ipv4-c099-dus002-ix.1.oca.nflxvideo.net
ipv4-c100-dus002-ix.1.oca.nflxvideo.net
ipv4-c159-fra002-ix.1.oca.nflxvideo.net
ipv4-c160-fra002-ix.1.oca.nflxvideo.net
ipv4-c161-fra002-ix.1.oca.nflxvideo.net
ipv4-c162-fra002-ix.1.oca.nflxvideo.net
ipv4-c163-fra002-ix.1.oca.nflxvideo.net
ipv4-c164-fra002-ix.1.oca.nflxvideo.net
ipv4-c165-fra002-ix.1.oca.nflxvideo.net
ipv4-c168-was001-dev-ix.1.oca.nflxvideo.net
ipv4-c175-fra002-ix.1.oca.nflxvideo.net
ipv4-c186-fra002-ix.1.oca.nflxvideo.net
ipv4-c405-dfw001-ix.1.oca.nflxvideo.net
ipv4-c406-dfw001-ix.1.oca.nflxvideo.net
ipv4-c641-sjc002-dev-ix.1.oca.nflxvideo.net
ipv4-c664-ord001-ix.1.oca.nflxvideo.net
ipv4only-anycast.prod.ftl.netflix.com
ipv6-c001-aca001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-agu001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-amd002-jio-isp.1.oca.nflxvideo.net
ipv6-c001-blr002-jio-isp.1.oca.nflxvideo.net
ipv6-c001-bpm002-jio-isp.1.oca.nflxvideo.net
ipv6-c001-bro001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-cul001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-del002-jio-isp.1.oca.nflxvideo.net
ipv6-c001-dgo001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-gdl005-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-gdl007-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-gdl008-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-ipl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-jai001-jio-isp.1.oca.nflxvideo.net
ipv6-c001-jal003-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-jal004-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-lap001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-lov001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-mex012-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-mex014-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-mex015-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-mnl006-pldt-isp.1.oca.nflxvideo.net
ipv6-c001-mty002-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-oax001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-pat001-jio-isp.1.oca.nflxvideo.net
ipv6-c001-pbc002-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-pvr001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-sjc001-nflxoc-isp.1.live.nflxvideo.net
ipv6-c001-sjc001-nflxoc-isp.1.oca.nflxvideo.net
ipv6-c001-slp002-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-tpq001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-upn001-telmex-isp.1.oca.nflxvideo.net
ipv6-c001-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-aca001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-agu001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-amd002-jio-isp.1.oca.nflxvideo.net
ipv6-c002-blr002-jio-isp.1.oca.nflxvideo.net
ipv6-c002-bpm002-jio-isp.1.oca.nflxvideo.net
ipv6-c002-bro001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-ccu002-jio-isp.1.oca.nflxvideo.net
ipv6-c002-cul001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-del002-jio-isp.1.oca.nflxvideo.net
ipv6-c002-gdl005-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-gdl007-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-gdl008-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-ipl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-jai001-jio-isp.1.oca.nflxvideo.net
ipv6-c002-jal003-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-jal004-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-lap001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-mex012-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-mex014-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-mex015-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-mty002-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-oax001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-pat001-jio-isp.1.oca.nflxvideo.net
ipv6-c002-pbc002-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-pvr001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-sjc001-nflxoc-isp.1.live.nflxvideo.net
ipv6-c002-sjc001-nflxoc-isp.1.oca.nflxvideo.net
ipv6-c002-slp002-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-tpq001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-upn001-telmex-isp.1.oca.nflxvideo.net
ipv6-c002-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-aca001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-agu001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-amd002-jio-isp.1.oca.nflxvideo.net
ipv6-c003-blr002-jio-isp.1.oca.nflxvideo.net
ipv6-c003-ccu002-jio-isp.1.oca.nflxvideo.net
ipv6-c003-cul001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-del002-jio-isp.1.oca.nflxvideo.net
ipv6-c003-dgo001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-gdl006-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-ipl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-jal004-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-maa001-jio-isp.1.oca.nflxvideo.net
ipv6-c003-mex014-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-mex015-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-mnl003-pldt-isp.1.oca.nflxvideo.net
ipv6-c003-mty002-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-mzt001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-nag001-jio-isp.1.oca.nflxvideo.net
ipv6-c003-oax001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-pbc002-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-slp002-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-tpq001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-upn001-telmex-isp.1.oca.nflxvideo.net
ipv6-c003-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-agu001-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-amd002-jio-isp.1.oca.nflxvideo.net
ipv6-c004-blr002-jio-isp.1.oca.nflxvideo.net
ipv6-c004-bpm002-jio-isp.1.oca.nflxvideo.net
ipv6-c004-cjs001-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-cul001-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-del001-jio-isp.1.oca.nflxvideo.net
ipv6-c004-del002-jio-isp.1.oca.nflxvideo.net
ipv6-c004-gdl006-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-ipl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-jal003-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-jal004-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-lap001-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-maa001-jio-isp.1.oca.nflxvideo.net
ipv6-c004-mex010-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-mnl003-pldt-isp.1.oca.nflxvideo.net
ipv6-c004-mzt001-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-pbc002-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-tlc001-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-trc001-telmex-isp.1.oca.nflxvideo.net
ipv6-c004-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv6-c005-blr002-jio-isp.1.oca.nflxvideo.net
ipv6-c005-bpm002-jio-isp.1.oca.nflxvideo.net
ipv6-c005-ccu002-jio-isp.1.oca.nflxvideo.net
ipv6-c005-cjs001-telmex-isp.1.oca.nflxvideo.net
ipv6-c005-cul001-telmex-isp.1.oca.nflxvideo.net
ipv6-c005-del001-jio-isp.1.oca.nflxvideo.net
ipv6-c005-jal003-telmex-isp.1.oca.nflxvideo.net
ipv6-c005-maa001-jio-isp.1.oca.nflxvideo.net
ipv6-c005-mex010-telmex-isp.1.oca.nflxvideo.net
ipv6-c005-tlc001-telmex-isp.1.oca.nflxvideo.net
ipv6-c005-trc001-telmex-isp.1.oca.nflxvideo.net
ipv6-c005-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv6-c006-blr002-jio-isp.1.oca.nflxvideo.net
ipv6-c006-ccu002-jio-isp.1.oca.nflxvideo.net
ipv6-c006-cjs001-telmex-isp.1.oca.nflxvideo.net
ipv6-c006-cul001-telmex-isp.1.oca.nflxvideo.net
ipv6-c006-cvj001-telmex-isp.1.oca.nflxvideo.net
ipv6-c006-maa001-jio-isp.1.oca.nflxvideo.net
ipv6-c006-mid001-telmex-isp.1.oca.nflxvideo.net
ipv6-c006-mlm001-telmex-isp.1.oca.nflxvideo.net
ipv6-c006-nag001-jio-isp.1.oca.nflxvideo.net
ipv6-c006-tgz001-telmex-isp.1.oca.nflxvideo.net
ipv6-c006-vsa001-telmex-isp.1.oca.nflxvideo.net
ipv6-c007-blr002-jio-isp.1.oca.nflxvideo.net
ipv6-c007-bom001-jio-isp.1.oca.nflxvideo.net
ipv6-c007-cuu001-telmex-isp.1.oca.nflxvideo.net
ipv6-c007-cvj001-telmex-isp.1.oca.nflxvideo.net
ipv6-c007-maa001-jio-isp.1.oca.nflxvideo.net
ipv6-c007-mid001-telmex-isp.1.oca.nflxvideo.net
ipv6-c007-mnl003-pldt-isp.1.oca.nflxvideo.net
ipv6-c007-nag001-jio-isp.1.oca.nflxvideo.net
ipv6-c007-qro001-telmex-isp.1.oca.nflxvideo.net
ipv6-c007-tgz001-telmex-isp.1.oca.nflxvideo.net
ipv6-c008-cjs001-telmex-isp.1.oca.nflxvideo.net
ipv6-c008-cuu001-telmex-isp.1.oca.nflxvideo.net
ipv6-c008-cvj001-telmex-isp.1.oca.nflxvideo.net
ipv6-c008-del001-jio-isp.1.oca.nflxvideo.net
ipv6-c008-mid001-telmex-isp.1.oca.nflxvideo.net
ipv6-c008-mnl002-pldt-isp.1.oca.nflxvideo.net
ipv6-c008-mnl003-pldt-isp.1.oca.nflxvideo.net
ipv6-c008-nag001-jio-isp.1.oca.nflxvideo.net
ipv6-c008-ntr001-telmex-isp.1.oca.nflxvideo.net
ipv6-c009-bom001-jio-isp.1.oca.nflxvideo.net
ipv6-c009-cuu001-telmex-isp.1.oca.nflxvideo.net
ipv6-c009-cyw001-telmex-isp.1.oca.nflxvideo.net
ipv6-c009-del001-jio-isp.1.oca.nflxvideo.net
ipv6-c009-mid001-telmex-isp.1.oca.nflxvideo.net
ipv6-c009-mnl002-pldt-isp.1.oca.nflxvideo.net
ipv6-c009-ntr001-telmex-isp.1.oca.nflxvideo.net
ipv6-c009-qro001-telmex-isp.1.oca.nflxvideo.net
ipv6-c009-slw001-telmex-isp.1.oca.nflxvideo.net
ipv6-c010-bjx001-telmex-isp.1.oca.nflxvideo.net
ipv6-c010-bom001-jio-isp.1.oca.nflxvideo.net
ipv6-c010-cuu001-telmex-isp.1.oca.nflxvideo.net
ipv6-c010-cvj001-telmex-isp.1.oca.nflxvideo.net
ipv6-c010-cyw001-telmex-isp.1.oca.nflxvideo.net
ipv6-c010-del001-jio-isp.1.oca.nflxvideo.net
ipv6-c010-mex005-telmex-isp.1.oca.nflxvideo.net
ipv6-c011-bom001-jio-isp.1.oca.nflxvideo.net
ipv6-c011-cun001-telmex-isp.1.oca.nflxvideo.net
ipv6-c011-del001-jio-isp.1.oca.nflxvideo.net
ipv6-c011-mex005-telmex-isp.1.oca.nflxvideo.net
ipv6-c012-bom001-jio-isp.1.oca.nflxvideo.net
ipv6-c012-cun001-telmex-isp.1.oca.nflxvideo.net
ipv6-c012-mex005-telmex-isp.1.oca.nflxvideo.net
ipv6-c012-mtt001-telmex-isp.1.oca.nflxvideo.net
ipv6-c013-cun001-telmex-isp.1.oca.nflxvideo.net
ipv6-c013-mex005-telmex-isp.1.oca.nflxvideo.net
ipv6-c013-mtt001-telmex-isp.1.oca.nflxvideo.net
ipv6-c014-cun001-telmex-isp.1.oca.nflxvideo.net
ipv6-c014-mtt001-telmex-isp.1.oca.nflxvideo.net
ipv6-c015-cun001-telmex-isp.1.oca.nflxvideo.net
ipv6-c015-mtt001-telmex-isp.1.oca.nflxvideo.net
ipv6-c021-tij001-telmex-isp.1.oca.nflxvideo.net
ipv6-c022-tij001-telmex-isp.1.oca.nflxvideo.net
ipv6-c023-tij001-telmex-isp.1.oca.nflxvideo.net
ipv6-c024-mty001-telmex-isp.1.oca.nflxvideo.net
ipv6-c024-tij001-telmex-isp.1.oca.nflxvideo.net
ipv6-c025-mty001-telmex-isp.1.oca.nflxvideo.net
ipv6-c025-tij001-telmex-isp.1.oca.nflxvideo.net
ipv6-c026-mty001-telmex-isp.1.oca.nflxvideo.net
ipv6-c028-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c029-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c030-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c031-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c032-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c032-hkg001-ix.1.oca.nflxvideo.net
ipv6-c033-gdl001-telmex-isp.1.oca.nflxvideo.net
ipv6-c037-mex002-telmex-isp.1.oca.nflxvideo.net
ipv6-c038-mex002-telmex-isp.1.oca.nflxvideo.net
ipv6-c039-mex002-telmex-isp.1.oca.nflxvideo.net
ipv6-c040-mex002-telmex-isp.1.oca.nflxvideo.net
ipv6-c041-mex002-telmex-isp.1.oca.nflxvideo.net
ipv6-c042-mex002-telmex-isp.1.oca.nflxvideo.net
ipv6-c043-mex002-telmex-isp.1.oca.nflxvideo.net
ipv6-c044-mex002-telmex-isp.1.oca.nflxvideo.net
ipv6-c045-mex002-telmex-isp.1.oca.nflxvideo.net
ipv6-c168-was001-dev-ix.1.oca.nflxvideo.net
ixanycast.ftl.netflix.com
jarvis.prod.dvdco.netflix.com
jarvis.test.dvdco.netflix.com
jobs.netflix.com
jobsitebeta.netflix.com
ldmg101.netflix.com
leia.eu-west-1.prodaa.netflix.com
leia.latency.prodaa.netflix.com
leia.us-east-1-sa.prodaa.netflix.com
leia.us-east-1.prodaa.netflix.com
leia.us-west-2.prodaa.netflix.com
logs.netflix.com
magfsprod101.itp.netflix.com
magfsprod102.itp.netflix.com
manage.netflix.com
mediawiki.netflix.com
mf-dvd-west-1a.itp.netflix.com
mf-mgmt101-west-1c.itp.netflix.com
mf-streaming-snap-west-1c.itp.netflix.com
mf-streaming-west-1c.itp.netflix.com
minerva-alpha-api.test.netflixstudios.com
minerva-beta-api.test.netflixstudios.com
mobile-ixanycast.ftl.netflix.com
mtls.sandbox.partnerapi.netflix.com
nccp-nrdp-31.eu-west-1.prodaa.netflix.com
nccp-nrdp-31.latency.prodaa.netflix.com
nccp-nrdp-31.us-east-1-sa.prodaa.netflix.com
nccp-nrdp-31.us-east-1.prodaa.netflix.com
nccp-nrdp-31.us-west-2.prodaa.netflix.com
nccp-starfox.eu-west-1.prodaa.netflix.com
nccp-starfox.us-east-1-sa.prodaa.netflix.com
nccp-starfox.us-east-1.prodaa.netflix.com
nccp-starfox.us-west-2.prodaa.netflix.com
netflix.ca
netflix.com
netflix.com.au
netflix.net
netflixdnstest1.com
netflixdnstest10.com
netflixdnstest2.com
@@ -13,4 +793,163 @@ netflixdnstest8.com
netflixdnstest9.com
netflixinvestor.com
netflixstudios.com
netflixtechblog.com
netflixtechblog.com
nflix-dominoblog-prod-01.itp.netflix.com
nflxext.com
nflximg.com
nflxsearch.net
nflxvideo.net
nintendo.nccp.eu-west-1.prodaa.netflix.com
nintendo.nccp.latency.prodaa.netflix.com
nintendo.nccp.us-east-1-sa.prodaa.netflix.com
nintendo.nccp.us-east-1.prodaa.netflix.com
nintendo.nccp.us-west-2.prodaa.netflix.com
nmtracking.eu-west-1.prodaa.netflix.com
nmtracking.latency.prodaa.netflix.com
nmtracking.us-east-1-sa.prodaa.netflix.com
nmtracking.us-east-1.prodaa.netflix.com
nmtracking.us-west-2.prodaa.netflix.com
np3.prod.netflixstudios.com
nrd.api.latency.prodaa.netflix.com
nrdp-ixanycast.ftl.netflix.com
nrdp.nccp.eu-west-1.origin.prodaa.netflix.com
nrdp.nccp.eu-west-1.prodaa.netflix.com
nrdp.nccp.latency.prodaa.netflix.com
nrdp.nccp.us-east-1-sa.prodaa.netflix.com
nrdp.nccp.us-east-1.origin.prodaa.netflix.com
nrdp.nccp.us-east-1.prodaa.netflix.com
nrdp.nccp.us-east-2.origin.prodaa.netflix.com
nrdp.nccp.us-west-2.origin.prodaa.netflix.com
nrdp.nccp.us-west-2.prodaa.netflix.com
nrdp.prod.cloud.us-east-1.origin.prodaa.netflix.com
nrdp.prod.cloud.us-east-1.prodaa.netflix.com
nrdp.prod.cloud.us-west-2.origin.prodaa.netflix.com
nrdp.prod.cloud.us-west-2.prodaa.netflix.com
nsa-use1f-gw01.netflixstudios.com
nsa-usw2b-gw01.netflixstudios.com
nsa-usw2c-gw01.netflixstudios.com
obiwan-wc.eu-west-1.prodaa.netflix.com
obiwan-wc.us-east-1.prodaa.netflix.com
obiwan-wc.us-west-2.prodaa.netflix.com
obiwan.eu-west-1.prodaa.netflix.com
obiwan.latency.prodaa.netflix.com
obiwan.us-east-1-sa.prodaa.netflix.com
obiwan.us-east-1.prodaa.netflix.com
obiwan.us-west-2.prodaa.netflix.com
oca-api.eu-west-1.origin.prodaa.netflix.com
oca-api.eu-west-1.prodaa.netflix.com
oca-api.latency.prodaa.netflix.com
oca-api.us-east-1-sa.prodaa.netflix.com
oca-api.us-east-1.origin.prodaa.netflix.com
oca-api.us-east-1.prodaa.netflix.com
oca-api.us-west-2.origin.prodaa.netflix.com
oca-api.us-west-2.prodaa.netflix.com
occ-0-3924-3467.1.nflxso.net
partner.netflix.com
partnerapi.eu-west-1.prodaa.netflix.com
partnerapi.us-east-1-sa.prodaa.netflix.com
partnerapi.us-east-1.prodaa.netflix.com
partnerapi.us-west-2.prodaa.netflix.com
pix.netflix.com
playstation.nccp.eu-west-1.prodaa.netflix.com
playstation.nccp.latency.prodaa.netflix.com
playstation.nccp.us-east-1-sa.prodaa.netflix.com
playstation.nccp.us-east-1.prodaa.netflix.com
playstation.nccp.us-west-2.prodaa.netflix.com
po12.es02.cdg001.ix.nflxvideo.net
presentationtracking.eu-west-1.prodaa.netflix.com
presentationtracking.latency.prodaa.netflix.com
presentationtracking.us-east-1-sa.prodaa.netflix.com
presentationtracking.us-east-1.prodaa.netflix.com
presentationtracking.us-west-2.prodaa.netflix.com
privacyportal.onetrust.com
probe-cell4.prod.ftl.netflix.com
probe-cell7.prod.ftl.netflix.com
probe-cell8.prod.ftl.netflix.com
probe-cell9.prod.ftl.netflix.com
probe-dradis-anycast.prod.ftl.netflix.com
prod.cloud.eu-west-1.origin.prodaa.netflix.com
prod.cloud.eu-west-1.prodaa.netflix.com
prod.cloud.latency.prodaa.netflix.com
prod.cloud.us-east-1-sa.prodaa.netflix.com
prod.cloud.us-east-1.origin.prodaa.netflix.com
prod.cloud.us-east-1.prodaa.netflix.com
prod.cloud.us-west-2.prodaa.netflix.com
prod.http1.eu-west-1.origin.prodaa.netflix.com
prod.http1.eu-west-1.prodaa.netflix.com
prod.http1.latency.prodaa.netflix.com
prod.http1.us-east-1-sa.prodaa.netflix.com
prod.http1.us-east-1.origin.prodaa.netflix.com
prod.http1.us-east-1.prodaa.netflix.com
prod.http1.us-west-2.prodaa.netflix.com
prod.mtls.partner.eu-west-1.prodaa.netflix.com
prod.mtls.partner.us-east-1.prodaa.netflix.com
prod.mtls.partner.us-west-2.prodaa.netflix.com
prod.partner.eu-west-1.prodaa.netflix.com
prod.partner.us-east-1-sa.prodaa.netflix.com
prod.partner.us-east-1.prodaa.netflix.com
prod.partner.us-west-2.prodaa.netflix.com
prod.partnersecure.us-east-1.prodaa.netflix.com
prod.partnersecure.us-west-2.prodaa.netflix.com
prod.voicecontrol.eu-west-1.origin.prodaa.netflix.com
prod.voicecontrol.eu-west-1.prodaa.netflix.com
prod.voicecontrol.us-east-1-sa.prodaa.netflix.com
prod.voicecontrol.us-east-1.origin.prodaa.netflix.com
prod.voicecontrol.us-east-1.prodaa.netflix.com
prod.voicecontrol.us-west-2.origin.prodaa.netflix.com
prod.voicecontrol.us-west-2.prodaa.netflix.com
prototypes.netflix.com
push.prod.netflix.com
rap.netflix.com
sbc.netflix.com
schedule.dta.netflix.com
screening.netflix.com
sec-oc.netflix.com
segments.itp.netflix.com
sopbeta.netflix.com
static.netflix.com
stm-go.netflix.com
sv1-ddi01.netflix.com
sv1-ddi02.netflix.com
sv5-ddi01.netflix.com
tags.netflix.com
test.partnersecure.eu-west-1.prodaa.netflix.com
test.partnersecure.us-east-1.prodaa.netflix.com
test.partnersecure.us-west-2.prodaa.netflix.com
test.voicecontrol.eu-west-1.origin.prodaa.netflix.com
test.voicecontrol.eu-west-1.prodaa.netflix.com
test.voicecontrol.us-east-1-sa.prodaa.netflix.com
test.voicecontrol.us-east-1.origin.prodaa.netflix.com
test.voicecontrol.us-east-1.prodaa.netflix.com
test.voicecontrol.us-west-2.prodaa.netflix.com
testplan.dta.netflix.com
tractorbeam.us-west-2.prodaa.netflix.com
uiboot.eu-west-1.origin.prodaa.netflix.com
uiboot.eu-west-1.prodaa.netflix.com
uiboot.latency.prodaa.netflix.com
uiboot.us-east-1-sa.prodaa.netflix.com
uiboot.us-east-1.origin.prodaa.netflix.com
uiboot.us-east-1.prodaa.netflix.com
uiboot.us-west-2.origin.prodaa.netflix.com
uiboot.us-west-2.prodaa.netflix.com
us-east-1-probe.prod.ftl.netflix.com
us-west-2-probe.prod.ftl.netflix.com
util.netflix.com
vpn.netflix.com
web.prod.cloud.netflix.com
wvpn.netflix.com
www.netflix.com
www.netflixdnstest1.com
www.netflixtechblog.com
www.sandbox.eu-west-1.origin.prodaa.netflix.com
www.sandbox.eu-west-1.prodaa.netflix.com
www.sandbox.us-east-1-sa.prodaa.netflix.com
www.sandbox.us-east-1.origin.prodaa.netflix.com
www.sandbox.us-east-1.prodaa.netflix.com
www.sandbox.us-west-2.origin.prodaa.netflix.com
www.sandbox.us-west-2.prodaa.netflix.com
xbox.nccp.eu-west-1.prodaa.netflix.com
xbox.nccp.latency.prodaa.netflix.com
xbox.nccp.us-east-1-sa.prodaa.netflix.com
xbox.nccp.us-east-1.prodaa.netflix.com
xbox.nccp.us-west-2.prodaa.netflix.com

5
platforms/dns-num.txt Normal file
View File

@@ -0,0 +1,5 @@
themoviedb.org
tmdb.org
image.tmdb.org
api.themoviedb.org
tmdb-image-prod.b-cdn.net

View 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

View File

@@ -29,5 +29,4 @@ platform.api.openai.com
platform.openai.com
spinningup.openai.com
universe.openai.com
www.openai.com
chatgpt.com

View File

@@ -1,9 +1,5 @@
ya.ru
www.google.com
google.com
www.google.ru
google.ru
www.bing.com
bing.com
www.yahoo.com
yahoo.com

10307
platforms/dns-telegram.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -22,4 +22,5 @@ tiktokv.com
us.tiktok.com
verify-sg.tiktok.com
v16-tiktokcdn-com.akamaized.net
v16-va.tiktokcdn.com
v16-va.tiktokcdn.com
mcs-va.tiktokv.com

View File

@@ -20,7 +20,7 @@ thepirate-bay.org
torrentgalaxy.to
torrent-games.best
torrentz2eu.org
www.limetorrents.info
www.pirateproxy-bay.com
www.torlock.com
www.torrentdownloads.me
limetorrents.info
pirateproxy-bay.com
torlock.com
torrentdownloads.me

View File

@@ -187,7 +187,6 @@ tst.twitch.tv
ttv-redirect.m7g.twitch.tv
tv.twitch.tv
tw.blog.twitch.tv
twitch.tv
upload.twitch.tv
upload2.twitch.tv
usher.twitch.tv
@@ -201,17 +200,7 @@ watch.twitch.tv
webdisk.staging.twitch.tv
wwq.rc.twitch.tv
www-origin-anycast.twitch.tv
www.cis.blog.twitch.tv
www.cp2.rc.twitch.tv
www.ica.rc.twitch.tv
www.if.rc.twitch.tv
www.it.blog.twitch.tv
www.link.twitch.tv
www.lion.rc.twitch.tv
www.safesync.rc.twitch.tv
www.staging.twitch.tv
www.stash.rc.twitch.tv
www.twitch.tv
www.wwq.rc.twitch.tv
staging.twitch.tv
stash.rc.twitch.tv
zh-cn.twitch.tv
zh-tw.twitch.tv

View File

@@ -43,18 +43,12 @@ api-44-0-0.twitter.com
api-45-0-0.twitter.com
api-46-0-0.twitter.com
api-stream.twitter.com
cdn.syndication.twimg.com
dc-api.twitter.com
pbs.twimg.com
pbs.twimg.com.akamaized.net
pbs-ak.twimg.com
platform.twitter.com
s.twitter.com
syndication.twitter.com
t.co
ton.twitter.com
twitter.com
tweetdeck.com
twimg.com
video.twimg.com
x.com
x.com
abs.twimg.com
abs-0.twimg.com
pscp.tv

View 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
View 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

View File

@@ -2,4 +2,6 @@ configparser~=7.0.1
ipaddress~=1.0.23
dnspython~=2.6.1
httpx~=0.27.0
colorama~=0.4.6
colorama~=0.4.6
requests~=2.31.0
beautifulsoup4~=4.12.3

View File

@@ -1,6 +1,8 @@
# Вспомогательные утилиты:
- [subdomain - поиск субдоменов](#subdomain)
- [verified - проверка активности доменов](#verified)
- [convert - конвертер маршрутов](#convert)
- [split - разбить список на файлы по 1000 строк](#split)
## subdomain
@@ -9,12 +11,13 @@
### Функции
- Загружает страницу по указанному URL и извлекает домены из таблиц, где тип записи равен "A". Пытается повторить запрос до 5 раз в случае ошибки или отсутствия данных.
- Отправляет запросы к страницам, начиная с первой, и обрабатывает до трех страниц одновременно. Останавливается, если данные на последних трех страницах одинаковы или если три страницы подряд пустые.
- Загружает страницу по указанному URL и извлекает субдомены из таблиц, где тип записи равен "A".
- Пытается повторить запрос до 3х раз в случае ошибки или отсутствия данных.
- Останавливается, если данные на последних трех страницах одинаковы или если три страницы подряд пустые.
### Использование
1. Установите зависимости:
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
```bash
pip install -r requirements.txt
@@ -41,12 +44,12 @@
### Функции
- Проверяет домены используя DNS-серверы: Google Public DNS, Cloudflare DNS и Yandex. Пул потоков ограничен 40 рабочими потоками.
- Возвращает статус домена (делегирован, припаркован/неактивен) или ошибку.
- Возвращает статус домена: делегирован, припаркован/неактивен или ошибку.
- Если статус домена не был подтвержден как делегированный проводит его контрольную проверку.
### Использование
1. Установите зависимости:
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
```bash
pip install -r requirements.txt
@@ -61,3 +64,75 @@
```
4. Скрипт проверит домены и сохранит результат в файл `verified_domains.txt`.
## convert
Скрипт для обработки IP-адресов, их агрегации в подсети и форматирования маршрутов для различных типов сетевых устройств.
### Функции
- Загрузка списка IP-адресов из файла.
- Агрегация IP-адресов в подсети с масками `/16`, `/24`, или объединение нескольких подсетей.
- Исключение IP-адресов Cloudflare из итогового списка (при необходимости).
- Поддержка различных форматов маршрутизации:
- Windows (`route add`)
- Unix (`ip route`)
- Keenetic (`ip route` с интерфейсом)
- Mikrotik (`/ip firewall`)
- WireGuard
- OpenVPN
- CIDR (с указанием маски)
### Использование
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
```bash
pip install -r requirements.txt
```
2. Поместите файл c IP-адресами `ip.txt` в корневую директорию проекта. Файл может содержать любой текст и IP-адреса в любом виде - лишнее будет убрано автоматически.
3. Запустите скрипт:
```bash
python convert.py
```
4. Следуйте подсказкам на экране.
## split
Утилита для разбиения текстового файла на части фиксированного размера.
### Функции
В исходном файле остаются только первые 1000 строк (значение по умолчанию).
Остальные строки сохраняются в новые файлы:
- domain-ip-resolve2.txt
- domain-ip-resolve3.txt
- и т.д., по 1000 строк в каждом.
Если строк меньше или равно 1000 — разбиение не выполняется.
### Использование
1. Установите [зависимости](https://github.com/Ground-Zerro/DomainMapper/blob/main/requirements.txt):
```bash
pip install -r requirements.txt
```
2. Поместите файл c IP-адресами `domain-ip-resolve.txt` в корневую директорию проекта.
3. Запустите скрипт:
```bash
python split.py
```
### Можно указать свой файл и размер блока строк:
```bash
split_file_exact("mydata.txt", max_lines=500)
```

299
utilities/convert.py Normal file
View 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())

View File

@@ -1,3 +0,0 @@
dnspython~=2.6.1
requests~=2.31.0
beautifulsoup4~=4.12.3

48
utilities/split.py Normal file
View 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)

View File

@@ -27,13 +27,16 @@ def parse_page(url):
domain = columns[0].text.strip() # Извлечение столбца 'Domain'
data.add(domain) # Добавляем в множество
time.sleep(random.uniform(1, 3)) # Задержка между запросами
time.sleep(random.choice([2, 3, 4, 5])) # Случайная задержка между запросами
if attempt > 0:
print(f"Успешная загрузка {url} после {attempt}-й попытки.")
return data
except requests.exceptions.HTTPError as e:
if response.status_code == 429:
print(f"Ошибка загрузки {url}. Пробуем еще раз...")
time.sleep(3) # Фиксированная задержка перед повторной попыткой
print(f"Ошибка загрузки {url}. Пробуем еще раз... (Попытка {attempt + 1})")
time.sleep(5) # Фиксированная задержка перед повторной попыткой
else:
raise e
@@ -47,52 +50,42 @@ def parse_all_pages(base_url):
recent_pages_data = [] # Список для хранения данных последних страниц
while keep_parsing:
print(f"Парсим страницы с {page} по {page + 2}")
pages = [f"{base_url}?page={p}" for p in range(page, page + 3)]
print(f"Парсим страницу {page}")
url = f"{base_url}?page={page}"
try:
with ThreadPoolExecutor(max_workers=3) as executor:
future_to_url = {executor.submit(parse_page, url): url for url in pages}
for future in as_completed(future_to_url):
url = future_to_url[future]
try:
result = future.result()
if result is None: # Если страница пуста или не существует
print(f"Страница {url.split('=')[-1]} не существует или пуста. Проверяем еще раз...")
empty_page_attempts += 1
time.sleep(3) # Ожидание перед повторной проверкой
if empty_page_attempts >= 3:
print(f"Страница {url.split('=')[-1]} пуста после 3 попыток. Остановка.")
keep_parsing = False
break
else:
continue # Переходим к следующей попытке
else:
empty_page_attempts = 0 # Обнуляем счётчик, если нашли данные
all_domains.update(result) # Добавляем новые домены в множество
print(f"Разбор {url} завершен.")
# Добавляем данные страницы в список для сравнения
recent_pages_data.append(result)
if len(recent_pages_data) > 3: # Храним данные только последних 3 страниц
recent_pages_data.pop(0)
# Проверяем, повторяются ли данные на последних трёх страницах
if len(recent_pages_data) == 3 and recent_pages_data[0] == recent_pages_data[1] == recent_pages_data[2]:
print(f"Данные на последних трёх страницах одинаковы. Остановка парсинга.")
keep_parsing = False
break
except Exception as e:
print(f"Ошибка парсинга {url}: {e}")
raise e
except requests.exceptions.HTTPError as e:
if '429' in str(e):
print("Ошибка 429. Пауза 4 секунды.")
time.sleep(3) # Пауза 3 секунды при ошибке 429
result = parse_page(url)
if result is None: # Если страница пуста или не существует
print(f"Страница {page} не существует или пуста. Проверяем еще раз...")
empty_page_attempts += 1
time.sleep(5) # Ожидание перед повторной проверкой
if empty_page_attempts >= 3:
print(f"Страница {page} пуста после 3 попыток. Остановка.")
keep_parsing = False
break
else:
continue # Переходим к следующей попытке
else:
raise e # Пробрасываем другие ошибки, если они не 429
empty_page_attempts = 0 # Обнуляем счётчик, если нашли данные
all_domains.update(result) # Добавляем новые домены в множество
print(f"Разбор страницы {page} завершен.")
page += 3 # Переход к следующему набору страниц
# Добавляем данные страницы в список для сравнения
recent_pages_data.append(result)
if len(recent_pages_data) > 3: # Храним данные только последних 3 страниц
recent_pages_data.pop(0)
# Проверяем, повторяются ли данные на последних трёх страницах
if len(recent_pages_data) == 3 and recent_pages_data[0] == recent_pages_data[1] == recent_pages_data[2]:
print(f"Данные на последних трёх страницах одинаковы. Остановка парсинга.")
keep_parsing = False
break
except Exception as e:
print(f"Ошибка парсинга страницы {page}: {e}")
raise e
page += 1 # Переход к следующей странице
return all_domains

20
utilities/win/README.md Normal file
View 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
View 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
View 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
View 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
View 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>

View File

View File

144
web/web_install.sh Normal file
View 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"