# 透過 MintFlow Route via VPN 從 iOS 存取 Tailscale 網路

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

使用 MintFlow 的免費 WireGuard 與 Route via VPN 功能，透過 SOCKS5 代理存取 Tailscale tailnet，並提供 Linux 網關 iptables SNAT 替代方案。







MintFlow 可將選定流量透過 HTTP 或 SOCKS 代理路由，而該代理本身可透過 WireGuard 對端到達。這使得 iOS 無需安裝獨立 Tailscale 客戶端即可存取 Tailscale 網路。

此架構只需要 MintFlow 的免費網路能力：

- MintFlow 內的 WireGuard 介面與對端設定
- 可透過該 WireGuard 連線到達的 SOCKS5 代理
- 該代理上開啟 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 對端與路由直接指向 `100.64.0.0/10` 經由 WireGuard，而非 SOCKS5 代理。

## 我該選哪一種方式？

如果你想要精簡的閘道，且希望路由控制留在 MintFlow 的 Proxy 路由模型中，建議使用 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 subnet router 文件](https://tailscale.com/docs/features/subnet-routers)


