Clash TUN 模式与 Astro 开发服务器兼容问题


问题

Clash 同时开启 TUN 模式的严格路由(strict-route)和自动设置路由规则(auto-route)后,Astro 的开发服务器无法访问,而 Hexo、Hugo 等的开发服务器正常解析。类似的问题也存在于 Vite 等的开发服务器中。

image.png|300

原因

这主要是由于 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-routeauto-route 同时启用时,会出现典型的路由回环问题:

  1. TUN 接管所有流量auto-route 将默认路由指向 TUN

  2. 严格路由限制strict-route 强制所有连接通过 TUN,包括本地连接

  3. 回环死循环:应用程序向 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 的自动路由修改,不会改变现有的路由表结构

  • 本地服务访问不会受到严重影响