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 介面與對端設定
  • 可透過該 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。

範例:

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 對端與路由直接指向 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 通常比路由域名更簡單。

參考資料: