使用 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 中配置:
- 添加与网关连接的 WireGuard 接口
- 添加 WireGuard 对端和所需路由规则,确保可达网关的 WireGuard IP(如
10.7.0.1/32) - 添加 SOCKS5 代理,服务器为
10.7.0.1,端口为1055 - 在该 SOCKS5 代理上开启 Route via VPN
- 添加一条
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 通常比路由域名更简单。
参考: