DNS选择疑惑

自从L站被阻断,就开始折腾、学习dns相关的内容。依稀记得5年前说到dns,默认都用114.114.114.114, 后来又用223.5.5.5, 中途也用过一些优选dns的工具作用于Windows系统,比如腾讯、360、百度等,但没深入去研究。
这次为了配置sing-box的dns,以及DoH,特地又去测了下dns,发现还是百度、腾讯的最快,结果如下:


在我所用到的网络环境下,都是这两个最快,好奇,为什么明明很快,为什么没人用呢?

欢迎大家测试,并讨论。以下是我的测试脚本:

#!/bin/bash

# 检查是否安装了 bind (提供 dig 命令)
if ! command -v dig &> /dev/null; then
    echo -e "\033[1;31m错误: 未找到 'dig' 命令,需要安装 bind-tools 或 dnsutils\033[0m"
    echo ""
    echo "请根据你的系统安装:"
    echo "  Arch/Manjaro:      sudo pacman -S bind"
    echo "  Debian/Ubuntu:     sudo apt install dnsutils"
    echo "  Fedora/RHEL/Rocky: sudo dnf install bind-utils"
    echo "  openSUSE:          sudo zypper install bind-utils"
    echo "  Alpine:            sudo apk add bind-tools"
    echo "  macOS (Homebrew):  brew install bind"
    exit 1
fi

# 检查是否安装了 bc (用于浮点计算)
if ! command -v bc &> /dev/null; then
    echo -e "\033[1;31m错误: 未找到 'bc' 命令,需要安装 bc\033[0m"
    echo ""
    echo "请根据你的系统安装:"
    echo "  Arch/Manjaro:      sudo pacman -S bc"
    echo "  Debian/Ubuntu:     sudo apt install bc"
    echo "  Fedora/RHEL/Rocky: sudo dnf install bc"
    echo "  openSUSE:          sudo zypper install bc"
    echo "  Alpine:            sudo apk add bc"
    echo "  macOS (Homebrew):  brew install bc"
    exit 1
fi

# 定义待测试的国内 DNS 列表
# 格式: "IP|名称"
DNS_LIST=(
    "223.5.5.5|阿里 AliDNS"
    "223.6.6.6|阿里 AliDNS (备)"
    "119.29.29.29|腾讯 DNSPod"
    "180.76.76.76|百度 BaiduDNS"
    "114.114.114.114|114DNS"
    "114.114.115.115|114DNS (备)"
    "1.2.4.8|CNNIC SDNS"
    "101.226.4.6|360 DNS"
    "180.184.1.1|字节跳动 DNS"
)

# 定义用于测试解析速度的域名 (国内高频域名)
DOMAINS=("www.taobao.com" "www.bilibili.com" "www.baidu.com" "www.qq.com")

echo -e "\033[1;36m正在测试国内 DNS 优选,请稍候...\033[0m"
echo "----------------------------------------------------------------"
printf "%-20s %-18s %-12s %-12s %-10s\n" "DNS 名称" "IP 地址" "Ping延迟" "解析耗时" "综合得分"
echo "----------------------------------------------------------------"

results=()

for entry in "${DNS_LIST[@]}"; do
    ip="${entry%%|*}"
    name="${entry##*|}"
    
    # 1. 测试 Ping 延迟 (取 4 次平均值)
    ping_res=$(ping -c 4 -W 1 "$ip" 2>/dev/null | tail -1 | awk -F '/' '{print $5}')
    
    if [ -z "$ping_res" ]; then
        ping_avg=999
    else
        ping_avg=$ping_res
    fi

    # 2. 测试 DNS 解析耗时
    total_query_time=0
    success_count=0
    
    for dom in "${DOMAINS[@]}"; do
        # 使用 dig 发送请求,提取 "Query time"
        # +tries=1 +time=2 设置超时,防止卡住
        q_time=$(dig @"$ip" "$dom" +tries=1 +time=2 2>/dev/null | grep "Query time:" | awk '{print $4}')
        
        if [ -n "$q_time" ] && [ "$q_time" -gt 0 ] 2>/dev/null; then
            total_query_time=$((total_query_time + q_time))
            success_count=$((success_count + 1))
        else
            # 惩罚超时
            total_query_time=$((total_query_time + 500)) 
        fi
    done

    if [ "$success_count" -gt 0 ]; then
        query_avg=$(echo "scale=2; $total_query_time / ${#DOMAINS[@]}" | bc)
    else
        query_avg=999
    fi

    # 3. 计算综合得分 (解析耗时权重更高,Ping 仅作参考)
    # 简单的算法: 综合 = Ping * 0.4 + 解析 * 0.6
    score=$(echo "scale=2; $ping_avg * 0.4 + $query_avg * 0.6" | bc)

    # 格式化输出行并存入数组以便排序
    output_line=$(printf "%-20s %-18s %-10s %-10s %-10s" "$name" "$ip" "${ping_avg}ms" "${query_avg}ms" "$score")
    results+=("$score|$output_line")
done

# 排序并输出 (按得分升序)
IFS=$'\n' sorted_results=($(sort -n <<<"${results[*]}"))
unset IFS

for item in "${sorted_results[@]}"; do
    echo "${item#*|}"
done

echo "----------------------------------------------------------------"
echo -e "\033[1;32m推荐使用排名第一的 DNS IP 替换 sing-box config 中的 local server。\033[0m"
echo ""
echo -e "\033[1;33m提示: 如果使用 DoH,常见配置:\033[0m"
echo "  阿里:   https://223.5.5.5/dns-query"
echo "  腾讯:   https://doh.pub/dns-query"

脚本依赖dig和bc,没有的根据提示手动安装下。

3 个赞

国内的DNS都大差不差的,1-20ms的差异完全感受不到体验差异。而且腾讯的用的也不少啊,百度可能受限于口碑用的没准会少一点。

我一般都用腾讯,dns 速度还挺重要的,之前 L站 被阻断以后换了始皇的 dns,但是晚上刷视频加载速度就变得很慢,后面还是换回腾讯了

2 个赞

dns 搞来搞去真的很没有必要,

  1. 影响因素太多
  2. 花大量的精力收益不大
1 个赞

可以搞个L站独占浏览器,单独设置始皇的DNS:

再快也没运营商的快呀,所以折腾它们干啥