OpenSurge for Mac:把 Mac 變成全屋網路閘道,每台設備走不同出口

OpenSurge for Mac 是 GPL-3.0 開源的 macOS 網路閘道工具,用 dnsmasq 接管 DHCP/DNS、mihomo 當代理引擎、pf 做 NAT,讓同一區網的每台設備各走不同出口。本文依官方文件拆解它的架構、三種使用情境與六個硬限制(含正式版未簽名、root helper、接管整個區網 DHCP),幫你下載前判斷適不適合。

用 AI 摘要這篇文章:

OpenSurge for Mac 是一個開源的 macOS 閘道工具,它處理的是一件原本得登進路由器後台才能做的事:讓同一個家裡的每台設備,各走不同的網路出口。手機走代理、遊戲機直連、智慧電視鎖在家裡 IP,設備本身什麼都不用設。README 把它描述成「把 Mac 變成整個區域網路的代理出口」,同一個 Wi-Fi 下的手機、電視、PS5、VR、虛擬機,都從 Mac 拿 DHCP 與 DNS(白話講就是「領 IP 號碼牌」跟「問網址翻譯」兩件基本功),再共用 Mac 上由規則控制的連線。

它真正跟一般 mihomo 圖形介面拉開距離的地方,是「每台設備一套出口策略」。下面所有能力都來自官方 README、文件連結與 releases 頁面,我沒有實機安裝,原因是它一啟用就會接管整個區域網路的 DHCP 與 DNS,還會裝一個具備管理者權限的 root helper(輔助程式),在本機貿然跑會動到我現有的網路環境。所以這篇談的是「官方資料顯示能做什麼、有哪些硬限制」,不談「實際跑起來穩不穩」。

底層是 dnsmasq 加 mihomo 加 pf:三個老牌工具的組合,不是新發明

OpenSurge 最值得先看清的一點,是它沒有重新發明代理引擎。README 的架構段寫得很明白:底層是 dnsmasq 負責 DHCP 與 DNS、mihomo 當代理引擎、macOS 內建的 pf 加 IPv4 forwarding 提供原生閘道路徑。這三個都是存在多年、被大量部署的成熟元件,OpenSurge 做的是把它們包進一個 Mac App 與一套恢復狀態機(自動把網路復原的流程)裡,而不是自己寫一套新的代理核心。

先把這三個名字各用一句話講清楚:

  • dnsmasq:像教室裡的值日生,負責發 IP 號碼牌(DHCP)跟翻譯網址(DNS)。OpenSurge 讓區網裡的設備改跟這台 Mac 領牌、改問這台 Mac 翻譯網址,就等於把「誰能上網、上到哪」的決定權收到 Mac 手上。
  • mihomo:代理引擎(規則分流的核心)。你可以想成它是「依照規則決定每條連線走哪個出口」的那一層,支援常見的 proxies、proxy-groups、rules 與 rule-providers 格式,所以你本來在用的 mihomo 訂閱或設定檔,有機會直接匯入續用。
  • pf 與 IPv4 forwarding:macOS 自己內建的封包過濾器加上轉發規則。這裡用它做 NAT(把區網設備的流量蓋上 Mac 自己的對外 IP 再送出去),這是「Mac 當閘道」會用到的原生機制,不用額外裝驅動。

透明代理(裝置不用設定、流量經過就被導走的那種)走的是 TUN,也就是系統裡的一張虛擬網卡。README 明確寫到,mihomo 的 redir-port 與 PF TCP 重定向被「有意禁用」,因為目前的 Darwin(macOS 底層)建構在執行時回報不支援 redir。白話講就是:在 macOS 上,透明代理只能走 TUN 這條路,mihomo.redir_portpf.redirect_tcp_to 都要保持 0,不要去硬開。

