Skip to content

[Feature] add Tailscale outbound (tsnet-based) #2783

Description

@cyenxchen

Verification Steps

Description

希望为 mihomo 增加 type: tailscale 出站:内嵌 tsnet,让 mihomo 直接作为一个 Tailscale 节点接入 tailnet,把流量发到 tailnet 内的机器、或经由 exit-node 出网,无需在宿主机上单独跑 tailscaled,并保留 MagicDNS / split-DNS 解析能力。社区已有需求(见 #2168#2520)。

对应 PR:#2784(约 2500 行 diff,含 tailscale.com 及其传递依赖),支持的配置项:auth-key / hostname / control-url(可对接 headscale)/ ephemeral / accept-routes / exit-node / 自定义 tsnet state 目录。同时附带为配合 tsnet 内部解析所做的收敛:net.DefaultResolver 投毒后保留受控逃生通道 + 进程级 guard、以及 SOCKS/Shadowsocks/Mieru/sing 入站 UDP 回包的域名回写(避免回包退化成 fake-IP)。

proxies:
  - name: ts-node
    type: tailscale
    auth-key: tskey-auth-xxxxxxxxxxxx
    hostname: mihomo-node
    # control-url: https://headscale.example.com   # 自建 headscale
    # ephemeral: true
    # accept-routes: true
    # exit-node: 100.x.y.z          # 或 exit-node 的 hostname
    # state-dir: /var/lib/mihomo/tailscale

关于 Go 版本(需要维护者拍板)

tailscale.com(实现里 pin 的是 v1.96.5)的 go.mod 第一行就是 go 1.26.1,依赖方下界继承——一旦 require 它,mihomo 的 go 指令就必须 >= 1.26.1,连带 test.yml 的 1.20–1.25 测试矩阵、build.ymlamd64-v{1,2,3}-go120 这些产物都会受影响。可选方案:

  1. 直接把 go.mod 抬到 1.26,并相应精简旧 Go 版本的测试矩阵 / go120 产物(最简单);
  2. 把 tailscale 出站拆成独立的 Go module(主模块 go 指令不变,工程量较大);
  3. pin 更老的 tailscale.com release(功能/修复受限,且不保证与现有依赖兼容)。

注:单纯加 build tag 并不能避免 go 指令被顶高——只要任何 .goimport "tailscale.com/tsnet"go mod tidy 仍会把该依赖留在 go.mod

想先听一下维护者对「是否愿意接收这个出站」以及「Go 版本走哪个方案」的意见,再决定 PR 怎么收尾。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions