配图:嘉峪关悬臂长城

之前写了 mihomo 透明代理的配置,这次来聊聊怎么把 Tailscale 和 mihomo 联动起来。
效果是:在外面用手机连 Tailscale,选择树莓派作为出口节点,所有流量经过 mihomo
代理后再出网。实测非常好用,在外面也能享受家里的代理规则!

一、树莓派上安装 Tailscale 并开启 IP 转发

首先安装 Tailscale:

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

然后开启 IP 转发,这一步很关键,不然其他设备无法通过树莓派出网:

echo ‘net.ipv4.ip_forward = 1’ | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo ‘net.ipv6.conf.all.forwarding = 1’ | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

确认一下 forwarding 已经开启:

sysctl net.ipv4.ip_forward

输出应该是 net.ipv4.ip_forward = 1,没问题就继续。

二、将树莓派配置为 Tailscale 出口节点

执行以下命令,让树莓派广播自己可以作为出口节点:

sudo tailscale up –advertise-exit-node

然后去 Tailscale 的管理后台(https://login.tailscale.com/admin/machines),
找到树莓派,点击菜单里的 “Use as exit node”,批准这个设置。

在手机上打开 Tailscale 客户端,Settings -> Exit Node,选择树莓派。
此时手机的所有流量就会走树莓派出网了!但还没有经过 mihomo,继续往下看。

三、流量走向分析

搞清楚流量路径很重要:

手机 -> Tailscale 隧道 -> 树莓派(tailscale0接口) -> 转发 -> eth0出网

我们的目标是在”转发”这一步把 TCP 流量劫持到 mihomo,让 mihomo 做分流和代理。
UDP 流量不做处理,直接转发出去。

四、iptables 规则配置(核心!)

这是最关键的部分,最终能用的配置:

创建 MIHOMO 链

sudo iptables -t nat -N MIHOMO

排除 Tailscale 设备间直连流量(非常重要!)

sudo iptables -t nat -A MIHOMO -d 100.64.0.0/10 -j RETURN

排除局域网地址

sudo iptables -t nat -A MIHOMO -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A MIHOMO -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A MIHOMO -d 192.168.0.0/16 -j RETURN

排除 mihomo 自身的流量(防止回环)

sudo iptables -t nat -A MIHOMO -m owner –uid-owner mihomo -j RETURN

TCP 流量重定向到 mihomo 的端口(假设是 7777)

sudo iptables -t nat -A MIHOMO -p tcp -j REDIRECT –to-ports 7777

把 Tailscale 子网的 PREROUTING 流量引入 mihomo链

sudo iptables -t nat -A PREROUTING -i tailscale0 -p tcp -j MIHOMO

这里有个重点中的重点!! -d 100.64.0.0/10 这条规则(我用 -d 100.64.0.0/10
配合 RETURN 实现了同样的效果)。100.64.0.0/10 是 Tailscale 的 CGNAT 地址段,
所有 Tailscale 设备之间的直连流量都在这个网段。如果不排除这个网段,设备之间的
直连通信也会被送到 mihomo,结果就是 Tailscale 的点对点连接断掉,甚至设备之间
互相 ping 都不通!这个坑我踩了很久,大家一定要注意!

五、为什么只处理 TCP,UDP 怎么办?

为什么不用 TProxy 同时处理 TCP 和 UDP?因为Tailscale 的内核路由和 TProxy 会打架!我实测发现,当用 TProxy 给包打上 fwmark 后,Tailscale 注册的 ts-forward 链会干扰内核的路由决策,导致被打
标记的包直接被丢弃。具体表现就是:TProxy 模式下 TCP 和 UDP 全部超时,完全不通。

所以最终方案是:

  • TCP:用 REDIRECT(NAT 模式)劫持到 mihomo,简单可靠
  • UDP:完全不劫持,直接转发

好消息是,UDP 不走代理影响其实不大。YouTube 等服务使用的 QUIC 协议虽然基于
UDP,但它们在 TCP 回退时也能正常工作。实际体验下来,YouTube 视频照样秒开,
速度也没什么明显差别。

六、mihomo 配置要点

mihomo 这边需要开启 redir-port:

config.yaml

redir-port: 7777
tcp-concurrent: true

确保 mihomo 监听了7777端口的 TCP 重定向流量就行。

七、测试验证

在手机上:

  1. 确认 Tailscale 已连接,并选择了树莓派作为 Exit Node
  2. 打开浏览器访问 https://ipinfo.io
  3. 如果显示的 IP 是你代理服务器的 IP,说明流量成功经过了 mihomo!
  4. 再访问 https://www.youtube.com 看看能不能正常播放视频

可以在树莓派上用以下命令实时观察流量:

sudo iptables -t nat -L MIHOMO -v -n

看到 pkts 计数在增长,就说明规则在正常工作了。

八、踩坑总结:一条核心原则

每个流量来源只用一种拦截方式!

具体来说:

  • 本地局域网设备的透明代理:用 TProxy(UDP+TCP 都能处理)
  • Tailscale 隧道过来的流量:只用 REDIRECT(只处理 TCP)

千万不要在同一个流量来源上同时使用 TProxy 和 REDIRECT,也不要去动 Tailscale
的 ts-forward 链。我试过各种组合,最终只有上面这套”TCP REDIRECT + UDP 直连”
的方案能稳定运行。

九、完整命令汇总

方便大家复制粘贴

开启转发

sudo sysctl -w net.ipv4.ip_forward=1

启动 Tailscale 出口节点

sudo tailscale up –advertise-exit-node

iptables 规则

sudo iptables -t nat -N MIHOMO
sudo iptables -t nat -A MIHOMO -d 100.64.0.0/10 -j RETURN
sudo iptables -t nat -A MIHOMO -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A MIHOMO -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A MIHOMO -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A MIHOMO -m owner –uid-owner mihomo -j RETURN
sudo iptables -t nat -A MIHOMO -p tcp -j REDIRECT –to-ports 7892
sudo iptables -t nat -A PREROUTING -i tailscale0 -p tcp -j MIHOMO

记得把这些规则写到启动脚本里,重启后自动生效。

参考资料:

  1. Tailscale 官方文档 – Exit Nodes: https://tailscale.com/kb/1103/exit-nodes
  2. Tailscale 官方文档 – Subnet Routes: https://tailscale.com/kb/1019/subnets
  3. mihomo 官方文档: https://wiki.metacubex.one/
  4. Linux iptables REDIRECT vs TProxy: https://www.kernel.org/doc/Documentation/networking/tproxy.txt
  5. Tailscale CGNAT 地址段说明: https://tailscale.com/kb/1015/100.x-addresses

发布于2026/10/07。

由 船长

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注