OpenSurge 在這層架構之上,多加了「每台設備一套出口策略」。README 寫到,一個 mihomo 進程可以對已登記的區網設備套用獨立策略:DHCP 接管模式下,每台設備拿到綁定 MAC 的固定 IPv4 租約;旁路由模式(手動把 Mac 設成閘道、主路由器維持不變)則靠主路由器側的靜態 IP 維持穩定位址。兩種模式都會產生每台設備專屬的 mihomo selector group(出口選擇鈕)與 SRC-IP-CIDR 規則。這就是它跟你直接裝一個 mihomo 圖形介面、全機走同一套規則,最不一樣的地方。

如果你已經有現成的 mihomo 設定檔,OpenSurge 支援用 imported 模式直接匯入,不用從頭重寫。不過 README 寫得很清楚:匯入後 OpenSurge 仍然會接管幾個「閘道等級」的關鍵欄位,包括 LAN 綁定、allow-lan、DNS 監聽、fake-IP 網段、TUN、external-controller 與 runtime 路徑;你的設定檔負責貢獻 proxies、proxy-groups、rules、rule-providers,以及不動到閘道邊界的 DNS 解析欄位。白話講就是:你的節點和規則可以帶過來,但「怎麼當閘道」這一層由 OpenSurge 說了算,不接受設定檔覆蓋。它也會保留 nameserver-policy、fake-ip-filter 這類欄位,讓依賴專屬 DNS 的代理節點域名還能正確解析。

README 另外提到這個 repo 被設計成「AI Agent 友好工作區」,把專案知識跟驗證證據一起版本化;這跟要不要裝沒直接關係,但如果你對 Claude Code 工程流程 有興趣可以延伸看。

官方釋出的三張主畫面:Dashboard、Policies、Devices

README 開頭放了三張官方截圖,正好對應 OpenSurge 對外的三個主要畫面。

Dashboard(主介面):README 寫到,它會即時顯示每台設備的連線數、上下行速率、累計流量,以及佔主要流量的 mihomo 出口鏈。簡單講就是一張「現在誰在用、用去哪、走哪個出口」的即時表。

OpenSurge Dashboard 官方主介面截圖:即時顯示每台設備的連線數、上下行速率與 mihomo 出口鏈。Pin
OpenSurge Dashboard 官方主介面截圖:即時顯示每台設備的連線數、上下行速率與 mihomo 出口鏈。

Policies(策略與節點健康):這一頁集中偵測代理節點的可達性與延遲,並可從這個畫面切換已套用的 Selector。README 還提到一個細節:它會透過 mihomo 的 mixed-port 去探測一組固定的真實服務清單,顯示三輪中位延遲、命中規則與實際出口鏈,不是只 ping 一下就丟一個數字給你。

OpenSurge Policies 官方截圖:顯示代理節點的可達性、三輪中位延遲、命中規則與實際出口鏈。Pin
OpenSurge Policies 官方截圖:顯示代理節點的可達性、三輪中位延遲、命中規則與實際出口鏈。

Devices(每設備策略):在這裡為每台已登記的設備指定要跟隨 Mac 全域規則,還是要在全域規則之前先走設備專屬 selector。支援 REJECT 這種設備層級的動作,也可以用域名、IP、協定、連接埠或 rule-provider 去疊加覆蓋規則。

OpenSurge for Mac Devices 頁面官方截圖,顯示每台設備的出口策略選擇。Pin
OpenSurge Devices 官方截圖:為每台設備指定不同的出口策略。

另外還有一個選單列(螢幕上方那條)的 App,純粹顯示狀態、收網路恢復提醒、開啟 Web GUI。README 明確講,選單列 App 不提供閘道的開關或策略切換,控制服務也只聽 127.0.0.1(本機自己),啟動時會吐一條一次性的 Web GUI 連結出來。想動閘道、改策略,要回到 Dashboard 那個網頁介面,不是在選單列點兩下就能搞定。

手機走代理、PS5 直連:同一台 Mac,兩條出口

把機制講完,看「官方資料顯示它最適合拿來做什麼」會比較具體。

最典型的情境是「同一台 Mac 同時服務兩種需求」。你晚上想用手機看某個只在特定地區開放的服務,但 PS5 連線對戰又需要直連,不能繞代理否則 ping 會爆掉。在 OpenSurge 的模型裡,這兩件事不用兩套工具:手機套一套走代理的 selector、PS5 套一套 DIRECT(直連),兩邊共用同一台 Mac 當閘道。

