├── README.md └── dns.sh /README.md: -------------------------------------------------------------------------------- 1 | # 🚀 Linux DNS Optimizer 2 | 3 | [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) 4 | [![Bash](https://img.shields.io/badge/language-Bash-green.svg)]() 5 | 6 | 一个简单、高效的 Linux 服务器 DNS 测速与配置工具。 7 | 专为 **非中国大陆地区** (如 HK, JP, SG, TW, KR, US) 的 VPS 设计,自动测试全球主流高速 DNS 的延迟,并一键替换系统配置。 8 | 9 | ## ✨ 功能特点 10 | 11 | - **⚡ 智能测速**: 自动测试全球主流 DNS 节点延迟,支持 IPv4 和 IPv6。 12 | - **🌏 亚太优化**: 剔除中国大陆 DNS 防止污染,新增 **台湾 (HiNet/Quad101)** 与 **韩国 (KT)** 本地高速节点。 13 | - **🛡️ 广告拦截**: 内置 **AdGuard DNS**,支持一键配置去广告与防跟踪。 14 | - **🔒 配置锁定**: 支持 `chattr +i` 锁定配置文件,防止重启后 DNS 被云厂商 DHCP 强制覆盖。 15 | - **🐧 广泛兼容**: 支持 Debian, Ubuntu, CentOS, AlmaLinux 等主流发行版 (自动适配 `systemd-resolved`)。 16 | - **💾 安全备份**: 修改前自动备份原配置文件,安全无忧。 17 | 18 | ## 📥 快速使用 (Quick Start) 19 | 20 | 推荐使用一键脚本(自动下载并运行): 21 | 22 | ```bash 23 | bash <(curl -sL https://raw.githubusercontent.com/EmersonLopez2005/Linux-DNS-Optimizer/main/dns.sh) 24 | ``` 25 | 或者手动下载运行: 26 | ``` 27 | wget https://raw.githubusercontent.com/EmersonLopez2005/Linux-DNS-Optimizer/main/dns.sh 28 | chmod +x dns.sh 29 | sudo ./dns.sh 30 | ``` 31 | ## 📋 收录的 DNS 列表 (DNS List) 32 | 33 | 本工具精选了 20+ 个全球顶级 DNS 服务商,涵盖 **IPv4 & IPv6**,满足安全、隐私、速度及区域优化的所有需求。 34 | 35 | | 🎯 分类 | 🏢 提供商 | 📝 特点说明 | 36 | | :--- | :--- | :--- | 37 | | **🛡️ 安全 & 去广告** | **AdGuard** | **首选推荐**。拦截广告、跟踪器,保护隐私 | 38 | | | **CleanBrowsing** | 专注于拦截恶意软件和钓鱼网站 | 39 | | **🕵️ 极致隐私** | **Mullvad** | 瑞典极客出品,**零日志 (No-Logging)**,匿名性极强 | 40 | | | **DNS.WATCH** | 德国老牌隐私 DNS,适合欧洲 (EU) VPS | 41 | | **⚡ 全球高速** | **Cloudflare** | (1.1.1.1) 全球 Anycast,延迟极低 | 42 | | | **Google** | (8.8.8.8) 全球最流行,稳定可靠 | 43 | | | **Control D** | 新晋速度之王,全球节点覆盖极广 | 44 | | **🏢 企业级/骨干网** | **Level3** | 美国骨干网运营商,**北美 (US) VPS 首选** | 45 | | | **Neustar** | 世界 500 强企业专用,极其稳定 | 46 | | | **OpenDNS** | Cisco 旗下,线路质量极高 | 47 | | **🌏 区域优化** | **HKBN** | **香港** 宽频极速 DNS,HK VPS 推荐 | 48 | | | **HiNet / Quad101** | **台湾** 本地优化,TW VPS 推荐 | 49 | | | **KT DNS** | **韩国** 电信霸主,KR VPS 推荐 | 50 | | | **Yandex** | **俄罗斯** 搜索引擎巨头,RU/CIS 地区推荐 | 51 | 52 | > **🚀 特性更新**: v2.0 版本现已**全面支持 IPv6**,上述所有主流厂商的 IPv6 节点均已收录 (包含主/备节点)。 53 | 54 | ⚠️ 免责声明 55 | 本工具仅修改 /etc/resolv.conf 和 /etc/systemd/resolved.conf。虽然脚本包含备份功能,但在生产环境操作前,建议您知晓 DNS 修改可能带来的网络影响。 56 | 57 | 58 | 📄 License 59 | MIT License 60 | 61 |

