Загрузка...

Скрипт DNS Checker — Поиск лучшего DNS

Тема в разделе Python создана пользователем aerine 10 июн 2025 в 16:23. 145 просмотров

  1. aerine
    aerine Автор темы 10 июн 2025 в 16:23 13 14 мар 2020
    Не нашел такого скрипта и решил сам закинуть. Может будет полезно кому, затестите поставите. Сделал потому, что у меня чет ****аться началось
    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()
    Код
    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

    он сам просканит адреса и скинет лучший ввиде таблицы, так же с вашим сравнит
    некоторые у вас упадут (они не отображаются, но можно раскомментировать строчки внизу и будет видно какие упали)
    [IMG]
    мейлру днс :2011_nice:
     
  2. Cartier
    Cartier 10 июн 2025 в 16:25 im umer :cryingcat: 8932 1 сен 2020
    dnsjumper - просто существует
     
  3. TOPCHEK
Загрузка...
Top