Не нашел такого скрипта и решил сам закинуть. Может будет полезно кому, затестите поставите. Сделал потому, что у меня чет ****аться началось bot.py import dns.resolver import time import statistics import concurrent.futures import csv import sys import subprocess import re from typing import List, Dict, Optional, Tuple, Set DNS_SERVERS_FILE = "dns_servers.csv" TEST_DOMAIN = "google.com" QUERY_COUNT = 5 TIMEOUT = 2.0 def get_system_dns_servers() -> List[str]: system_dns = [] try: if sys.platform == "win32": result = subprocess.run(["ipconfig", "/all"], capture_output=True, text=True, encoding='cp866', errors='ignore') dns_servers = re.findall(r"DNS Servers.*: ([\d.]+)", result.stdout) system_dns.extend(ip.strip() for ip in dns_servers if ip.strip()) else: with open("/etc/resolv.conf", "r") as f: for line in f: if line.strip().startswith("nameserver"): parts = line.strip().split() if len(parts) > 1: system_dns.append(parts[1]) except Exception as e: print(f"[!] Не удалось определить системные DNS-серверы: {e}") unique_dns = sorted(list(set(system_dns))) if unique_dns: print(f"[+] Обнаружены системные DNS: {', '.join(unique_dns)}") return unique_dns def load_servers_and_metadata(filename: str, system_dns: List[str]) -> Tuple[List[str], Dict[str, Dict]]: all_ips_to_test: Set[str] = set() metadata_map: Dict[str, Dict] = {} for ip in system_dns: all_ips_to_test.add(ip) metadata_map[ip] = {'provider': 'System DNS', 'country': 'Local', 'partner': 'N/A'} try: with open(filename, 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: if not row or row[0].strip().startswith('#'): continue provider, country, primary_ip = map(str.strip, row[:3]) secondary_ip = row[3].strip() if len(row) > 3 and row[3].strip() else None if not primary_ip: continue all_ips_to_test.add(primary_ip) metadata_map[primary_ip] = {'provider': provider, 'country': country, 'partner': secondary_ip} if secondary_ip: all_ips_to_test.add(secondary_ip) metadata_map[secondary_ip] = {'provider': provider, 'country': country, 'partner': primary_ip} print(f"[+] Загружено {len(all_ips_to_test)} уникальных IP-адресов для теста.") return list(all_ips_to_test), metadata_map except FileNotFoundError: print(f"[!] Ошибка: Файл '{filename}' не найден. Пожалуйста, создайте его.") return list(all_ips_to_test), metadata_map except Exception as e: print(f"[!] Критическая ошибка при чтении файла '{filename}': {e}") return list(all_ips_to_test), metadata_map def test_single_dns_server(server_ip: str) -> Tuple[str, Optional[float]]: resolver = dns.resolver.Resolver() resolver.nameservers = [server_ip] resolver.timeout = TIMEOUT resolver.lifetime = TIMEOUT timings = [] try: for _ in range(QUERY_COUNT): start_time = time.perf_counter() resolver.resolve(TEST_DOMAIN, 'A') end_time = time.perf_counter() timings.append((end_time - start_time) * 1000) return server_ip, statistics.mean(timings) except Exception: return server_ip, None def main(): system_dns = get_system_dns_servers() all_ips, metadata = load_servers_and_metadata(DNS_SERVERS_FILE, system_dns) if not all_ips: return results: Dict[str, float] = {} failed_servers: List[str] = [] print(f"\n[*] Начинаю тестирование {len(all_ips)} IP-адресов.") with concurrent.futures.ThreadPoolExecutor(max_workers=len(all_ips)) as executor: future_to_server = {executor.submit(test_single_dns_server, ip): ip for ip in all_ips} for future in concurrent.futures.as_completed(future_to_server): server_ip, avg_time = future.result() if avg_time is not None: results[server_ip] = avg_time print(f" [+] {server_ip:<15} - Успешно (Среднее: {avg_time:.2f} мс)") else: failed_servers.append(server_ip) print(f" [!] {server_ip:<15} - Не отвечает") print("\n" + "="*90) print("--- Итоговые результаты тестирования ---".center(90)) print("="*90) if not results: print("Не удалось получить ответ ни от одного сервера.".center(90)) else: sorted_results = sorted(results.items(), key=lambda item: item[1]) print(f"{'#':<4} {'IP-пара (dns1 / dns2)':<34} {'Провайдер':<20} {'Страна':<12} {'Время (мс)':<12}") print("-" * 90) for i, (server, timing) in enumerate(sorted_results, 1): info = metadata.get(server, {}) provider = info.get('provider', 'N/A') country = info.get('country', 'N/A') partner = info.get('partner', '---') or '---' is_system = provider == 'System DNS' marker = '*' if is_system else ' ' ip_pair = f"{server} / {partner}" if partner != '---' and partner != 'N/A' else server print(f"{marker}{i:<3} {ip_pair:<34} {provider:<20} {country:<12} {timing:<12.2f}") print("-" * 90) print("* - DNS, настроенный в вашей операционной системе.") best_server_ip, best_server_time = sorted_results[0] best_provider = metadata.get(best_server_ip, {}).get('provider', 'N/A') print(f"\n Самый быстрый DNS-сервер: {best_server_ip} ({best_provider}) со средним временем {best_server_time:.2f} мс") system_results = {ip: time for ip, time in results.items() if ip in system_dns} if system_results: best_system_ip = min(system_results, key=system_results.get) best_system_time = system_results[best_system_ip] print(f" ваш системный DNS ({best_system_ip}) показал результат {best_system_time:.2f} мс") # if failed_servers: # print("\nСледующие серверы не ответили на запросы:") # for server in sorted(failed_servers): # # print(f" - {server}") # # раскоментируйте если вам это надо, но будет много спама (там вроде 1/3 dns не отвечает нихуя из моей базы) if __name__ == "__main__": main() Python import dns.resolver import time import statistics import concurrent.futures import csv import sys import subprocess import re from typing import List, Dict, Optional, Tuple, Set DNS_SERVERS_FILE = "dns_servers.csv" TEST_DOMAIN = "google.com" QUERY_COUNT = 5 TIMEOUT = 2.0 def get_system_dns_servers() -> List[str]: system_dns = [] try: if sys.platform == "win32": result = subprocess.run(["ipconfig", "/all"], capture_output=True, text=True, encoding='cp866', errors='ignore') dns_servers = re.findall(r"DNS Servers.*: ([\d.]+)", result.stdout) system_dns.extend(ip.strip() for ip in dns_servers if ip.strip()) else: with open("/etc/resolv.conf", "r") as f: for line in f: if line.strip().startswith("nameserver"): parts = line.strip().split() if len(parts) > 1: system_dns.append(parts[1]) except Exception as e: print(f"[!] Не удалось определить системные DNS-серверы: {e}") unique_dns = sorted(list(set(system_dns))) if unique_dns: print(f"[+] Обнаружены системные DNS: {', '.join(unique_dns)}") return unique_dns def load_servers_and_metadata(filename: str, system_dns: List[str]) -> Tuple[List[str], Dict[str, Dict]]: all_ips_to_test: Set[str] = set() metadata_map: Dict[str, Dict] = {} for ip in system_dns: all_ips_to_test.add(ip) metadata_map[ip] = {'provider': 'System DNS', 'country': 'Local', 'partner': 'N/A'} try: with open(filename, 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: if not row or row[0].strip().startswith('#'): continue provider, country, primary_ip = map(str.strip, row[:3]) secondary_ip = row[3].strip() if len(row) > 3 and row[3].strip() else None if not primary_ip: continue all_ips_to_test.add(primary_ip) metadata_map[primary_ip] = {'provider': provider, 'country': country, 'partner': secondary_ip} if secondary_ip: all_ips_to_test.add(secondary_ip) metadata_map[secondary_ip] = {'provider': provider, 'country': country, 'partner': primary_ip} print(f"[+] Загружено {len(all_ips_to_test)} уникальных IP-адресов для теста.") return list(all_ips_to_test), metadata_map except FileNotFoundError: print(f"[!] Ошибка: Файл '{filename}' не найден. Пожалуйста, создайте его.") return list(all_ips_to_test), metadata_map except Exception as e: print(f"[!] Критическая ошибка при чтении файла '{filename}': {e}") return list(all_ips_to_test), metadata_map def test_single_dns_server(server_ip: str) -> Tuple[str, Optional[float]]: resolver = dns.resolver.Resolver() resolver.nameservers = [server_ip] resolver.timeout = TIMEOUT resolver.lifetime = TIMEOUT timings = [] try: for _ in range(QUERY_COUNT): start_time = time.perf_counter() resolver.resolve(TEST_DOMAIN, 'A') end_time = time.perf_counter() timings.append((end_time - start_time) * 1000) return server_ip, statistics.mean(timings) except Exception: return server_ip, None def main(): system_dns = get_system_dns_servers() all_ips, metadata = load_servers_and_metadata(DNS_SERVERS_FILE, system_dns) if not all_ips: return results: Dict[str, float] = {} failed_servers: List[str] = [] print(f"\n[*] Начинаю тестирование {len(all_ips)} IP-адресов.") with concurrent.futures.ThreadPoolExecutor(max_workers=len(all_ips)) as executor: future_to_server = {executor.submit(test_single_dns_server, ip): ip for ip in all_ips} for future in concurrent.futures.as_completed(future_to_server): server_ip, avg_time = future.result() if avg_time is not None: results[server_ip] = avg_time print(f" [+] {server_ip:<15} - Успешно (Среднее: {avg_time:.2f} мс)") else: failed_servers.append(server_ip) print(f" [!] {server_ip:<15} - Не отвечает") print("\n" + "="*90) print("--- Итоговые результаты тестирования ---".center(90)) print("="*90) if not results: print("Не удалось получить ответ ни от одного сервера.".center(90)) else: sorted_results = sorted(results.items(), key=lambda item: item[1]) print(f"{'#':<4} {'IP-пара (dns1 / dns2)':<34} {'Провайдер':<20} {'Страна':<12} {'Время (мс)':<12}") print("-" * 90) for i, (server, timing) in enumerate(sorted_results, 1): info = metadata.get(server, {}) provider = info.get('provider', 'N/A') country = info.get('country', 'N/A') partner = info.get('partner', '---') or '---' is_system = provider == 'System DNS' marker = '*' if is_system else ' ' ip_pair = f"{server} / {partner}" if partner != '---' and partner != 'N/A' else server print(f"{marker}{i:<3} {ip_pair:<34} {provider:<20} {country:<12} {timing:<12.2f}") print("-" * 90) print("* - DNS, настроенный в вашей операционной системе.") best_server_ip, best_server_time = sorted_results[0] best_provider = metadata.get(best_server_ip, {}).get('provider', 'N/A') print(f"\n Самый быстрый DNS-сервер: {best_server_ip} ({best_provider}) со средним временем {best_server_time:.2f} мс") system_results = {ip: time for ip, time in results.items() if ip in system_dns} if system_results: best_system_ip = min(system_results, key=system_results.get) best_system_time = system_results[best_system_ip] print(f" ваш системный DNS ({best_system_ip}) показал результат {best_system_time:.2f} мс") # if failed_servers: # print("\nСледующие серверы не ответили на запросы:") # for server in sorted(failed_servers): # # print(f" - {server}") # # раскоментируйте если вам это надо, но будет много спама (там вроде 1/3 dns не отвечает нихуя из моей базы) if __name__ == "__main__": main() dns_servers.csv Google,USA,8.8.8.8,8.8.4.4 Cloudflare,USA,1.1.1.1,1.0.0.1 Quad9,USA,9.9.9.9,149.112.112.112 OpenDNS Home,USA,208.67.222.222,208.67.220.220 Verisign,USA,64.6.64.6,64.6.65.6 Level3,USA,209.244.0.3,209.244.0.4 Neustar,USA,156.154.70.1,156.154.71.1 AdGuard DNS,Cyprus,94.140.14.14,94.140.15.15 AdGuard Family,Cyprus,94.140.14.15,94.140.15.16 Cloudflare Malware,USA,1.1.1.2,1.0.0.2 Cloudflare Family,USA,1.1.1.3,1.0.0.3 Quad9 (Malware + NoECS),USA,9.9.9.10,149.112.112.10 OpenDNS FamilyShield,USA,208.67.222.123,208.67.220.123 CleanBrowsing (Security),USA,185.228.168.9,185.228.169.9 CleanBrowsing (Adult),USA,185.228.168.10,185.228.169.10 CleanBrowsing (Family),USA,185.228.168.168,185.228.169.168 Comodo Secure,USA,8.26.56.26,8.20.247.20 Norton ConnectSafe-A,USA,199.85.126.10,199.85.127.10 Norton ConnectSafe-B,USA,199.85.126.20,199.85.127.20 Norton ConnectSafe-C,USA,199.85.126.30,199.85.127.30 Neustar (Malware),USA,156.154.70.2,156.154.71.2 Neustar (Porn),USA,156.154.70.3,156.154.71.3 Neustar (Gambling),USA,156.154.70.4,156.154.71.4 DNS.WATCH,Germany,84.200.69.80,84.200.70.40 UncensoredDNS,Denmark,91.239.100.100,89.233.43.71 Freenom,Netherlands,80.80.80.80,80.80.81.81 Alternate DNS,USA,76.76.19.19,76.223.122.150 Censurfridns,Denmark,89.233.43.71,91.239.100.100 Digitalcourage,Germany,5.9.164.112, Swiss Privacy,Switzerland,194.182.168.60, Applied Privacy,Austria,146.255.56.98, LibreDNS,Switzerland,116.203.115.194, Yandex,Russia,77.88.8.8,77.88.8.1 Yandex Safe,Russia,77.88.8.88,77.88.8.2 Yandex Family,Russia,77.88.8.7,77.88.8.3 Mail.ru,Russia,94.100.184.201, SkyDNS,Russia,193.58.251.123, MTS,Russia,193.232.248.2,213.87.1.2 Beeline,Russia,85.21.192.3,213.24.94.3 Rostelecom (Moscow),Russia,195.34.131.20, Rostelecom (Ural),Russia,8.8.8.8,77.88.8.8 Rostelecom (Siberia),Russia,212.1.224.6,212.1.244.6 Megafon,Russia,10.10.10.10, CZ.NIC,Czech Republic,185.43.135.1,193.17.47.1 OVH,France,213.186.33.99, Deutsche Telekom,Germany,194.25.2.129, Hurricane Electric,USA,74.82.42.42, OpenNIC (EU),Europe,109.74.192.20, OpenNIC (FR),France,193.110.157.32, OpenNIC (DE),Germany,163.172.168.171, 114DNS,China,114.114.114.114,114.114.115.115 AliDNS,China,223.5.5.5,223.6.6.6 BaiduDNS,China,180.76.76.76, DNSPod,China,119.29.29.29,182.254.116.116 NTT,Japan,129.250.35.250,129.250.35.251 KT Corporation,South Korea,168.126.63.1,168.126.63.2 SafeDNS,USA,195.46.39.39,195.46.39.40 Dyn,USA,216.146.35.35,216.146.36.36 FreeDNS,Austria,37.235.1.174,37.235.1.177 PuntCAT,Spain,109.69.8.51, Fourth Estate,USA,45.77.165.194, Код Google,USA,8.8.8.8,8.8.4.4 Cloudflare,USA,1.1.1.1,1.0.0.1 Quad9,USA,9.9.9.9,149.112.112.112 OpenDNS Home,USA,208.67.222.222,208.67.220.220 Verisign,USA,64.6.64.6,64.6.65.6 Level3,USA,209.244.0.3,209.244.0.4 Neustar,USA,156.154.70.1,156.154.71.1 AdGuard DNS,Cyprus,94.140.14.14,94.140.15.15 AdGuard Family,Cyprus,94.140.14.15,94.140.15.16 Cloudflare Malware,USA,1.1.1.2,1.0.0.2 Cloudflare Family,USA,1.1.1.3,1.0.0.3 Quad9 (Malware + NoECS),USA,9.9.9.10,149.112.112.10 OpenDNS FamilyShield,USA,208.67.222.123,208.67.220.123 CleanBrowsing (Security),USA,185.228.168.9,185.228.169.9 CleanBrowsing (Adult),USA,185.228.168.10,185.228.169.10 CleanBrowsing (Family),USA,185.228.168.168,185.228.169.168 Comodo Secure,USA,8.26.56.26,8.20.247.20 Norton ConnectSafe-A,USA,199.85.126.10,199.85.127.10 Norton ConnectSafe-B,USA,199.85.126.20,199.85.127.20 Norton ConnectSafe-C,USA,199.85.126.30,199.85.127.30 Neustar (Malware),USA,156.154.70.2,156.154.71.2 Neustar (Porn),USA,156.154.70.3,156.154.71.3 Neustar (Gambling),USA,156.154.70.4,156.154.71.4 DNS.WATCH,Germany,84.200.69.80,84.200.70.40 UncensoredDNS,Denmark,91.239.100.100,89.233.43.71 Freenom,Netherlands,80.80.80.80,80.80.81.81 Alternate DNS,USA,76.76.19.19,76.223.122.150 Censurfridns,Denmark,89.233.43.71,91.239.100.100 Digitalcourage,Germany,5.9.164.112, Swiss Privacy,Switzerland,194.182.168.60, Applied Privacy,Austria,146.255.56.98, LibreDNS,Switzerland,116.203.115.194, Yandex,Russia,77.88.8.8,77.88.8.1 Yandex Safe,Russia,77.88.8.88,77.88.8.2 Yandex Family,Russia,77.88.8.7,77.88.8.3 Mail.ru,Russia,94.100.184.201, SkyDNS,Russia,193.58.251.123, MTS,Russia,193.232.248.2,213.87.1.2 Beeline,Russia,85.21.192.3,213.24.94.3 Rostelecom (Moscow),Russia,195.34.131.20, Rostelecom (Ural),Russia,8.8.8.8,77.88.8.8 Rostelecom (Siberia),Russia,212.1.224.6,212.1.244.6 Megafon,Russia,10.10.10.10, CZ.NIC,Czech Republic,185.43.135.1,193.17.47.1 OVH,France,213.186.33.99, Deutsche Telekom,Germany,194.25.2.129, Hurricane Electric,USA,74.82.42.42, OpenNIC (EU),Europe,109.74.192.20, OpenNIC (FR),France,193.110.157.32, OpenNIC (DE),Germany,163.172.168.171, 114DNS,China,114.114.114.114,114.114.115.115 AliDNS,China,223.5.5.5,223.6.6.6 BaiduDNS,China,180.76.76.76, DNSPod,China,119.29.29.29,182.254.116.116 NTT,Japan,129.250.35.250,129.250.35.251 KT Corporation,South Korea,168.126.63.1,168.126.63.2 SafeDNS,USA,195.46.39.39,195.46.39.40 Dyn,USA,216.146.35.35,216.146.36.36 FreeDNS,Austria,37.235.1.174,37.235.1.177 PuntCAT,Spain,109.69.8.51, Fourth Estate,USA,45.77.165.194, Запуск скопируйте код bot.py создайте файл dns_servers.csv и вставьте адреса выше pip install dnspython python bot.py он сам просканит адреса и скинет лучший ввиде таблицы, так же с вашим сравнит некоторые у вас упадут (они не отображаются, но можно раскомментировать строчки внизу и будет видно какие упали) ПРИМЕР мейлру днс