第二種情境是「全家共用一個出口」。例如家裡所有設備都要走某個地區節點,但懶得每台設備各裝一套代理 App。只要設備都跟 Mac 領 DHCP,就自動全部走 Mac 上的規則,什麼都不用設。對 Apple TV、智慧電視、VR 這類不方便裝代理用戶端的設備來說特別實用。

第三種是「針對某台設備擋特定內容」。README 提到 dedicated 模式下,本地與私有目標會保持直連,同時可以對某台設備套用 REJECT 這類專屬動作。例如讓小孩那台平板擋掉特定域名,其他設備不受影響。

而前兩種情境要在「DHCP 接管」還是「旁路由」模式之間挑一個,README 的架構設計其實已經給了暗示。DHCP 接管模式自動化程度高,設備不用任何設定就會跟 Mac 領牌,但它直接跟現有路由器的 DHCP 搶工作,適合你能完全掌控那台路由器、甚至打算關掉路由器 DHCP 的場景。旁路由模式相對保守,主路由器維持原樣,你只要在每台想走代理的設備上把閘道手動指到 Mac 的靜態 IP,沒指到的設備就維持原本的上網方式,影響範圍比較可控。簡單講:能動路由器就用接管模式圖方便,不能動或不想動就用旁路由模式踩剎車。

不過這裡有一個 README 講得很直白的限制要先記下來:OpenSurge 有意不內建任何家庭模板或第三方規則列表。官方的說法是「策略內容由操作者提供,空的 starter 文件也是合法設定」。意思是它給你一套分流架構,但不會幫你寫規則。你要嘛已經有 mihomo 訂閱或設定檔可以匯入,要嘛願意自己研究規則,否則裝起來什麼都不會自動幫你做。

怎麼匯入你現成的 mihomo 設定

OpenSurge 不需要你從頭寫設定檔。如果你已經有 mihomo(或 Clash)的訂閱或設定檔,README 說明可以用 imported 模式直接匯入。匯入時要搞清楚一件事:哪些欄位你說了算,哪些 OpenSurge 說了算。

  • 你的設定檔負責:proxies(節點)、proxy-groups(群組)、rules(規則)、rule-providers,以及不動到閘道邊界的 DNS 解析欄位。
  • OpenSurge 接管:LAN 綁定、allow-lan、DNS 監聽、fake-IP 網段、TUN、external-controller、runtime 路徑。這些是「怎麼當閘道」的核心,不接受你的設定檔覆蓋。

白話講:你的節點和規則可以帶過來,但「怎麼把 Mac 變成閘道」這一層由 OpenSurge 管。它也會保留 nameserver-policy、fake-ip-filter 這些欄位,讓依賴特定 DNS 的代理節點還能正常解析。啟動前可以先預覽最終設定長怎樣,不用直接上:

go run ./cmd/omg render-mihomo --config examples/config.imported-profile.example.yaml

如果已經裝了 mihomo 二進位檔,還可以用 validate-mihomo 跑 mihomo 自己的校驗,確保設定沒語法錯,但不會真的啟動閘道:

go run ./cmd/omg validate-mihomo --config examples/config.imported-profile.example.yaml

怎麼讓每台設備走不同出口

這是 OpenSurge 跟一般 mihomo 用戶端最大差異。README 說明,一個 mihomo 進程可以對已登記的區網設備套用獨立策略,做法是為每台設備生成專屬的 selector group(出口選擇鈕)和 SRC-IP-CIDR 規則。

在 Dashboard 的 Devices 頁面,你可以為每台設備指定:跟隨 Mac 全域規則、在全域規則之前先走設備專屬 selector,或直接 REJECT(擋掉特定連線)。如果你用 CLI:

# 查看所有已登記設備
go run ./cmd/omg devices --config ./config.yaml --format json

# 為某台設備切換策略
go run ./cmd/omg device-policy-select \
  --config ./config.yaml \
  --device alice-phone \
  --slot default \
  --policy DIRECT

