MintFlow
MintFlow 菜单

使用 MintFlow Route via VPN 从 iOS 访问 Tailscale 网络

使用 MintFlow 免费 WireGuard 与 Route via VPN 功能,通过 SOCKS5 代理访问 Tailscale tailnet,并提供 Linux 网关 iptables SNAT 方案。

MintFlow 可以把选中的流量经过 HTTP 或 SOCKS 代理转发,而该代理本身可通过 WireGuard 对端访问。这样在 iOS 上即可在不安装独立 Tailscale 客户端的前提下访问 Tailscale 网络。

这个方案依赖的只是 MintFlow 的免费网络能力:

  • MintFlow 内的 WireGuard 接口和对端配置
  • 一个可达的 SOCKS5 代理(通过 WireGuard 链路)
  • 该代理上开启 Route via VPN
  • 一条指向该代理、范围为 100.64.0.0/10 的 Tailscale CGNAT 路由

拓扑

网关服务器同时加入两张网络:

  • MintFlow 与服务器间的 WireGuard 网络,例如 10.7.0.0/24
  • Tailscale 网络,节点通常使用 100.64.0.0/10 地址段

MintFlow 会把 100.64.0.0/10 的流量发往服务器 WireGuard 地址上的 SOCKS5 代理,代理再将流量转入 tailnet。

示例:

iPhone / MintFlow
  WireGuard IP: 10.7.0.2
        |
        | WireGuard
        v
Linux 网关
  WireGuard IP: 10.7.0.1
  tailscaled userspace SOCKS5: 10.7.0.1:1055
        |
        v
Tailscale tailnet
  Routes: 100.64.0.0/10

方法一:tailscaled userspace SOCKS5

该方式是最简单的,因为网关无需在 Linux 内核层做报文转发。Tailscale 文档中 userspace networking 模式可在无普通 TUN 设备时提供 SOCKS5 服务,且该模式可很好地作为 MintFlow Route via VPN 的桥接方案。

在 Linux 网关上先启动 WireGuard。具体配置因服务器而异,但服务器侧通常类似:

[Interface]
Address = 10.7.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

[Peer]
PublicKey = IPHONE_PUBLIC_KEY
AllowedIPs = 10.7.0.2/32

然后用 userspace networking 模式启动 tailscaled,并把 SOCKS5 监听器绑定到 WireGuard 地址。

使用单独的 state 目录和 Unix 控制 socket,可避免与系统默认 Tailscale 守护进程冲突:

sudo mkdir -p /var/lib/tailscale-mintflow /run/tailscale-mintflow

sudo tailscaled \
  --tun=userspace-networking \
  --socks5-server=10.7.0.1:1055 \
  --state=/var/lib/tailscale-mintflow/tailscaled.state \
  --socket=/run/tailscale-mintflow/tailscaled.sock

在另一窗口里,把网关认证到你的 tailnet:

sudo tailscale --socket=/run/tailscale-mintflow/tailscaled.sock up

如果你更习惯 systemd,可将上述 tailscaled 参数放到现有 Tailscale daemon 的 override,或者单独启动一个网关专用服务。

在 MintFlow 中配置:

  1. 添加与网关连接的 WireGuard 接口
  2. 添加 WireGuard 对端和所需路由规则,确保可达网关的 WireGuard IP(如 10.7.0.1/32)
  3. 添加 SOCKS5 代理,服务器为 10.7.0.1,端口为 1055
  4. 在该 SOCKS5 代理上开启 Route via VPN
  5. 添加一条 100.64.0.0/10 路由并指向 SOCKS5 代理

完成后,从 iOS 到例如 100.x.y.z 的 Tailscale IP 的连接将经由 MintFlow -> WireGuard -> 网关 -> userspace Tailscale SOCKS5 -> tailnet。

方法二:常规 Tailscale 客户端 + Linux SNAT

你也可以在网关上运行常规 Tailscale 客户端,并让 Linux 在 WireGuard 与 tailscale0 之间转发数据包。此时 MintFlow 不再需要 SOCKS5 代理,它通过 WireGuard 发送 100.64.0.0/10,网关使用内核路由和 SNAT 处理。

先正常安装并认证 Tailscale:

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

开启 IPv4 转发:

echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-mintflow-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-mintflow-tailscale.conf

添加转发与伪装规则。将 wg0 替换为你实际的 WireGuard 接口名:

sudo iptables -A FORWARD -i wg0 -o tailscale0 -d 100.64.0.0/10 -j ACCEPT
sudo iptables -A FORWARD -i tailscale0 -o wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 10.7.0.0/24 -d 100.64.0.0/10 -o tailscale0 -j MASQUERADE

若你使用 nftables,可用:

sudo nft add table inet mintflow
sudo nft add chain inet mintflow forward '{ type filter hook forward priority 0; policy drop; }'
sudo nft add rule inet mintflow forward iifname "wg0" oifname "tailscale0" ip daddr 100.64.0.0/10 accept
sudo nft add rule inet mintflow forward iifname "tailscale0" oifname "wg0" ct state established,related accept

sudo nft add table ip mintflow_nat
sudo nft add chain ip mintflow_nat postrouting '{ type nat hook postrouting priority 100; policy accept; }'
sudo nft add rule ip mintflow_nat postrouting ip saddr 10.7.0.0/24 ip daddr 100.64.0.0/10 oifname "tailscale0" masquerade

在 MintFlow 中,把 WireGuard 对端及路由直接配置为通过 WireGuard 发往 100.64.0.0/10,不经过 SOCKS5。

选择哪种方案?

如果你想要更小型的网关,并且更希望将路由控制留在 MintFlow 的代理路由模型中,建议使用 userspace SOCKS5 方式。它也更适合只需基于 SOCKS5 做 TCP 风格应用访问的场景。

如果你希望网关做完整包转发,不想暴露 SOCKS5 服务,建议使用常规 Tailscale + SNAT 方式,更接近传统路由器部署,但需要 Linux 转发与防火墙/NAT 规则。

注意事项

  • 将 SOCKS5 监听器绑定到 WireGuard 地址,不要绑定到公网接口。
  • 防火墙应做限制,仅允许 WireGuard 对端访问 SOCKS5 端口。
  • 100.64.0.0/10 是 Tailscale IPv4 地址范围。如果你还需要访问已发布的子网路由,请在 MintFlow 中补充对应目的网段。
  • 如果你需要 MagicDNS 域名,请仔细配置 DNS。直接路由原始 Tailscale IP 通常比路由域名更简单。

参考: