如何模拟DNS 8.8.8.8 连接超时自动切换

如何模拟DNS 8.8.8.8 连接超时自动切换。
需求:当走公网DNS解析时,如果网络连接超时,自动寻求下一个DNS服务器。

那你换个ip,填1.1.1.1,找不到这个ip不就自动切换了

  • 这篇博客: DNS可设置的值的类别以及利弊中的 1、设置为8.8.8.8或者8.8.4.4 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 8.8.8.8为Google提供的主DNS
    8.8.4.4 为备DNS

    利:是由Google免费提供的开放的DNS,不会被ISP的DNS劫持。而且google还能提供了额外的服务,比如站点拦截等。(当然这是需要收费的)。
    弊:google的DNS是在国外的,设置为此DNS需要从国外的DNS一层一层往下解析直到你所需要的DNS服务器,造成访问速度较慢。

模拟DNS 8.8.8.8 连接超时自动切换的实现需要进行以下步骤:

1.配置本地DNS服务器列表:在本地计算机或路由器上配置多个DNS服务器地址,包括 8.8.8.8 和其他可用的DNS服务器地址。

2.使用程序实现:编写一个程序来实现DNS解析,程序可以按照预定义的顺序尝试每个DNS服务器,如果第一个DNS服务器(8.8.8.8)无法连接,则尝试下一个DNS服务器。当成功解析时,将结果返回给应用程序。

例如,使用 Python 编写一个 DNS 解析脚本:


import socket

# 定义 DNS 服务器列表,按优先级排序
dns_servers = ['8.8.8.8', '114.114.114.114']

# 定义域名
domain_name = 'example.com'

# 遍历 DNS 服务器列表进行解析
for dns_server in dns_servers:
    try:
        # 设置超时时间为 2 秒
        socket.setdefaulttimeout(2)
        # 使用 UDP 协议连接 DNS 服务器
        dns_resolver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        dns_resolver.connect((dns_server, 53))
        # 构造 DNS 查询报文
        dns_query = bytearray()
        dns_query += b'\x00\x01'  # 会话 ID
        dns_query += b'\x01\x00'  # 标识位
        dns_query += b'\x00\x01'  # 问题数
        dns_query += b'\x00\x00'  # 回答记录数
        dns_query += b'\x00\x00'  # 授权记录数
        dns_query += b'\x00\x00'  # 附加记录数
        for label in domain_name.split('.'):
            dns_query += bytes([len(label)])
            dns_query += label.encode('utf-8')
        dns_query += b'\x00'  # 结束符
        dns_query += b'\x00\x01'  # 查询类型
        dns_query += b'\x00\x01'  # 查询类别
        # 发送 DNS 查询报文并接收回复
        dns_resolver.send(dns_query)
        dns_response = dns_resolver.recv(1024)
        # 关闭 DNS 连接
        dns_resolver.close()
        # 解析回复报文并返回结果
        if dns_response[3] == 0x03:  # 查询失败
            continue
        else:
            ip_address = '.'.join(str(byte) for byte in dns_response[-4:])
            print('Resolved domain {} to IP address {} using DNS server {}'.format(domain_name, ip_address, dns_server))
            break
    except socket.timeout:
        # 超时异常,尝试下一个 DNS 服务器
        print('Connection to DNS server {} timed out'.format(dns_server))
        continue

此脚本首先定义了 DNS 服务器列表和要解析的域名,然后遍历 DNS 服务器列表,尝试连接每个 DNS 服务器并发送 DNS 查询报文。如果第一个 DNS 服务器无法连接,则尝试下一个 DNS 服务器,直到成功解析域名或遍历完