透過 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 內設定:
- 新增連到閘道的 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 對端與路由直接指向 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 通常比路由域名更簡單。
參考資料: