ctsite.cc部落格

Turnout 1.1:UDP 被擋時改走 TCP,也有 Windows 版了

Windows 11 上的 Turnout 視窗:一條已連線的通道,路徑從通道經過 Wi-Fi 網路介面卡連到伺服器,下方是路由、對等端與自動連線

上次寫 Turnout 時,它還在開發中。10 月 26 日推出 1.0 之後,它又陸續更新了幾版:1.1.0 讓 WireGuard 在 UDP 被擋的網路上改走 TCP,1.1.2 起 Turnout 也有了 Windows 11 版,同一份授權 Mac 和 Windows 都能用。這篇整理 1.1 這一路加了什麼,以及 Windows 版和 Mac 版哪裡一樣、哪裡不同。

目前的版本是 11 月 6 日發布的 1.1.4,Mac 和 Windows 同時推出。

先補上 1.0:試用與授權

Turnout 還是那個連到 WireGuard 伺服器的 VPN 用戶端:讀你原本給 wg-quick 用的 .conf,hook 照樣執行,路由由你作主,通道從哪個網路介面出去也由你決定。1.0 起它是付費 App,每台電腦先有 7 天可以使用全部功能,需要的話再多 7 天;試用不需要帳號和信用卡,期間也不做授權檢查。試用結束後只有「連線」需要授權,中斷連線、編輯、匯出、修復網路設定和解除安裝一律照常。

UDP 被擋時,改走 TCP

WireGuard 只用 UDP,而有些網路會封鎖或限速 UDP:飯店和訪客 Wi-Fi、部分辦公室、部分電信業者。1.1.0 加入了 Phantun 的支援:在編輯器裡把對等端的傳輸方式從 UDP 切成 Phantun(TCP),Turnout 就會把 WireGuard 的封包包在一條 TCP 連線裡,送到 WireGuard 伺服器前面的一台 Linux 主機,由那裡的 Phantun 伺服器交給 WireGuard。

直接走 UDP 被擋時,Turnout 改用 TCP 連到 Linux 主機上的 Phantun 伺服器,再由它以 UDP 交給 WireGuard 伺服器;設定檔只多一行 #@ Phantun 註解 直接走 UDP:被擋 你的 Mac Turnout Phantun Linux 主機 WireGuard 伺服器 TCP 4567 UDP 設定檔只多一行註解: #@ Phantun = 4567 wg-quick 會略過它,同一個檔案在別處照樣走 UDP Mac 上不必多跑任何程式

TCP 那一段由 Turnout 自己處理,Phantun 伺服器再以 UDP 交給 WireGuard。

這個設定只是對等端裡的一行註解。wg-quick 看到 #@ 開頭的行會當成註解,所以同一個檔案拿到別的地方,照樣用 UDP 連線:

[Peer]
PublicKey = …
Endpoint = vpn.example.com:51820
#@ Phantun = 4567

伺服器那邊也不用自己查文件。「伺服器設定⋯」會列出 Linux 主機要執行的指令,可以用 Docker 或 Phantun 的發行版執行檔,通道的連接埠和 MTU 都已經填好,每一段都有「複製」按鈕。UDP 通道一直收不到回應時,路徑上會出現「使用 Phantun⋯」,直接切換過去;從 Linux 搬過來、Endpoint 是 127.0.0.1 的設定檔(因為那邊先啟動了 phantun_client),也會得到同樣的建議,順便把那些指令移掉。

Mac 上透過 Phantun 伺服器連線的通道:標著 TCP 4567 的套管包住網路介面到伺服器之間的路徑,右側有「伺服器設定⋯」按鈕

走 Phantun 的通道(英文介面):TCP 連線畫成一段包住傳輸線的套管。

上一篇提過的那條路徑也跟著多了一段:TCP 連線畫成包住傳輸線的套管,連線中是虛線,連上後變成實線;伺服器拒絕時變紅色,完全沒有回應時是橘色,旁邊再用一句話說明該檢查哪一邊。走 Phantun 的通道在連線期間,會在 Mac 的封包過濾(pf)加一條規則,中斷時移除;「修復網路設定⋯」和當機後的復原也會一併清掉它。

