From 966e11db769681baca51874b3e7ce2572be84048 Mon Sep 17 00:00:00 2001 From: Ground-Zerro Date: Fri, 9 Aug 2024 20:12:12 +1100 Subject: [PATCH] update --- README.md | 35 ++++++++++++----- main-SDS.py | 98 +++++++++++++++++++++++++----------------------- requirements.txt | 3 -- todo.txt | 12 ++---- 4 files changed, 81 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 17425b6..8e80280 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ ## Domain Mapper -**Описание:** Это инструмент на языке Python, предназначенный для разрешения DNS имен популярных веб-сервисов в IP-адреса. +**Описание:** Инструмент на языке Python, предназначенный для разрешения DNS имен популярных веб-сервисов в IP-адреса. -Включена поддержка следующих сервисов: +Имеется поддержка следующих сервисов: - [Antifilter - community edition](https://community.antifilter.download/) - Youtube - Facebook @@ -22,17 +22,15 @@ **Функции:** -- Разрешение DNS: Скрипт загружает списки доменных имен Antifilter - community edition, а также популярных сервисов и разрешает их в IP-адреса используя публичные DNS-сервера. -- Фильтрация: Итоговый список содержит только уникальные IP-адреса исключая дубликаты, также фильтруются IP-адреса самих DNS-серверов, заглушки в виде редиректа на localhost и (по желанию) IP-адреса Cloudflare. -- Конфигурация: С помощью конфигурационного файла можно настроить все параметры работы скрипта в т.ч. задать список сервисов, формат сохранения, количество потоков, имя выводного файла и другие. -- Интерфейс: Скрипт предоставляет интерактивный интерфейс для выбора сервисов из предопределенного списка. +- Скрипт загружает списки доменных имен Antifilter - community edition, а также популярных сервисов и разрешает их в IP-адреса используя публичные DNS-сервера. +- Итоговый список содержит только уникальные IP-адреса исключая дубликаты, также фильтруются IP-адреса самих DNS-серверов, заглушки в виде редиректа на localhost и (по желанию) IP-адреса Cloudflare. +- С помощью конфигурационного файла можно настроить все параметры работы в т.ч. задать список сервисов, формат сохранения, количество потоков, имя выводного файла и другие. **Автоматизация:** -В конфигурационном файле можно добавить выполнение кастомной команды в консоли для запуска другого скрипта или программы при завершении работы основного скрипта. Конфигурационный файл позволяет настроить работу скрипта в "молчаливом" режиме - без промтов к пользователю. - +Так же в конфигурационном файле можно добавить выполнение кастомной команды в консоли для запуска другого скрипта или программы при завершении его работы. **Зависимости:** Для работы Domain Mapper необходимо наличие следующих библиотек Python: @@ -52,4 +50,23 @@ pip3 install -r requirements.txt -#### Протестировано в Ubuntu 20.04 и Windows 10/11 +###### Протестировано в Ubuntu 20.04 и Windows 10/11 + + + +## Domain Mapper SDS (main-SDS.py) +###### Небольшой форк основного кода + + +**Отличия:** +- Иной подход к работе меню. +- Возможность выбора DNS серверов, которые будут использованы для проверки, в т.ч.: Системный DNS, Google, Quad9, OpenDNS, Cloudflare, CleanBrowsing, Alternate DNS, AdGuard DNS (пишите если нужно что-то еще добавить). + +*В отличии от основной программы проверка DNS имени будет производиться не до первого успешного разрешения его IP-адреса, а последовательно используя каждый из указанных пользователем DNS серверов. По другому говоря - скрипт будет пытаться получить IP адрес DNS имени отдельно у каждого DNS сервера, что повышает шансы разрешить его IP в случае, например "заглушек" провайдера.* +- Список сервисов и DNS серверов исключен из кода, теперь они загружаются с Github. + +*Таким образом пользователь получит актуальные данные запустив даже старую версию скрипта.* +- Автоматизация при помощи config.ini пока частичная. +- Более долгая работа т.к. DNS имя запрашивается у каждого из указанных DNS серверов. + +*Можно частично компенсировать увеличением числа используемых потоков, однако будьте осторожны - не превысьте количество установленных DNS сервером запросов в секунду, чтобы не получать от него таймаут вместо разрешенного IP-адреса.* diff --git a/main-SDS.py b/main-SDS.py index 140f377..2f91afd 100644 --- a/main-SDS.py +++ b/main-SDS.py @@ -7,6 +7,7 @@ from concurrent.futures import ThreadPoolExecutor, as_completed import dns.resolver import requests + # Function to load URLs from external file def load_urls(url): try: @@ -23,20 +24,30 @@ def load_urls(url): print(f"Ошибка при загрузке списка платформ: {e}") return {} -# Load URLs from external file -platform_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platformdb.txt" -urls = load_urls(platform_db_url) -dns_servers = { - 'Системные': None, - 'Google': ['8.8.8.8', '8.8.4.4'], - 'Quad9': ['9.9.9.9', '149.112.112.112'], - 'OpenDNS': ['208.67.222.222', '208.67.220.220'], - 'Cloudflare': ['1.1.1.1', '1.0.0.1'], - 'CleanBrowsing': ['185.228.168.9', '185.228.169.9'], - 'Alternate DNS': ['76.76.19.19', '76.223.122.150'], - 'AdGuard DNS': ['94.140.14.14', '94.140.15.15'] -} +# Function to load DNS servers from external file +def load_dns_servers(url): + try: + response = requests.get(url) + response.raise_for_status() + lines = response.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 {} + + +# Load URLs and DNS servers from external files +platform_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/platformdb.txt" +dns_db_url = "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/main/dnsdb.txt" +urls = load_urls(platform_db_url) +dns_servers = load_dns_servers(dns_db_url) + # Function to resolve DNS def resolve_dns_and_write(service, url, unique_ips_all_services, include_cloudflare, threads, cloudflare_ips_count, @@ -67,12 +78,13 @@ def resolve_dns_and_write(service, url, unique_ips_all_services, include_cloudfl for future in as_completed(futures): future.result() - print(f"Список IP-адресов для платформы {service} создан.") + print(f"\033[33mСписок IP-адресов для платформы {service} создан.\033[0m") return '\n'.join(unique_ips_current_service) + '\n' except Exception as e: print(f"Не удалось сопоставить IP адреса {service} его доменным именам.", e) return "" + # Function to get Cloudflare IP addresses def get_cloudflare_ips(): try: @@ -92,9 +104,11 @@ def get_cloudflare_ips(): print("Ошибка при получении IP адресов Cloudflare:", e) return set() + # Function resolve domain using a pair of DNS servers def resolve_domains_with_nameservers(domains, unique_ips_current_service, unique_ips_all_services, cloudflare_ips, - cloudflare_ips_count, null_ips_count, nameservers): + cloudflare_ips_count, null_ips_count, nameserver_pair): + dns_server_name, nameservers = nameserver_pair for domain in domains: domain = domain.strip() if domain: @@ -115,9 +129,10 @@ def resolve_domains_with_nameservers(domains, unique_ips_current_service, unique elif ip_address not in unique_ips_all_services: unique_ips_current_service.add(ip_address) unique_ips_all_services.add(ip_address) - print(f"\033[36m{domain} IP адрес: {ip_address} через DNS сервер: {nameserver}\033[0m") + print(f"\033[36m{domain} IP адрес: {ip_address} получен от {dns_server_name}\033[0m") except Exception as e: - print(f"\033[31mНе удалось разрешить {domain} через DNS сервер {nameserver}: {e}\033[0m") + print(f"\033[31mНе удалось разрешить {domain} через {dns_server_name}\033[0m") + # Function to read configuration file def read_config(filename): @@ -142,6 +157,7 @@ def read_config(filename): print(f"Ошибка загрузки конфигурации: {e}") return '', 20, 'domain-ip-resolve.txt', '', '', '', '' + def gateway_input(gateway): if not gateway: input_gateway = input(f"Укажите \033[32mшлюз\033[0m или \033[32mимя интерфейса\033[0m: ") @@ -150,6 +166,7 @@ def gateway_input(gateway): else: return gateway + # Function to check if 'service' is specified in the configuration file def check_service_config(service): if service: @@ -164,7 +181,7 @@ def check_service_config(service): os.system('cls') else: os.system('clear') - print("\nВыберите сервисы:\n") + print("\nВыберите сервисы:") for idx, (service, url) in enumerate(urls.items(), 1): print(f"{idx}. {service.capitalize()}") @@ -176,6 +193,7 @@ def check_service_config(service): break return selected_services + def check_include_cloudflare(cloudflare): if cloudflare.lower() == 'yes': return True @@ -185,24 +203,22 @@ def check_include_cloudflare(cloudflare): return input("\nИсключить IP адреса Cloudflare из итогового списка? (\033[32myes\033[0m " "- исключить, \033[32mEnter\033[0m - оставить): ").strip().lower() == "yes" + +# Function to select DNS servers def check_dns_servers(): system_dns_servers = dns.resolver.Resolver().nameservers selected_dns_servers = [] + dns_server_options = [('Системный DNS', system_dns_servers)] + list(dns_servers.items()) + while True: if os.name == 'nt': os.system('cls') else: os.system('clear') - print("Какие DNS сервера использовать?\n") - print(f"1. Системные: {', '.join(system_dns_servers)}") - print("2. Google: 8.8.8.8 и 8.8.4.4") - print("3. Quad9: 9.9.9.9 и 149.112.112.112") - print("4. OpenDNS: 208.67.222.222 и 208.67.220.220") - print("5. Cloudflare: 1.1.1.1 и 1.0.0.1") - print("6. CleanBrowsing: 185.228.168.9 и 185.228.169.9") - print("7. Alternate DNS: 76.76.19.19 и 76.223.122.150") - print("8. AdGuard DNS: 94.140.14.14 и 94.140.15.15") + print("\nКакие DNS сервера использовать?") + for idx, (name, servers) in enumerate(dns_server_options, 1): + print(f"{idx}. {name}: {', '.join(servers)}") selection = input("\nУкажите номера DNS серверов через пробел и нажмите \033[32mEnter\033[0m: ") if selection.strip(): @@ -210,25 +226,12 @@ def check_dns_servers(): for sel in selections: if sel.isdigit(): sel = int(sel) - if sel == 1: - selected_dns_servers.extend(system_dns_servers) - elif sel == 2: - selected_dns_servers.extend(dns_servers['Google']) - elif sel == 3: - selected_dns_servers.extend(dns_servers['Quad9']) - elif sel == 4: - selected_dns_servers.extend(dns_servers['OpenDNS']) - elif sel == 5: - selected_dns_servers.extend(dns_servers['Cloudflare']) - elif sel == 6: - selected_dns_servers.extend(dns_servers['CleanBrowsing']) - elif sel == 7: - selected_dns_servers.extend(dns_servers['Alternate DNS']) - elif sel == 8: - selected_dns_servers.extend(dns_servers['AdGuard DNS']) + if 1 <= sel <= len(dns_server_options): + selected_dns_servers.append((dns_server_options[sel-1][0], dns_server_options[sel-1][1])) break - return [selected_dns_servers[i:i+2] for i in range(0, len(selected_dns_servers), 2)] + return selected_dns_servers + def process_file_format(filename, filetype, gateway): if not filetype: @@ -269,6 +272,7 @@ def process_file_format(filename, filetype, gateway): else: pass + def main(): service, threads, filename, cloudflare, filetype, gateway, run_command = read_config('config.ini') @@ -289,11 +293,12 @@ def main(): total_resolved_domains += len(result.split('\n')) - 1 print("\nПроверка завершена.") - print(f"Использовались DNS сервера: {', '.join([', '.join(pair) for pair in resolver_nameserver_pairs])}") + print(f"Использовались DNS сервера: {', '.join([f'{pair[0]} ({", ".join(pair[1])})' for pair + in resolver_nameserver_pairs])}") if include_cloudflare: print(f"Исключено IP-адресов Cloudflare: {cloudflare_ips_count[0]}") print(f"Исключено IP-адресов 'заглушек' провайдера: {null_ips_count[0]}") - print(f"Разрешено IP-адресов из DNS списка: {total_resolved_domains}") + print(f"Разрешено IP-адресов из DNS имен сервисов: {total_resolved_domains}") process_file_format(filename, filetype, gateway) @@ -305,5 +310,6 @@ def main(): if os.name == 'nt': input("Нажмите \033[32mEnter\033[0m для выхода...") + if __name__ == "__main__": main() diff --git a/requirements.txt b/requirements.txt index 6eb4c57..79bb976 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,3 @@ requests~=2.31.0 dnspython~=2.6.1 ipaddress~=1.0.23 configparser~=7.0.0 - -asyncssh~=2.15.0 -dnslib~=0.9.25 \ No newline at end of file diff --git a/todo.txt b/todo.txt index 94100d7..6f6e96e 100644 --- a/todo.txt +++ b/todo.txt @@ -1,10 +1,4 @@ - , , : "1 2 3 10 12". - DNS . - DNS , : "1 2 3 10 12". - DNS . - #URL , DNS . - resolvedns DNS , DNS + resolvedns DNS , DNS. + . . - - - +... \ No newline at end of file