Загрузка...

Script DNS Checkker - Search for the best DNS

Thread in Python created by aerine Jun 10, 2025. 233 views

  1. aerine
    aerine Topic starter Jun 10, 2025 19 Mar 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()
    Code
    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:
     
    1. Локет
      aerine, requirements - dnspython
  2. Cartier
    Cartier Jun 10, 2025 Смысл жить если все равно умрешь
    dnsjumper - просто существует
     
    1. aerine Topic starter
Top
Loading...