dedicated 模式下,本地和私有目標會保持直連,不會被代理影響。

怎麼安全啟停網關

OpenSurge 的 start 和 stop 都需要 sudo,因為它們會動到 DHCP、DNS、pf 和 IPv4 forwarding。

# 啟動
sudo go run ./cmd/omg start --config examples/config.example.yaml

# 停止(含 DHCP 恢復)
sudo go run ./cmd/omg stop --config examples/config.example.yaml

# 重新載入(改完設定不重啟整個閘道)
sudo go run ./cmd/omg reload --config examples/config.example.yaml

README 強調,stop 不只是關掉程式,還包含把 DHCP 和 DNS 還原到啟動前的狀態。它的恢復狀態機會逐步驗證「路由器回到正常了沒、客戶端拿回原本的 IP 了沒」,恢復沒完成就不算成功停止。pkg 升級時如果同個區網的 DHCP 還沒恢復完,會直接拒絕執行升級。這就是為什麼前面說它不適合裝來試試看:一但啟用了接管,連停止都得走完恢復流程。

正式版沒簽名,還會接管整個區域網路的 DHCP

這一段是整篇最重要的部分,因為它直接決定你到底要不要裝。

第一,正式 release 沒簽名、也沒 notarize。 GitHub releases 上的安裝包檔名直接寫 arm64-unsigned.pkgx86_64-unsigned.pkg,README 白紙黑字寫「不能把正式 release 描述成已經簽名、已經 notarize、或可被 Gatekeeper 直接放行」。實際意思是:你雙擊裝下去,macOS 的 Gatekeeper(下載軟體的把關機制)會擋,你要自己進「系統設定 → 隱私與安全性」按「仍要打開」、完成身份驗證才能放行。README 特別交代不要全域關閉 Gatekeeper、也不要遞迴刪 quarantine 標記。這是 macOS 裝未簽名軟體時的標準手動放行流程,但每個使用者都得自己衡量「替這個工具手動放行一次」安不安全。

好消息是 README 提供了 gh attestation verify 指令,可以驗證你下載的 pkg 確實是由 YTwsy/OpenSurge-for-Mac 這個 repo 在 GitHub 上建構出來的,不是被別人掉包過:

“`sh

gh attestation verify OpenSurge-for-Mac-*-arm64-unsigned.pkg \

-R YTwsy/OpenSurge-for-Mac

“`

這不是簽名,不能證明程式沒有後門,但能證明「這份檔案來自該 repo 的 build,沒在傳輸過程被換掉」。再搭配 README 列的 shasum -a 256 -c SHA256SUMS 核對雜湊,是處理未簽名 pkg 時的基本動作。

第二,start 與 stop 需要 sudo,還會裝 root helper。 README 寫到,startstop 要用 sudo 執行,因為它們會管理 DHCP、pf 與 IPv4 forwarding。安裝過程會啟動一個 root 擁有、功能固定的 helper,並加一條很窄的 sudoers 規則。網關二進位檔本身不會拿到免密碼 root 權限,這是 README 刻意設計的安全邊界,但代價就是「權限開得很深」這件事本身就成立。

第三,一啟用就接管整個區域網路的 DHCP 與 DNS。 這是它最核心的能力,也是它最核心的風險。接管 DHCP 意味著:如果你裝在公司的共用 Wi-Fi、宿舍網路、或任何「不是你自己說了算」的網路環境,會直接跟原本的 DHCP 伺服器打架,影響到別人的設備。README 自己也把「DHCP 接管」歸類為高風險行為,需要用隔離的虛擬區網 lab 先驗證,並強調「恢復本身就是驗收的一部分」,流量探針成功,但路由器、Mac 或用戶端回不到已知正常狀態,不算過關。換句話說,這不是「裝來試試看」的工具,而是「我決定讓這台 Mac 當 24 小時閘道」的決定。

第四,不內建規則。 上面提過,這裡強調後果:什麼都不擋、什麼都不分流,全看你給它什麼。沒有規則來源的人,裝完只會得到一個空的分流架構。

