自从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,没有的根据提示手动安装下。

