├── README.md
└── dns.sh
/README.md:
--------------------------------------------------------------------------------
1 | # 🚀 Linux DNS Optimizer
2 |
3 | [](LICENSE)
4 | []()
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 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
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 |
--------------------------------------------------------------------------------