不再需要 VPN:使用 Tailscale + Oracle Cloud 免費 VM 突破地區限制

11 min

遇到地區限制,大部分人第一反應都是開 VPN。我以前也是。

問題是,我不想整台電腦長期掛住 VPN 。如果每次用 ChatGPT 都要先想「我有沒有開 VPN?」,用完又要記得關——真的很煩。

我現在的做法是:Tailscale 永遠開著,但只把 OpenAI / ChatGPT 相關流量送去日本 Oracle Cloud VM 出口,其他流量照直連。

Tailscale split routing with Oracle Cloud
Tailscale split routing with Oracle Cloud

Exit node 太粗暴

Tailscale 有 exit node 功能,概念不複雜:指定 tailnet 裏某台裝置做出口,其他裝置把 Internet 流量全部送過去。用落就跟一般 VPN 差不多。

旅行、用公共 Wi-Fi、或者想一次過轉出口的時候,exit node 確實好用。

但我要的不是「全部流量都走日本」。我只想 OpenAI / ChatGPT 相關網站從日本 Oracle Cloud VM 出去,其他網站照正常網絡走。

我想要的是這種分流:

流量 路徑
一般網站 直接走本機網絡
HomeLab 服務 走 Tailscale tailnet
OpenAI / ChatGPT 相關 domain 走日本 Oracle Cloud VM

能做到這件事的,是 App Connector。

說穿了就是按 domain 分流

我把 Tailscale App Connector 理解成一個按 domain 分流的規則。

你不用改整台機器的 route,也不用手動填一堆 IP。只要在 Tailscale 裏講:「這幾個 domain 屬於同一個 app,幫我把它們交給指定的 Linux device 出口。」對 SaaS 服務特別好用——背後 IP 成日變,但 domain 相對穩定。

套到我的 HomeLab,流程是這樣:

  1. oracle-jp 是放在日本 Oracle Cloud 的 VM,我幫它掛咗 tag:jp-connector
  2. 在 Tailscale 建一個 OpenAI / ChatGPT 用的 app,把相關 domains 放進去
  3. 指定呢個 app 走 tag:jp-connector,即係由 oracle-jp 出口

結果就係:當我打開 OpenAI 相關服務,Tailscale 會認出呢個 domain 屬於嗰個 app,然後將流量送去 oracle-jp,再由佢嘅日本網絡出口連出去。

其他一般網站?照行原本網絡,完全唔受影響。唔使每次手動開 VPN,只有指定 app 先走指定出口。

創建 connector tag

Oracle Cloud 免費 VM 唔講開機流程,直接講 Tailscale 要點做。

第一步係去 Tailscale Admin Console 準備一個 connector tag。到:

Access controls -> Visual editor -> Tags

新增一個 tag,例如:

jp-connector

介面上通常唔使自己打 tag: prefix;最後 policy 入面會變成 tag:jp-connector。呢個 tag 嘅意思係:之後邊台 Linux device 掛上佢,邊台就可以做 App Connector 嘅出口。

Oracle Cloud VM 設定

VM 上面開啟 app connector功能:

sudo tailscale up --advertise-connector --advertise-tags=tag:jp-connector

裝完確認一下:

tailscale status
tailscale ip

然後開啟 IP forwarding,呢步唔可以做漏:

echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

Access controls

Auto approvers

到:

Access controls -> Visual editor -> Auto-approver -> Routes

加入兩條 route auto-approver:

Route Auto approved for
0.0.0.0/0 tag:jp-connector
::/0 tag:jp-connector
Tailscale Auto-approver 頁面:Routes 加入 0.0.0.0/0 同
Tailscale Auto-approver 頁面:Routes 加入 0.0.0.0/0 同

睇落好闊,但喺 App Connector 嘅語境入面,佢只係讓 connector tag 自動 approve 由 app domains discovery 出嚟嘅 routes。Tailscale 文件都提到 custom app routes 需要 autoApprovers

General access rules

到:

Access controls -> Visual editor -> General access rules -> Add rule

需要兩條 rule:

Source Destination Port and protocol
All users and devices tag:jp-connector tcp:53, udp:53, tcp:37155, udp:37155
All users and devices autogroup:internet All ports and protocols

第一條讓需要使用 App Connector 嘅裝置連到 tag:jp-connector。Tailscale 文件提到 DNS discovery 最少需要 tcp:53 / udp:53

Tailscale ACL 規則:允許裝置連到 jp connector 需要的 ports
Tailscale ACL 規則:允許裝置連到 jp connector 需要的 ports

第二條讓呢啲裝置可以透過 Tailscale 出 autogroup:internet。無咗呢條,前面 domain 同 connector 都設定好,流量仲係可能出唔去。

Tailscale ACL 規則:允許裝置透過 autogroup internet 出口
Tailscale ACL 規則:允許裝置透過 autogroup internet 出口

建 App Connector