62 | 63 | Stars 64 | 65 | 66 | Forks 67 | 68 |

69 | 70 |

71 | Views 72 |

73 | -------------------------------------------------------------------------------- /dns.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # ==================================================== 3 | # Project: Linux DNS Optimizer 4 | # Description: Smart script to benchmark & switch to the fastest DNS 5 | # Source: https://github.com/EmersonLopez2005/Linux-DNS-Optimizer 6 | # License: MIT 7 | # ==================================================== 8 | 9 | # 颜色定义 10 | RED='\033[31m' 11 | GREEN='\033[32m' 12 | YELLOW='\033[33m' 13 | BLUE='\033[34m' 14 | CYAN='\033[36m' 15 | RESET='\033[0m' 16 | 17 | # 检查 Root 权限 18 | if [ "$(id -u)" != "0" ]; then 19 | echo -e "${RED}[!] 错误:此脚本必须以 root 权限运行。${RESET}" 20 | echo -e "请使用: sudo bash $0" 21 | exit 1 22 | fi 23 | 24 | # ==================================================== 25 | # DNS 列表配置 (格式: IP|说明) 26 | # ==================================================== 27 | DNS_LIST=( 28 | # ------------------------------------------------ 29 | # IPv4 - 安全/隐私/去广告 (Security & Privacy) 30 | # ------------------------------------------------ 31 | "94.140.14.14|AdGuard DNS (Default - AdBlock)" 32 | "94.140.15.15|AdGuard DNS (Family Protection)" 33 | "1.1.1.2|Cloudflare (Malware Blocking)" 34 | "9.9.9.9|Quad9 (Malware Blocking - Swiss)" 35 | "194.242.2.2|Mullvad DNS (No-Logging/Privacy)" 36 | "185.228.168.9|CleanBrowsing (Security Filter)" 37 | 38 | # ------------------------------------------------ 39 | # IPv4 - 全球高速/骨干网 (Global Speed & Backbone) 40 | # ------------------------------------------------ 41 | "1.1.1.1|Cloudflare (IPv4 - Primary)" 42 | "1.0.0.1|Cloudflare (IPv4 - Secondary)" 43 | "8.8.8.8|Google Public DNS (IPv4 - Primary)" 44 | "8.8.4.4|Google (IPv4 - Secondary)" 45 | "76.76.2.0|Control D (Unfiltered - High Speed)" 46 | "208.67.222.222|OpenDNS (Cisco)" 47 | "4.2.2.1|Level3 (CenturyLink - US Backbone)" 48 | "4.2.2.2|Level3 Secondary (US)" 49 | "156.154.70.1|Neustar UltraDNS (Enterprise)" 50 | 51 | # ------------------------------------------------ 52 | # IPv4 - 区域特色优化 (Regional Optimized) 53 | # ------------------------------------------------ 54 | "203.80.96.10|HKBN (Hong Kong Broadband)" 55 | "203.80.96.9|HKBN Secondary (Hong Kong)" 56 | "101.101.101.101|Quad101 (Taiwan - TWNIC)" 57 | "168.95.1.1|HiNet (Taiwan Telecom)" 58 | "168.126.63.1|KT DNS (South Korea Telecom)" 59 | "84.200.69.80|DNS.WATCH (Germany - Privacy)" 60 | "77.88.8.8|Yandex.DNS (Russia/CIS Optimized)" 61 | 62 | # ------------------------------------------------ 63 | # IPv6 - 完整支持列表 (IPv6 Full Support) 64 | # ------------------------------------------------ 65 | # --- Global Speed --- 66 | "2606:4700:4700::1111|Cloudflare (IPv6 - Primary)" 67 | "2606:4700:4700::1001|Cloudflare (IPv6 - Secondary)" 68 | "2001:4860:4860::8888|Google (IPv6 - Primary)" 69 | "2001:4860:4860::8844|Google (IPv6 - Secondary)" 70 | "2620:119:35::35|OpenDNS (IPv6)" 71 | "2606:1a40::2|Control D (IPv6 - Unfiltered)" 72 | 73 | # --- Security & Privacy --- 74 | "2a10:50c0::ad1:ff|AdGuard (IPv6 - AdBlock)" 75 | "2a10:50c0::ad2:ff|AdGuard (IPv6 - Family)" 76 | "2620:fe::fe|Quad9 (IPv6 - Security)" 77 | "2a07:a8c0::|Mullvad (IPv6 - Privacy)" 78 | "2a0d:2a00:1::2|CleanBrowsing (IPv6 - Security)" 79 | 80 | # --- Regional --- 81 | "2001:b000:168::1|HiNet (Taiwan IPv6)" 82 | "2001:1608:10:25::1c04:b12f|DNS.WATCH (Germany IPv6)" 83 | "2a02:6b8::feed:0ff|Yandex.DNS (Russia IPv6)" 84 | ) 85 | 86 | # ==================================================== 87 | # 核心功能函数 88 | # ==================================================== 89 | 90 | test_dns_speed() { 91 | clear 92 | echo -e "${BLUE}========================================${RESET}" 93 | echo -e "${BLUE} 🚀 Linux DNS Optimizer ${RESET}" 94 | echo -e "${BLUE} (测速 + 优选 + 自动配置 + AdGuard) ${RESET}" 95 | echo -e "${BLUE}========================================${RESET}" 96 | echo -e "${CYAN}>>> 正在测试 DNS 延迟 (Ping), 请稍候...${RESET}\n" 97 | 98 | declare -a results 99 | 100 | for item in "${DNS_LIST[@]}"; do 101 | IFS='|' read -r ip name <<< "$item" 102 | 103 | # 判断 IPv4 还是 IPv6 并检查连通性 104 | ping_cmd="ping" 105 | if [[ "$ip" == *":"* ]]; then 106 | ping_cmd="ping6" 107 | if ! command -v ping6 &>/dev/null && ! ping -6 -c 1 ::1 &>/dev/null; then continue; fi 108 | fi 109 | 110 | printf " %-42s (%-15s) ... " "${name}" "${ip}" 111 | 112 | # 测速逻辑:发包2次,超时1秒,取平均值 113 | latency=$(LC_ALL=C $ping_cmd -c 2 -W 1 "$ip" 2>/dev/null | grep 'avg' | awk -F'/' '{print $5}') 114 | 115 | if [ -n "$latency" ]; then 116 | echo -e "${GREEN}${latency} ms${RESET}" 117 | results+=("$latency|$ip|$name") 118 | else 119 | echo -e "${RED}超时${RESET}" 120 | results+=("9999|$ip|$name") 121 | fi 122 | done 123 | 124 | # 排序结果 125 | IFS=$'\n' sorted=($(printf "%s\n" "${results[@]}" | sort -n -t'|' -k1)) 126 | unset IFS 127 | 128 | echo -e "\n${CYAN}>>> 🏆 延迟最低 Top 10:${RESET}" 129 | echo -e "${YELLOW}------------------------------------------------------------${RESET}" 130 | 131 | top_ips=() 132 | count=0 133 | valid_options=() 134 | 135 | for item in "${sorted[@]}"; do 136 | IFS='|' read -r lat ip name <<< "$item" 137 | if [ "$lat" != "9999" ] && [ $count -lt 10 ]; then 138 | idx=$((count+1)) 139 | printf " ${GREEN}%-2d${RESET}. %-32s ${YELLOW}%-18s${RESET} -> ${CYAN}%s ms${RESET}\n" "$idx" "$name" "($ip)" "$lat" 140 | top_ips+=("$ip") 141 | valid_options[$idx]="$ip" 142 | count=$((count+1)) 143 | fi 144 | done 145 | echo -e "${YELLOW}------------------------------------------------------------${RESET}" 146 | 147 | if [ $count -eq 0 ]; then 148 | echo -e "${RED}错误:所有 DNS 均无法连接,请检查服务器网络。${RESET}" 149 | exit 1 150 | fi 151 | } 152 | 153 | apply_config() { 154 | echo -e "\n${BLUE}请选择要使用的 DNS:${RESET}" 155 | echo -e " [1-10] 输入序号选择 (支持多选,用空格分隔,如: 1 2)" 156 | echo -e " [c] 自定义输入 IP" 157 | echo -e " [0] 退出不保存" 158 | echo -ne "\n${YELLOW}请输入: ${RESET}" 159 | read -r choice 160 | 161 | selected_dns="" 162 | 163 | if [ "$choice" == "0" ]; then 164 | echo "已退出。" 165 | exit 0 166 | elif [ "$choice" == "c" ]; then 167 | read -p "请输入自定义 DNS IP (空格分隔): " custom_ips 168 | selected_dns="$custom_ips" 169 | else 170 | for c in $choice; do 171 | if [ -n "${valid_options[$c]}" ]; then 172 | selected_dns="$selected_dns ${valid_options[$c]}" 173 | fi 174 | done 175 | fi 176 | 177 | if [ -z "$selected_dns" ]; then 178 | echo -e "${RED}未选择有效的 DNS,操作已取消。${RESET}" 179 | exit 1 180 | fi 181 | 182 | # 去重 183 | selected_dns=$(echo "$selected_dns" | tr ' ' '\n' | awk '!a[$0]++' | tr '\n' ' ') 184 | 185 | echo -e "\n${CYAN}>>> 正在应用配置: $selected_dns ...${RESET}" 186 | 187 | # 1. 解锁 188 | if lsattr /etc/resolv.conf 2>/dev/null | grep -q "i"; then 189 | chattr -i /etc/resolv.conf 190 | fi 191 | 192 | # 2. 备份 193 | cp /etc/resolv.conf "/etc/resolv.conf.bak.$(date +%Y%m%d_%H%M%S)" 194 | echo -e "${GREEN}[√] 已备份原配置${RESET}" 195 | 196 | # 3. 写入 /etc/resolv.conf 197 | echo "# Generated by Linux-DNS-Optimizer" > /etc/resolv.conf 198 | for ip in $selected_dns; do 199 | echo "nameserver $ip" >> /etc/resolv.conf 200 | done 201 | 202 | # 4. 适配 systemd-resolved 203 | if systemctl is-active systemd-resolved &>/dev/null; then 204 | sed -i '/^DNS=/d' /etc/systemd/resolved.conf 205 | echo "DNS=$selected_dns" >> /etc/systemd/resolved.conf 206 | systemctl restart systemd-resolved 207 | echo -e "${GREEN}[√] systemd-resolved 配置已同步${RESET}" 208 | fi 209 | 210 | # 5. 锁定文件 211 | echo -e "\n${YELLOW}是否锁定配置文件?(防止重启后失效) [Y/n]${RESET}" 212 | read -r lock_choice 213 | if [[ "$lock_choice" =~ ^[Nn]$ ]]; then 214 | echo -e "${GREEN}[√] 配置完成 (未锁定)${RESET}" 215 | else 216 | chattr +i /etc/resolv.conf 217 | echo -e "${GREEN}[√] 配置完成 (文件已锁定 +i)${RESET}" 218 | fi 219 | } 220 | 221 | test_dns_speed 222 | apply_config 223 | --------------------------------------------------------------------------------