Turnout 用原生 App,照 wg-quick 的做法把你的 Mac 連上 WireGuard 伺服器。

你的 hook 照樣執行,路由由你作主,通道要從哪個網路介面出去也由你決定。

即將推出

第一個公開版本正在準備中,在那之前還沒有可以下載的檔案。想第一時間知道,可以關注(Watch)GitHub 儲存庫或它的 Releases 頁面。

Turnout 主視窗中一條已連線的通道:路徑從通道經過它出去的網路介面連到伺服器,雙向都有流量。
每條通道都會顯示即時路徑:通道、它出去的網路介面,以及伺服器。伺服器一回應,線就變成實線,封包沿著線移動的快慢跟著你的流量走。

設定檔照 wg-quick 的方式執行

Turnout 讀取你原本給 wg-quick 用的 .conf 設定檔,照 wg-quick 在 macOS 上的做法一步步套用,用的也是同樣的系統工具。

PreUp PostUp PreDown PostDown
hook 會執行,%i 換成通道的 utun 介面,%I 換成通道名稱。檔案裡的 hook 要先經過管理者核准才會執行;運作方式。
AllowedIPs
導入通道,越具體的路由越優先。全通道用 0.0.0.0/1 和 128.0.0.0/1(以及對應的 IPv6 兩半),而不是取代你的預設路由;伺服器的位址則留在實體閘道上,不會繞進自己的通道。
Table
auto 和 main 照上面的方式設定路由;off 則把路由表交給你處理。
DNS
通道連線期間,DNS 伺服器與搜尋網域會設定到你的網路服務上;中斷連線後就恢復成你原本的設定。
MTU
照設定檔寫的值,或照 wg-quick 的算法:出口網路介面的 MTU 減 80。

選擇網路介面

這兩行是 wg-quick 的格式裡沒有的。它們以 #@ 開頭,wg-quick 會當成註解,所以同一個檔案照樣能用 wg-quick up。

[Interface]
PrivateKey = …
Address = 10.8.0.2/32
DNS = 10.8.0.1
#@ BindInterface = en0
#@ Route = 192.168.0.0/16 dev en0

[Peer]
PublicKey = …
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = vpn.example.com:51820
#@ BindInterface = en0
加密流量一律從 en0 出去,就算預設路由在別的介面上也一樣。通往伺服器的路由也走 en0。
#@ Route = 192.168.0.0/16 dev en0
這些網段不走通道,改從 en0 自己的閘道出去。需要幾個就列幾個,用逗號分隔。
AllowedIPs
其餘流量全部進入通道。

已連線的通道也能直接在主視窗的路徑上切換出口介面:Turnout 會中斷連線、儲存變更,再重新連線。

跟著網路走

閘道、網路介面或連線狀態改變,或是 Mac 從睡眠中喚醒時,Turnout 會把經由實體網路的路由重新指向目前的閘道、重新計算自動 MTU,並重新套用 DNS。

通道綁定的網路介面消失後又回來時,通道會重新綁定並再次交握。介面若一直沒回來,通往伺服器的路由會變成黑洞路由,交握封包就不會溜進通道本身;不走通道的路由則會等介面回來再恢復。

自動連線

幫通道設定時段、Wi-Fi 網路清單,或兩者都設。

排定的時段一開始,Turnout 就連線,時段結束就中斷。Mac 加入清單上的網路時通道會連線,離開時就中斷。這中間你手動做的操作會維持不變,修改規則本身也不會連線或中斷任何東西。

#@ Schedule = Mon-Fri 09:00-18:00
#@ OnWiFi = Office

規則就是設定檔裡的幾行,從通道的頁面設定。Turnout 開著時才會執行這些規則,所以它提供「在登入時打開」。Wi-Fi 規則需要定位權限,因為 macOS 把 Wi-Fi 網路名稱視為位置資訊;Turnout 只在你設定這類規則時才會詢問,啟動時絕不會問。

