分类
标签
Bash C/C++ CI/CD CMU Cookie CS231n CS50 CSS CTF Diffie-Hellman Emmet Floyd算法 FPGA GitHub Actions Github Pages golang GOT表 Hexo HTML HTTP Java JavaScript Jupyter LeetCode Linux logrus MIT Missing Semester NumPy OpenSSL PLT表 Python RSA Session Shell sing-box socket SQL SQLite SQL注入 SVD SymPy TCP/IP Verilog Web开发 writeup XPath ZJU校巴 主定理 代理 信息安全 内存 前端 动态规划 动态链接 博客 压缩 参考 后端 命令行 国际交流 图像处理 图解 堆 堆排序 复杂度分析 密码学 开发 归并排序 微积分 心得 快速排序 抽象代数 搜索 操作系统 数字电路 数字逻辑 数学 数据库 数据结构 数论 文件系统 时间戳 有限状态自动机 机器学习 正则表达式 汇编 游戏开发 爬虫 物理 环境配置 科学计算 竞赛 笔记 算法 线性代数 编程语言 编译 网络 网络安全 背包DP 计算机基础 计算机视觉 计算机网络 课程 课程推荐 谱定理 踩坑 逆向 逆向工程 逻辑电路 非对称加密 题解 高斯消元法 魔塔
555 字
3 分钟
修复Windows的智能多宿主解析造成sing-box TUN模式出现DNS泄露
问题
最近使用sing-box的TUN模式进行网络代理的时候遇到了一个坑。具体表现为,当设置"strict_route": false
时,WSL网络正常,宿主机浏览器访问google.com却返回*.facebook.com的证书,经查发现这是经典的DNS污染。然而我设置的分流策略中google.com是走远程DNS的,理论上不应该出现这个问题:
"dns": {
"servers": [
{
"tag": "dns-direct",
"address": "dhcp://auto",
"detour": "out-direct"
},
{
"tag": "dns-proxy",
"address": "tls://8.8.8.8",
"detour": "out-proxy"
}
],
"rules": [
{
"outbound": "any",
"server": "dns-direct"
},
{
"rule_set": "geosite-geolocation-cn",
"server": "dns-direct"
}
],
"final": "dns-proxy",
}
尝试
尝试改变多个配置选项均未能解决问题。但是当我设置strict_route": true
时,宿主机的网络恢复正常,然而WSL下多个工具网络连接缓慢或失败。查阅sing-box官网,发现strict_route
为true
时,可以解决由Windows默认的DNS策略带来的DNS泄露问题,但是这种模式下部分应用程序无法正常工作。
这样就合理了,关闭严格路由时WSL工作正常,但是宿主机出现DNS污染,开启时WSL不正常,但是宿主机DNS正常。
解决
但是我想让宿主机和WSL都能访问网络,这两种方案明显都不适合我。于是我在https://www.dnsleaktest.com上找到了一个解决方案,只需要新建sing-box.bat
,然后输入以下代码,每次运行sing-box.exe
时,从sing-box.bat
启动即可:
:: 在管理员权限下执行,"WLAN"换成你本地的网络适配器名称(不是sing-box的适配器名称)
ipconfig /flushdns
netsh interface IPv4 set dnsserver "WLAN" static 0.0.0.0 both
sing-box run
netsh interface IPv4 set dnsserver "WLAN" dhcp
ipconfig /flushdns
原理
Windows采用了一种叫“多宿主解析”的机制来加速DNS请求,尽管设置了全局由sing-box的虚拟网卡接管,但是发起DNS请求的时候,Windows还是会对所有配置的DNS服务器进行查询,哪一个先返回就采用哪一个。于是便会出现有时被DNS污染的情况。解决方法也很简单,在启动sing-box之前,先禁用本地网络适配器的DNS(配置为0.0.0.0),关闭sing-box后再恢复成DHCP即可。
修复Windows的智能多宿主解析造成sing-box TUN模式出现DNS泄露
https://cyrus28214.github.io/posts/fix-dns-leak/