
Clash TUN 模式与 Astro 开发服务器兼容问题
问题
Clash 同时开启 TUN 模式的严格路由(strict-route)和自动设置路由规则(auto-route)后,Astro 的开发服务器无法访问,而 Hexo、Hugo 等的开发服务器正常解析。类似的问题也存在于 Vite 等的开发服务器中。
原因
这主要是由于 Astro 框架的默认网络监听配置与严格路由规则的冲突导致的。
Astro 与其他静态生成器存在关键差异:
Astro 开发服务器默认只监听 127.0.0.1
地址,默认使用 4321 端口
这在严格路由下会导致:“localhost 拒绝了我们的连接请求 (ERR_CONNECTION_REFUSED)”。
对比其他框架,Hexo 服务器默认运行在 0.0.0.0
127.0.0.1 绑定的限制:
-
应用程序只监听回环接口上的连接
-
仅接受来自本机内部的网络请求
0.0.0.0 绑定的开放性:
-
监听所有可用的网络接口
-
可以接受来自内网、外网等多个 IP 地址的访问
四种种解决方案
1. 命令行临时添加参数
npm run dev -- -- --host
,--host
参数强制服务器绑定到 0.0.0.0
注意这里的关键点是双破折号(--
)的使用。你不能直接使用 npm run dev --host
,因为这样会将 --host
参数传递给 npm。双破折号告诉 npm 将后面的参数传递给实际执行的脚本。至于为什么实际是三个破折号,特别是 PowerShell 环境下,参数传递机制更复杂。参考这个 issue 和这个 issue。
安全注意事项
使用--host
参数会将你的开发服务器暴露给网络中的其他设备,这在开发环境中很有用,但也需要注意安全性:
-
仅在受信任的网络环境中使用
-
不要在生产环境中使用此配置
-
开发完成后及时关闭网络暴露功能
2. 修改 package.json
中的启动命令
{
"scripts": {
"dev": "astro dev --host"
}
}
3. 修改 astro.config.mjs
的配置
export default defineConfig({
server: {
host: true, // 等同于 '0.0.0.0'
port: 4321
}
})
4. Clash GUI 端临时解决方法
严格路由(strict-route)和自动设置路由规则(auto-route)关闭任意一个即可,只要不同时开启。
路由回环问题
当 strict-route
和 auto-route
同时启用时,会出现典型的路由回环问题:
-
TUN 接管所有流量:
auto-route
将默认路由指向 TUN -
严格路由限制:
strict-route
强制所有连接通过 TUN,包括本地连接 -
回环死循环:应用程序向 127.0.0.1 发送的数据包被 TUN 接管,但 TUN 又试图将数据包发回给应用程序
单独开启时不会冲突的原因
仅开启 auto-route
当只开启auto-route: true
时:
-
系统会自动设置路由规则,但不会强制所有流量通过 TUN
-
允许特定的直接连接绕过 TUN 接口
-
本地回环地址仍然可以正常工作
仅开启 strict-route
当只开启strict-route: true
时:
-
会禁用 Windows 智能多宿主名称解析(LLMNR,Link-Local Multicast Name Resolution)
-
虽然会执行严格的路由规则,但没有
auto-route
的自动路由修改,不会改变现有的路由表结构 -
本地服务访问不会受到严重影响