前面 connector VM、auto approvers、access rules 都搞好,先至到建 app 呢一步。呢度先至真正決定「邊啲 domain 要走日本出口」。

  1. 去 Tailscale Admin Console 嘅 Apps / App Connectors
  2. 新增一個 app,例如 openai
  3. 指定 connector tag,例如 tag:jp-connector
  4. 填入 OpenAI / ChatGPT 相關 domains
  5. 確認需要用嘅 client 有接受 routes

建好之後,Apps 頁面應該會見到 app name、domains、connector 同 status。最值得留意三件事:OpenAI 相關 domains 集中喺同一個 app、connector 指向負責出口嘅機器、status 係 Active。

Tailscale App Connector 設定頁面
Tailscale App Connector 設定頁面

以下係我而家放喺呢個 App Connector 入面嘅 domain 清單:

chatgpt.com
*.chatgpt.com
openai.com
*.openai.com
auth.openai.com
*.auth.openai.com
auth0.openai.com
oaistatic.com
*.oaistatic.com
oaiusercontent.com
*.oaiusercontent.com
oaistatsig.com
*.oaistatsig.com
openaimerge.com
*.openaimerge.com
cdn.openaimerge.com
android.chat.openai.com
ios.chat.openai.com
desktop.chat.openai.com
chat.openai.com
ws.chatgpt.com
cdn.workos.com
forwarder.workos.com
setup.workos.com
intercom.io
*.intercom.io
intercomcdn.com
*.intercomcdn.com
ct.sendgrid.net
developers.openai.com

呢個清單會隨服務變動,唔建議將呢篇文當永遠正確嘅 domain list。比較好嘅做法係先參考 OpenAI 嘅 ChatGPT network recommendations

Client 要接受 routes

App Connector 需要 client 接受 Tailscale 推過嚟嘅 routes。

桌面 app 大部分可以喺 Tailscale 設定入面確認有無接受 routes。Linux client 就比較多時要手動開:

sudo tailscale set --accept-routes=true

如果你嘅 Linux client 要行 app connector,呢個一定要打開。

手機同 Mac 通常比較順,但如果發現某台裝置點都唔行 connector,逐樣檢查:

  • Tailscale 係咪連線中
  • 有無手動選咗 full exit node——呢個情境應該保持 exit node 做 None
  • 有無接受 routes
  • ACL / Grants 有無允許佢用 connector
  • domain 係咪真係喺 app connector 清單入面
  • DNS cache 係咪仲卡住舊解析

點樣確認 traffic 真係行緊 connector

先去 Apps 頁面確認 connector status 係 Active。不過呢個只表示 App Connector 正常連上,唔代表每個 domain 都已經行對路。

想再確認嘅話,可以喺 Oracle VM 上面睇 traffic:

sudo tcpdump -ni tailscale0 -vv '(port 443 or port 53)'

然後喺手機或者電腦開 chatgpt.com。如果設定正確,應該會見到相關 DNS / HTTPS traffic 經過呢台 VM。

再開一個無關網站,例如 example.com。呢類普通網站唔應該經過呢台 connector——如果見到佢都行過嚟,即係你可能仲用緊 full exit node,或者 route 設定比預期更闊。

同傳統 VPN 比,好喺邊

對我嚟講,最大嘅分別係心理負擔。

傳統 VPN 嘅使用循環通常係:

想用某個服務 -> 開 VPN -> 用完忘記關 -> 發現其他服務變慢或者 route 唔啱

Tailscale + App Connector 嘅模式係:

Tailscale 一直開住 -> 一般流量照常 -> OpenAI 相關流量自動走 oracle-jp

唔使每次諗「我而家有無開 VPN?」,也不用將整台機嘅 traffic 交俾某個出口。

呢點特別啱我嘅 HomeLab,因為 Mac mini、工作機同手機本來就長期掛喺 tailnet 入面。Tailscale 對我嚟講唔係臨時 VPN,而係底層網絡。

同 tinyproxy 嘅分別

我之前也用過 tinyproxy。好簡單:海外 VM 跑 proxy,本機設 http_proxy / https_proxy,讓 CLI 工具行過去。

對於 Copilot CLI、opencode 呢類會讀 proxy env var 嘅工具,呢個方法好好用。

但覆蓋唔到以下場景:

  • Desktop App (例如 Codex Desktop)
  • 手機 APP

點解我鍾意呢個方案

我最鍾意 Tailscale 嘅地方,就係佢令「VPN」呢件事變得不再像 VPN。

我唔需要每次打開 ChatGPT 就切一個 app,也不用讓成部 Mac 行日本出口。我只係將 OpenAI 相關 domains 定義成一個 app,讓佢行 oracle-jp。其他 HomeLab 服務繼續行 tailnet,一般網站繼續直連。

呢種精準控制,先至係 Tailscale 喺個人 HomeLab 入面最有趣嘅地方。

如果你也有 Oracle Cloud 免費 VM,又經常被地區限制打斷工作流,可以試下呢個方向。設定比傳統 site-to-site VPN 輕好多,也比手動 proxy 更集中。最重要係,少一個「啊,我又忘記開 VPN」嘅麻煩。