From 758024ff5077ef2a40928dd7880041b805794d7f Mon Sep 17 00:00:00 2001 From: Ground-Zerro Date: Thu, 8 Aug 2024 22:14:01 +1100 Subject: [PATCH] update --- dnsdb.txt | 7 +++ main-SDS.py | 162 +++++++++++++++++++++++----------------------------- 2 files changed, 80 insertions(+), 89 deletions(-) create mode 100644 dnsdb.txt diff --git a/dnsdb.txt b/dnsdb.txt new file mode 100644 index 0000000..a7e1001 --- /dev/null +++ b/dnsdb.txt @@ -0,0 +1,7 @@ +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 \ No newline at end of file diff --git a/main-SDS.py b/main-SDS.py index 8681a52..140f377 100644 --- a/main-SDS.py +++ b/main-SDS.py @@ -2,7 +2,7 @@ import configparser import ipaddress import os import re -from concurrent.futures import ThreadPoolExecutor +from concurrent.futures import ThreadPoolExecutor, as_completed import dns.resolver import requests @@ -23,7 +23,6 @@ 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) @@ -39,11 +38,11 @@ dns_servers = { 'AdGuard DNS': ['94.140.14.14', '94.140.15.15'] } - # Function to resolve DNS -def resolve_dns_and_write(service, url, unique_ips_all_services, include_cloudflare, threads, cloudflare_ips_count, null_ips_count, resolver_nameservers): +def resolve_dns_and_write(service, url, unique_ips_all_services, include_cloudflare, threads, cloudflare_ips_count, + null_ips_count, resolver_nameserver_pairs): try: - print(f"Загрузка данных - {service}") + print(f"\033[33mЗагрузка данных - {service}\033[0m") response = requests.get(url) response.raise_for_status() dns_names = response.text.split('\n') @@ -55,17 +54,17 @@ def resolve_dns_and_write(service, url, unique_ips_all_services, include_cloudfl unique_ips_current_service = set() - print(f"Анализ DNS имен платформы: {service}") + print(f"\033[33mАнализ DNS имен платформы: {service}\033[0m") with ThreadPoolExecutor(max_workers=threads) as executor: futures = [] - for domain in dns_names: - if domain.strip(): - future = executor.submit(resolve_domain, domain, unique_ips_current_service, - unique_ips_all_services, cloudflare_ips, cloudflare_ips_count, null_ips_count, resolver_nameservers) - futures.append(future) + for nameserver_pair in resolver_nameserver_pairs: + future = executor.submit(resolve_domains_with_nameservers, dns_names, unique_ips_current_service, + unique_ips_all_services, cloudflare_ips, cloudflare_ips_count, null_ips_count, + nameserver_pair) + futures.append(future) - for future in futures: + for future in as_completed(futures): future.result() print(f"Список IP-адресов для платформы {service} создан.") @@ -74,7 +73,6 @@ def resolve_dns_and_write(service, url, unique_ips_all_services, include_cloudfl print(f"Не удалось сопоставить IP адреса {service} его доменным именам.", e) return "" - # Function to get Cloudflare IP addresses def get_cloudflare_ips(): try: @@ -94,34 +92,32 @@ def get_cloudflare_ips(): print("Ошибка при получении IP адресов Cloudflare:", e) return set() - -# Function resolve domain -def resolve_domain(domain, unique_ips_current_service, unique_ips_all_services, cloudflare_ips, cloudflare_ips_count, null_ips_count, resolver_nameservers): - try: - for nameserver in resolver_nameservers: - resolver = dns.resolver.Resolver() - resolver.nameservers = [nameserver] - resolver.rotate = True - resolver.timeout = 1 - resolver.lifetime = 1 - try: - ips = resolver.resolve(domain) - for ip in ips: - ip_address = ip.address - if ip_address in ('127.0.0.1', '0.0.0.0') or ip_address in resolver.nameservers: - null_ips_count[0] += 1 - elif ip_address in cloudflare_ips: - cloudflare_ips_count[0] += 1 - 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}\033[0m") - break - except Exception as e: - continue - except Exception as e: - print(f"\033[31mНе удалось обработать: {domain}\033[0m - {e}") - +# 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): + for domain in domains: + domain = domain.strip() + if domain: + for nameserver in nameservers: + resolver = dns.resolver.Resolver() + resolver.nameservers = [nameserver] + resolver.rotate = False + resolver.timeout = 1 + resolver.lifetime = 1 + try: + ips = resolver.resolve(domain) + for ip in ips: + ip_address = ip.address + if ip_address in ('127.0.0.1', '0.0.0.0') or ip_address in resolver.nameservers: + null_ips_count[0] += 1 + elif ip_address in cloudflare_ips: + cloudflare_ips_count[0] += 1 + 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") + except Exception as e: + print(f"\033[31mНе удалось разрешить {domain} через DNS сервер {nameserver}: {e}\033[0m") # Function to read configuration file def read_config(filename): @@ -154,7 +150,6 @@ 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: @@ -170,25 +165,15 @@ def check_service_config(service): else: os.system('clear') print("\nВыберите сервисы:\n") - print("0 - Отметить все") for idx, (service, url) in enumerate(urls.items(), 1): - checkbox = "[*]" if service in selected_services else "[ ]" - print(f"{idx}. {service.capitalize()} {checkbox}") + print(f"{idx}. {service.capitalize()}") - selection = input("\n\033[32mВведите номер сервиса\033[0m и нажмите Enter (Пустая строка " - "и \033[32mEnter\033[0m для старта): ") - if selection == "0": - selected_services = list(urls.keys()) - elif selection.isdigit(): - idx = int(selection) - 1 - if 0 <= idx < len(urls): - service = list(urls.keys())[idx] - if service in selected_services: - selected_services.remove(service) - else: - selected_services.append(service) - elif selection == "": - break + selection = input("\nУкажите номера сервисов через пробел и нажмите \033[32mEnter\033[0m: ") + if selection.strip(): + selections = selection.split() + selected_services = [list(urls.keys())[int(sel) - 1] for sel in selections if sel.isdigit() + and 1 <= int(sel) <= len(urls)] + break return selected_services def check_include_cloudflare(cloudflare): @@ -197,7 +182,7 @@ def check_include_cloudflare(cloudflare): elif cloudflare.lower() == 'no': return False else: - return input("Исключить IP адреса Cloudflare из итогового списка? (\033[32myes\033[0m " + return input("\nИсключить IP адреса Cloudflare из итогового списка? (\033[32myes\033[0m " "- исключить, \033[32mEnter\033[0m - оставить): ").strip().lower() == "yes" def check_dns_servers(): @@ -209,7 +194,7 @@ def check_dns_servers(): os.system('cls') else: os.system('clear') - print("Какие DNS сервера использовать?") + 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") @@ -218,33 +203,32 @@ def check_dns_servers(): 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("9. Завершить выбор") - selection = input("\n\033[32mВведите номер сервера\033[0m и нажмите Enter: ") - if selection.isdigit(): - selection = int(selection) - if selection == 1: - selected_dns_servers.extend(system_dns_servers) - elif selection == 2: - selected_dns_servers.extend(dns_servers['Google']) - elif selection == 3: - selected_dns_servers.extend(dns_servers['Quad9']) - elif selection == 4: - selected_dns_servers.extend(dns_servers['OpenDNS']) - elif selection == 5: - selected_dns_servers.extend(dns_servers['Cloudflare']) - elif selection == 6: - selected_dns_servers.extend(dns_servers['CleanBrowsing']) - elif selection == 7: - selected_dns_servers.extend(dns_servers['Alternate DNS']) - elif selection == 8: - selected_dns_servers.extend(dns_servers['AdGuard DNS']) - elif selection == 9: - break - elif selection == "": + selection = input("\nУкажите номера DNS серверов через пробел и нажмите \033[32mEnter\033[0m: ") + if selection.strip(): + selections = selection.split() + 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']) break - return selected_dns_servers if selected_dns_servers else system_dns_servers + return [selected_dns_servers[i:i+2] for i in range(0, len(selected_dns_servers), 2)] def process_file_format(filename, filetype, gateway): if not filetype: @@ -290,22 +274,22 @@ def main(): total_resolved_domains = 0 selected_services = check_service_config(service) - + resolver_nameserver_pairs = check_dns_servers() # Get selected DNS server pairs include_cloudflare = check_include_cloudflare(cloudflare) unique_ips_all_services = set() cloudflare_ips_count = [0] # To count the number of Cloudflare IPs excluded null_ips_count = [0] # To count the number of null IPs excluded - resolver_nameservers = check_dns_servers() # Get selected DNS servers with open(filename, 'w', encoding='utf-8-sig') as file: for service in selected_services: - result = resolve_dns_and_write(service, urls[service], unique_ips_all_services, include_cloudflare, threads, cloudflare_ips_count, null_ips_count, resolver_nameservers) + result = resolve_dns_and_write(service, urls[service], unique_ips_all_services, include_cloudflare, + threads, cloudflare_ips_count, null_ips_count, resolver_nameserver_pairs) file.write(result) total_resolved_domains += len(result.split('\n')) - 1 print("\nПроверка завершена.") - print(f"Использовались DNS сервера: {', '.join(resolver_nameservers)}") + print(f"Использовались DNS сервера: {', '.join([', '.join(pair) for pair in resolver_nameserver_pairs])}") if include_cloudflare: print(f"Исключено IP-адресов Cloudflare: {cloudflare_ips_count[0]}") print(f"Исключено IP-адресов 'заглушек' провайдера: {null_ips_count[0]}")