一个让我告别「改 DNS 靠手打」的桌面小工具
上网这么多年,总有些操作你明明做过无数次,但每次做的时候还是觉得「这都 2026 年了,怎么还要手动搞?」
对我来说,改 DNS 就是其中之一。
切个 114 要打开网络设置,找到适配器属性,找到 IPv4,把数字一个一个敲进去——万一哪天想换 Cloudflare 或者 Google DNS,还得再来一遍。更别提测速选最快的了,那可真是看缘分。
所以我就想,能不能做一个桌面小工具,把这些操作攒到一个界面里,点一下就行?
于是就捣鼓出了 DNS Chooser。
它长什么样
应用打开后分三个区域:
- DNS 测速 → 点一下,内置 12 个常用 DNS 挨个测延迟,按快慢排好,最快的那个标个「最快」。
- DNS 设置 → 6 组预设一键选,或者手动敲 IP,应用就行。想恢复 DHCP 也一个按钮。
- 工具 → 清理 DNS 缓存、用指定 DNS 查域名解析,两个常用的诊断功能。
顶部条实时显示当前在用的 DNS 和权限状态,一目了然。
我比较喜欢的几个点
1. 测速是「真 ping」,不是 ICMP
很多测速工具用的是系统 ping 命令(ICMP),但 DNS 实际跑的是 UDP 53 端口,ICMP 快不代表 UDP 也快。
这个工具的做法是 Rust 后端直接发一个真实的 DNS 查询包到 53 端口,等回复,算延迟——更贴近实际体验。
async fn ping_dns(ip: &str, timeout_ms: u64) -> Result<f64, String> {
let addr = format!("{}:53", ip);
let socket = UdpSocket::bind("0.0.0.0:0").await?;
socket.send_to(&build_dns_query(), &addr).await?;
let result = timeout(Duration::from_millis(timeout_ms), socket.recv_from(&mut buf)).await;
// ...
}
代码量不大,但效果实在。
2. 权限处理是个「小坑」
改 DNS 和清缓存都需要管理员权限,这是绕不开的。
Windows 上我试过几种方案,最终还是回到了最稳的做法:检测到非管理员 → 界面提示 → 用户自己右键重新以管理员运行。同时也留了个 PowerShell 提权的路子给需要自动化的人。
macOS 那边则是靠 osascript 弹系统对话框来提权。
这个问题的本质是:桌面应用想改系统设置,就得跨过那道安全门槛。没有完美的方案,只有适合场景的取舍。
3. Tauri 2 比 Electron 轻太多了
之前也用 Electron 写过小工具,打包出来动辄一两百 MB。同样的功能换 Tauri 2,安装包不到 10MB,内存占用也低得多。
前端还是熟悉的 React + TypeScript,后端用 Rust 写系统命令的胶水层,再加上 tokio 做异步——写起来很顺手。
技术栈一览
| 层 | 技术 |
|---|---|
| 桌面框架 | Tauri 2 |
| 前端 | React 18 + TypeScript + Vite 5 |
| 后端 | Rust(tokio 异步) |
| DNS 测速 | 原生 UDP Socket 直连 53 端口 |
| 系统命令 | netsh(Win)/ networksetup(macOS) |
| 样式 | 纯 CSS(CSS 变量主题系统,跟随系统深色/浅色) |
| 通知 | react-hot-toast |
一些不那么技术的小收获
写这个工具的过程中,最让我感慨的反而不是技术本身,而是:
那些我们觉得「就该这么麻烦」的事情,很多时候只是没人做那个「不麻烦的版本」。
改 DNS 本身不复杂,但每次打开五层菜单去改,加起来的时间成本远大于写一个工具的时间。类似的「微小但高频」的痛点,每个人身边应该都有一堆。
如果你也有类似的感受,不妨也试试写个小工具解决自己的痛点——选 Tauri 这样的框架,门槛真的不高。
使用 & 获取
项目已经开源在 GitHub:
🔗 github.com/z1HwanG/DNS-Chooser
目前支持 Windows 和 macOS(Linux 没测,理论上可以但需要适配)。
# 自己构建也很简单
git clone https://github.com/z1HwanG/DNS-Chooser.git
cd DNS-Chooser
npm install
npm run tauri:build
如果你也有类似的"手动改 DNS 党"的经历,或者有什么其他小痛点的想法,欢迎聊聊 😄