為通道設定自動連線:每週的時段,以及要連線的 Wi-Fi 網路。
在通道的頁面設定時段與 Wi-Fi 網路。

保留原檔的編輯器

用表單或文字編輯通道,隨時都能切換。

修改只會改寫有動到的那幾行,你的註解和順序都留在原處。問題會連同行號列出,全部解決之後才能儲存。新增的通道會附上一組新產生的金鑰。

Turnout 的編輯器以表單顯示一條通道的設定。
表單和文字是同一個檔案的兩種檢視。

把 .conf 檔或 .zip 拖到視窗上、選擇「檔案」›「從檔案匯入⋯」,或用「檔案」›「從剪貼板新增通道⋯」貼上複製的設定檔。官方 WireGuard App 匯出的 zip 會以批次方式開啟:逐一檢查每條通道,略過不要的,其餘一次匯入。

「檔案」›「輸出通道⋯」則反過來:每條通道各一個 .conf,放進同一個 zip,結構和官方 App 匯出與匯入的一樣。單一通道的「輸出⋯」只儲存它自己的檔案。

匯入面板列出 zip 裡的多條通道,每條都可以切入或略過。
匯入中的每條通道都是一條支線:切入,或是略過。

不留下痕跡

Turnout 對路由和 DNS 的每一項變更,都會先記錄下來才動手。

如果 Mac 在通道連線時當機或斷電,背景服務下次啟動時會復原留下的變更,完成之前不會連線任何通道。「Turnout」›「修復網路設定⋯」也能隨時手動做同樣的事。

解除安裝只有一條路,不論你從 App、從安裝程式,還是從一個可以先讀過內容的 shell 指令稿開始。它會中斷所有通道、恢復路由與 DNS、把背景服務從登入項目移除,並刪除 App、它的記錄檔和偏好設定。已儲存的通道會保留,除非你選擇一併刪除。從 App 解除安裝時,也會空出這部 Mac 在你授權上的名額。各種方式會移除什麼

它不是什麼

  • 還沒有 kill switch。Turnout 不會阻擋通道以外的流量。通道中斷時,你的 Mac 會走原本的網路。
  • 不是 VPN 服務商。請自備伺服器,或使用服務商、網管給你的設定檔。
  • 沒有使用 NetworkExtension。通道在 Turnout 自己的背景服務中執行,hook 能執行、路由由你作主,靠的就是這一點。也因此通道不會出現在「系統設定 › VPN」中。

它對你的 Mac 做了什麼

Turnout 會安裝一個以 root 身分執行的背景服務。它用和 wg-quick 相同的工具修改位址、路由與 DNS,把設定檔放在只有 root 能讀取的資料夾,而且設定檔裡的 hook 要經過管理者核准才會執行。每一項你都能自己檢查。

netstat -rn                         # 它加入的路由
networksetup -getdnsservers Wi-Fi   # 它設定的 DNS 伺服器
cat /Applications/Turnout.app/Contents/Resources/uninstall.sh

Turnout 對你的 Mac 做了什麼

下載與安裝

即將推出

第一個公開版本正在準備中,在那之前還沒有可以下載的檔案。想第一時間知道,可以關注(Watch)GitHub 儲存庫或它的 Releases 頁面。

一份授權,三台 Mac

US$19,一次買斷,可以用在三台 Mac 上,Turnout 1 的每一次更新都包含在內。先試試看:七天免費,需要的話再多七天。不需要帳號,不需要信用卡,試用期間也不做授權檢查。

即將推出

三台 Mac:你自己的、家裡的,或同一個組織內的。付款和稅務由 Polar 處理,收據也由 Polar 寄給你。付款完成後,Polar 的頁面會立刻顯示你的授權金鑰,複製起來貼進 Turnout 就好;之後在你的 Polar 購買記錄頁面也找得到。不適合你?14 天內可以退款,不問原因。