Phantun 能穿過封鎖或限速 UDP 的網路,但過不了會檢查流量是不是真正網頁連線的防火牆。它也需要一台 Linux 主機跑 Phantun 伺服器。

Windows 版:同一套做法,搬到 Windows 11

1.1.2 是 Windows 版的第一個正式版本。它和 Mac 版讀同一種設定檔,用同樣的方式選路:

  • 設定檔照 wg-quick 的方式讀取:匯入 .conf 和裝著它們的 zip,包括官方 WireGuard App 匯出的檔案,也能再匯出。編輯器一樣有表單和文字兩種檢視,註解和不認得的行都照原樣保留。
  • 網路介面由你選:#@ BindInterface 讓加密流量從指定的網路介面卡出去,名稱就是 Windows 顯示的那個,例如 #@ BindInterface = Ethernet 2;#@ Route … dev 讓指定的網段繞過通道。
  • 自己連線:通道可以依排程,或在這台電腦加入你列出的 Wi-Fi 時連線,時間到或離開時中斷;這中間你手動做的操作會維持不變。
  • Hook:PreUp、PostUp、PreDown、PostDown 一樣會執行,也一樣要先經過管理者核准。
  • 通知與語言:同樣的通知,介面有 English、繁體中文、日本語、Español 和 한국어。

通知區域上方的 Turnout 面板:每條通道和它的開關、已連線通道走的網路介面卡和流量,以及「設定」和「打開 Turnout」按鈕

從通知區域的 Turnout 圖示打開的面板(英文介面)。

和 Mac 版不同的地方

  • 待在通知區域:Mac 版在選單列,Windows 版在通知區域。Windows 可能會把新圖示收在工作列的 ^ 後面,把它拖到工作列上,就會一直顯示。
  • 全通道的流量留在通道裡:承接所有流量的通道連線期間,Windows 的防火牆會擋下原本會從通道外送出的流量,以及送往通道 DNS 伺服器以外的 DNS 查詢,做法和官方 WireGuard App 相同。繞道的路由、區域網路必要的流量(DHCP、loopback)和通道本身連到伺服器的連線都會放行。這一點 Mac 版反而沒有。
  • 還沒有 Phantun:用到 Phantun 的設定檔會照常顯示,但在 Windows 上還不會連線。
  • 用命令列取代「捷徑」:Turnout.exe connect <tunnel>、disconnect <tunnel> 和 status [tunnel]。
  • 只支援 x64 電腦上的 Windows 11:Windows 10、Arm 版 Windows 和 Windows Server 都不支援。

它對 Windows 做了什麼

和 Mac 版一樣,Turnout 在 Windows 上也分成兩半:App 以你的身分執行,沒有任何特殊權限;真正修改網路的是一個以 SYSTEM 身分執行的背景服務。兩者之間是一條只回應這台電腦的具名管道。

Windows 上的 Turnout:App 以你的身分執行,經由具名管道請以 SYSTEM 執行的背景服務做事;服務建立 Wintun 網路介面卡、用 IP Helper 設定位址與路由,全通道時才加上 WFP 防火牆規則 Turnout.exe 以你的身分執行 沒有特殊權限 背景服務 以 SYSTEM 執行 具名管道 只回應這台電腦 Wintun 介面卡 每條通道一個 IP Helper 位址、路由 WFP 防火牆 只在全通道時 DNS 設在通道自己的介面卡上,中斷後不必還原

App 只負責介面,所有會改動系統的事都交給背景服務。

每條已連線的通道都是一個以它命名的 Wintun 網路介面卡,驅動程式來自 WireGuard 專案,隨 Turnout 一起安裝;WireGuard 本身和 Mac 版一樣由 GotaTun 執行,那是 Mullvad 開發、以 MPL-2.0 授權的實作。位址和路由透過 Windows 的 IP Helper 函式設定;DNS 伺服器設在通道自己的介面卡上,所以中斷後不需要還原其他東西。防火牆規則放在服務自己的工作階段裡,通道中斷或服務停止時就會消失。

