烧饼论坛 LZ.SB
登录

Surge Mac + Tailscale Exit Node:踩坑日记

812
  • zcp1997
    UID 395Lv.1 初来乍到

    注:本文由 claude sonnet 润色

    最近把家里的 Surge 改造成了一个远程网关:公司 Windows 和 自己 iPhone 出门在外,不用再装 Clash、sing-box 之类的代理软件,只装一个 Tailscale,全部流量绕回家里的 Mac ,走 Surge 分流。

    整体思路

    Windows / iPhone
          │  Tailscale 直连
          ▼
       Mac mini(Exit Node)
          │
          ▼
         Surge(增强模式)
          │
          ├── DIRECT
          ├── 分地区代理组
          └── 各类规则分流
    

    远程设备只负责跑 Tailscale,DNS、分流、代理节点全部交给 Mac 上的 Surge 处理。

    1. Mac 开启 Exit Node

    sudo tailscale set --advertise-exit-node
    

    去 Tailscale Admin Console 里找到这台 Mac,批准它作为 Exit Node。远程设备就可以把 Mac 设为 Exit Node 了。如果 Windows 还要访问公司内网(192.168.x.x),记得顺手开启 "Allow local network access"。

    2. Surge 侧不用动,远程设备关掉系统代理

    Mac 上 Surge 照常开着「系统代理」和「增强模式」就行。远程设备不需要配置 HTTP/SOCKS 代理——Windows 反而要把系统代理关掉,因为流量已经由 Tailscale Exit Node 接管了。

    3. 最大的坑:Fake-IP 打不通

    配置完 Exit Node 后会遇到一个诡异现象:ping 能通、Telegram 能用,Chrome 却打不开网页。

    原因是 Surge 增强模式用的是 Fake-IP(198.18.0.0/15 网段),Windows 查 DNS 时拿到的是类似 198.19.6.148 这样的假地址,但这个网段没有路由指回 Surge,自然连不上。

    直接关掉 Tailscale DNS(tailscale set --accept-dns=false)能让网页恢复,但代价是 Surge 只能看到远程设备的真实目标 IP,DOMAIN / DOMAIN-SET 规则全部失效——比如测速会直接落到 FINAL,而不是命中 speedtest 规则组。

    正确的做法不是关 Fake-IP,而是把这个网段的路由打通。

    4. 把 Fake-IP 网段发布给 Tailscale

    在 Mac 上:

    sudo tailscale set --advertise-routes=198.18.0.0/15
    

    同样去 Admin Console 批准这条路由,然后 Windows 端:

    tailscale set --accept-routes=true
    tailscale set --accept-dns=true
    ipconfig /flushdns
    

    验证时,Resolve-DnsName google.com 拿到的还是 198.19.x.x 这类 Fake-IP,但用 Find-NetRoute 查一下应该能看到这个地址已经走 Tailscale 网卡路由;再用 Test-NetConnection 测端口,能连通就说明链路打通了。

    这一步是整套方案里最关键的一环:只开 Exit Node 而不发布这条路由,Fake-IP 永远回不来。打通之后完整链路是:

    Windows DNS 请求 → Mac Surge DNS
          → 返回 198.18/15 Fake-IP
          → 走 Tailscale Subnet Route 回到 Mac
          → Surge 内部还原成真实域名
          → 按 DOMAIN / RULE-SET 正常分流
    

    5. 避免 Surge 把 Tailscale 自己的流量也代理进去

    在 Surge 配置里加一条:

    [General]
    tun-excluded-routes = 100.64.0.0/10
    

    100.64.0.0/10 是 Tailscale 自己用的地址段,排除掉能避免绕圈子。如果发现 Tailscale 显示 Direct 但延迟异常,也可以临时把远程设备的公网 IP 加进排除列表——不过公网 IP 会变,这条更适合临时排障,不建议长期写死。

    6. 确认走的是直连还是 DERP 中继

    tailscale status
    

    看到 direct 180.x.x.x:21000 就是 P2P 直连;看到 relay "sfo" 就是走的 DERP 中继。也可以用 tailscale ping 看返回是 via 180.x.x.x:21000 还是 via DERP(...)。实测 Windows 到 Mac 能稳定跑到几毫秒,iPhone 也能通过 IPv6 直连;家里公网 IP 重新拨号也不用管,Tailscale 会自动重新打洞。

    7. 顺便把 Surge MTProto 也扔进 Tailnet

    Surge Mac 自带 MTProto Server,正好可以用 Tailscale Serve 只暴露给自己的设备,不落地公网、不进家庭 LAN。

    Surge 配置监听本地回环:

    [MTProto]
    interface = 127.0.0.1
    port = 5753
    secret = ************************
    ipv6 = false
    

    然后:

    tailscale serve --bg --tcp=5753 tcp://127.0.0.1:5753
    

    tailscale serve status 能看到 tcp://100.x.x.x:5753 -> tcp://127.0.0.1:5753。手机 Telegram 里把 Server 填成 Mac 的 Tailscale IP、端口 5753、加上 secret 就能用。不用了随时 tailscale serve --tcp=5753 off 关掉。

    总结

    核心其实就两条命令:

    sudo tailscale set --advertise-exit-node
    sudo tailscale set --advertise-routes=198.18.0.0/15
    

    在 Admin Console 里把 Exit Node 和 198.18.0.0/15 都批准掉,Fake-IP 链路打通,Surge 才算真正变成一台能远程用的网关——不然大概率会卡在 "能 ping 通但打不开网页" 这个坑上。

  • 收藏 1支持反对打赏

2 条回复

  • 龟头
    UID 6592Lv.6 经常露面
    亮了 1#1

    看标题就知道你今晚又在局域网里绕十八弯了,流量和头发都还好吗?

  • 李明
    UID 6857Lv.4 渐入佳境
    亮了 1#2

    这篇把网络套娃讲明白了,Fake-IP 回不来时,最先迷路的通常是人的耐心😂

发表回复