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

Canonical: https://galaxnet.dev/zh-hans/mintflow/articles/tailscale-via-wireguard-route-via-vpn/
Language: zh-Hans

使用 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。

示例：

```text
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。具体配置因服务器而异，但服务器侧通常类似：

```ini
[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 守护进程冲突：

```sh
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：

```sh
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：

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

开启 IPv4 转发：

```sh
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 接口名：

```sh
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，可用：

```sh
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 通常比路由域名更简单。

参考：

- [Tailscale userspace networking 模式](https://tailscale.com/docs/concepts/userspace-networking)
- [Tailscale 子网路由文档](https://tailscale.com/docs/features/subnet-routers)