第五,只支援 macOS 13 以上。 README 的 badge 寫 macOS 13+,提供 Apple Silicon 與 Intel 兩種架構的安裝包。系統版本不夠就直接不用考慮。

第六,授權是 GPL-3.0。 自有程式碼採 GPL-3.0-only,可以改、可以商用,但 GPL 帶傳染性,你修改後再散布,也要用相同條款公開原始碼。隨包分發的 mihomo、dnsmasq 等第三方程式仍維持各自授權。關於 GitHub 公開不等於隨便用的道理,我們在 Agent Battery 那篇談過;對單純使用者沒影響,對想拿來做產品的人則是要先算進去的成本。

讓 Mac 當 24 小時閘道之前,先把帳算清楚

把上面六點攤開,其實就篩掉了大部分人。OpenSurge 適合的,是同時具備這幾個條件的人:家裡已經有 mihomo 訂閱或設定檔、想讓全家設備共用且按設備分流、有一台 Mac 願意開整天當閘道、能接受未簽名 pkg 的手動放行流程,而且自己對規則與網路有一定掌握。

反過來,下面這幾種情況建議直接跳過:

  • 只想給單台 Mac 走代理,直接用 mihomo 或 Clash Verge 之類的用戶端就好,不需要動到全屋網路;若你感興趣的是 AI 技能而非網路閘道,那是另一個方向。
  • 你的網路環境不是自己說了算(公司、宿舍、共用 Wi-Fi),接管 DHCP 會影響別人,別碰。
  • 沒有任何現成規則來源、也不打算自己寫,裝完什麼都不會自動分流。
  • 只想在 Mac 上裝個輕量開源桌面工具、不碰網路基礎設施,那會比較適合 mihomo 或 Clash Verge 之類的用戶端 這類不動網路的選擇。

如果你評估過還是想試,README 給的第一步順序是這樣:

1. 從對應的 GitHub Release 下載你架構的 arm64-unsigned.pkg(Apple Silicon)或 x86_64-unsigned.pkg(Intel),連 SHA256SUMS 一起抓下來。

2. 跑 shasum -a 256 -c SHA256SUMS 核對檔案雜湊。

3. 跑 gh attestation verify 驗證構建來源(指令見上一節)。

4. 雙擊安裝。被 Gatekeeper 擋,就到「系統設定 → 隱私與安全性」按「仍要打開」並完成身份驗證,不要為了省事全域關閉 Gatekeeper。

5. 從 /Applications 打開 OpenSurge,照 README 指向的 App 使用指南 操作。注意:裝完網關預設是停止的,要在控制面裡明確動作才會啟用,這是它刻意設計的「不會偷偷啟動」預設值。

README 也交代了乾淨退場的方式。選單列 App 區分「只退出選單列」跟「退出 OpenSurge」兩種,後者只在網關已經停止時才會動作;另外有一個獨立的「卸載 OpenSurge」入口,只要網關停止,就能用管理者授權移除 App、Control Service 與 root helper,並可選擇保留設定檔以便日後重裝。pkg 升級時如果在同個區網的 DHCP 還沒恢復完成,會直接拒絕執行,這也是把「恢復」當成驗收一部分的設計。換句話說,就算你試過不滿意,它提供了完整的拆除路徑,只是拆除的前提是「閘道已經乾淨停止」。

最後,OpenSurge 的能力組合在官方文件裡看起來很完整,但「這台 Mac 在你家的網路環境裡能不能穩定當全天閘道」、「接管 DHCP 會不會跟你現有路由器打架」、「未簽名軟體的手動放行你願不願意扛」,這幾件事官方文件沒辦法替你回答,要你自己裝下去、在隔離環境裡測過才知道。先看清它做什麼、硬限制在哪,下載前就能過濾掉那些會讓你後悔的決定。

Sliven 褚崇名
Sliven 褚崇名

每日分享科技新知、免費資源以及 WordPress、虛擬主機相關主題,任何問題歡迎在科技月球下方留言,或是發送 Email 至 [email protected] 與我聯繫。

文章: 739

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


Share to...