設定檔(包括私鑰)放在 %ProgramData%\cc.ctsite.turnout\tunnels,只有 SYSTEM 和管理者能讀取;hook 以 SYSTEM 身分透過 cmd.exe /C 執行。每一項路由變更在動手之前都會先記錄下來,所以當機之後,服務下次啟動時會先把留下的變更復原。想自己看看它改了什麼,可以在 PowerShell 裡執行:

Get-Service cc.ctsite.turnout.daemon
Get-NetAdapter # 通道的 Wintun 介面卡
Get-NetRoute -AddressFamily IPv4 # 它加入的路由
Get-DnsClientServerAddress # 通道介面卡的 DNS

在 Windows 上安裝

從產品頁下載 Turnout-<版本>-x64.msi 打開。這個安裝程式還沒有 Windows 的程式碼簽署憑證,所以 SmartScreen 可能會顯示「Windows 已保護您的電腦」,選「其他資訊」再選「仍要執行」,接著 Windows 會要求管理者核准。Turnout 會裝到 C:\Program Files\Turnout,背景服務隨即啟動,歡迎導覽會告訴你圖示在哪裡。

開啟了「智慧型應用程式控制」的電腦,則完全不讓沒有程式碼簽署憑證的安裝程式執行。之後的更新不依賴這張憑證:每一次更新都帶有 Turnout 自己的簽章,背景服務會先檢查大小、檢查碼和簽章,才交給 Windows Installer 安裝。

1.1.1 到 1.1.4 的其他改進

  • 1.1.1:背景服務的記錄檔不再夾帶終端機的顏色碼,在「主控台」或任何文字編輯器裡都讀得清楚;服務的程式也重新整理過,讓它能在 Mac 以外共用。
  • 1.1.3:Mac 和 Windows 版都改經由 turnout.ctsite.cc 上的網址讀取更新,之後版本放在哪裡可以換,不必為此再出新版;Windows 通知區域的面板也變寬了。
  • 1.1.4:Turnout 關著的時候錯過了排程的開始或結束,下次打開時不會再推翻你在那之後手動做的連線或中斷;Windows 版更新完也會打開視窗,不會像是沒回來。

一份授權,Mac 和 Windows 一起用

US$19 一次買斷,可以用在三台電腦上,Mac 或 Windows 都算,Turnout 1 的每一次更新都包含在內。上市優惠價是 US$10,到 2026 年 11 月 25 日為止。付款和稅務由 Polar 處理,付款完成後頁面會直接顯示授權金鑰;14 天內可以退款,不問原因。

登入同一個 iCloud 帳號的 Mac 會找到這份授權,按一下就能使用;Windows 沒有 iCloud 可以帶過去,要在每台電腦的「授權」裡各自貼上金鑰,金鑰存在 Windows 認證管理員中。

還沒有的

  • 還沒有 kill switch。通道中斷時,電腦會走原本的網路;在 Mac 上,通道連線時 Turnout 也不會阻擋通道以外的流量。
  • 排程和 Wi-Fi 規則只在 Turnout 開著時運作,所以它提供「在登入時打開」;Wi-Fi 規則還需要定位權限,因為 macOS 和 Windows 都把 Wi-Fi 網路名稱視為位置資訊。
  • SaveConfig = true 讀得懂,但還不會把執行中的狀態寫回設定檔。

Turnout 怎麼照 wg-quick 的順序套用設定、怎麼把權限切成兩半、當機之後怎麼復原,上一篇開發筆記有比較完整的說明。

相關連結

Turnout 可以免費試用 7 天,用得順手再買一份授權就好。

Mac 與 macOS 是 Apple Inc. 的商標。Windows 是 Microsoft 集團旗下公司的商標。WireGuard 是 Jason A. Donenfeld 的註冊商標。Turnout 是獨立開發的專案,與 WireGuard 專案沒有關聯,也未獲其背書。Phantun 是 Datong Sun 的開源專案。

留言