先釐清:流量入口與代理規則
瀏覽器能上網,終端機卻連線逾時,通常應先確認流量有沒有進入用戶端,而不是急著更換節點。系統代理和 TUN 是兩種流量入口;規則模式與全域模式則決定流量進入核心後要走哪個出口。兩組設定處理的是不同問題。
系統代理會將本機代理位址登錄到 macOS 網路設定。只有願意讀取並採用這些設定的應用程式,才會將請求交給代理。TUN 則會建立虛擬網路介面,搭配路由將符合接管範圍的 IP 封包送進核心。mihomo 是相容於 Clash 設定檔生態系的代理核心;用戶端則負責提供操作介面、設定管理與權限服務。
| 比較項目 | 系統代理 | TUN 模式 |
|---|---|---|
| 流量接管入口 | 應用程式讀取代理設定後,主動連線至本機連接埠 | 透過虛擬網卡與路由將 IP 封包送進核心 |
| 常見適用對象 | 遵循系統設定的瀏覽器與桌面應用程式 | 不讀取系統代理設定的程式,以及部分 UDP 應用程式 |
| 終端機指令 | 通常需要指定代理參數或環境變數 | 路由涵蓋時通常不必逐項設定 |
| 權限需求 | 通常不需要安裝 TUN 輔助服務 | 通常需要授權輔助服務來設定介面與路由 |
| DNS 處理 | 視應用程式與代理協定而定 | 可搭配 DNS 劫持與核心 DNS,但仍有涵蓋範圍限制 |
系統代理:檢查設定與本機連接埠
在 macOS 確認代理設定是否已套用
以 macOS 13 及後續版本的系統設定介面為例,依序開啟「系統設定」→「網路」→「Wi-Fi」→「詳細資訊」→「代理伺服器」。使用有線網路時,請查看目前使用中的乙太網路服務。開啟用戶端的系統代理後,確認網頁代理、安全網頁代理或 SOCKS 代理的位址與連接埠;實際套用哪些項目視用戶端而定。
位址通常是 127.0.0.1,代表這台 Mac 本機;連接埠則必須與用戶端目前監聽的連接埠相同。本文以 7890 示範 HTTP 與 SOCKS 共用的混合連接埠,並非每個用戶端的預設值。請先在用戶端的連接埠設定中確認,再執行指令。
# 查看 macOS 目前彙整的代理設定
scutil --proxy
# 檢查範例連接埠是否有 TCP 監聽程序
lsof -nP -iTCP:7890 -sTCP:LISTEN
- 在
scutil --proxy中查看HTTPEnable、HTTPSEnable或SOCKSEnable,並確認對應的連接埠。 - 如果
lsof沒有輸出,請先檢查連接埠是否輸入錯誤、核心是否已啟動,以及連接埠是否已改成其他數值。 - 如果監聽程序不是目前使用的用戶端,請先排查連接埠衝突,避免同時執行兩個用戶端並爭用相同位址。
開啟系統代理不代表所有應用程式會立即切換。應用程式可能使用自己的網路堆疊、既有長連線或獨立代理設定。變更後請建立新連線,必要時重新啟動目標應用程式,再查看用戶端的連線紀錄;不要只憑選單列的開關判斷是否成功。
終端機指令:明確指定代理來驗證入口
命令列工具是否會讀取 macOS 系統代理,取決於工具本身的實作。常見的 curl 用法會讀取代理環境變數,但不能因此推論它會自動採用系統代理設定。先明確指定代理參數進行測試,便能區分「代理入口問題」與「網站連線問題」。
先指定 HTTP 代理,再測試 SOCKS
# 透過本機 HTTP 代理發出 HTTPS 請求,最長等待 15 秒
curl --proxy http://127.0.0.1:7890 \
--connect-timeout 10 --max-time 15 -I https://example.com
# 使用 SOCKS5,並交由代理解析目標網域名稱
curl --proxy socks5h://127.0.0.1:7890 \
--connect-timeout 10 --max-time 15 -I https://example.com
只有在該連接埠支援 SOCKS 時,第二個指令才適用。socks5h 中的 h 表示透過代理解析目標主機名稱;使用 socks5 時,curl 通常會先在本機解析。兩種寫法的差異會直接影響 DNS 排查結果。
需要持續使用時,設定暫時性變數
# 只影響目前的終端機工作階段及其後續啟動的子程序
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
# 測試完成後清除,避免之後誤用
unset http_proxy https_proxy
https_proxy 的值使用 http:// 並不矛盾:這表示本機代理入口使用的協定;HTTPS 目標通常會透過 HTTP CONNECT 通道連線。應用程式與目標網站之間的 TLS 加密不會因此自動取消。
TUN 模式:權限、路由與規則分流
TUN 是第三層虛擬網路介面,負責處理 IP 封包。在 macOS 上,用戶端通常會透過特權輔助服務建立或管理介面並設定路由。啟用前,請先選取有效設定檔並確認核心能正常啟動,再依用戶端提示安裝輔助服務並完成系統授權。請勿在訂閱頁面或設定檔中輸入系統登入密碼。
認識最小設定中的重要欄位
以下是 mihomo 設定片段,用於說明常見欄位,並非完整訂閱內容。不同用戶端可能會從介面產生這些欄位,也可能覆寫訂閱中的值。修改前請先備份設定,並檢查最後生效的設定;不要直接覆蓋整份訂閱。
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
dns:
enable: true
enhanced-mode: fake-ip
enable用來啟用 TUN;仍須具備足夠的系統權限,且核心必須成功啟動。stack用來選擇協定堆疊實作。範例使用mixed,不代表它在每台 Mac 或各種網路環境中都比其他選項更合適。auto-route會要求自動設定路由;auto-detect-interface則用來自動偵測輸出介面。切換 Wi-Fi、有線網路或熱點後,請重新確認出口。dns-hijack用來指定要劫持的目標;any:53針對進入相應處理路徑的傳統 53 連接埠 DNS 請求,並非攔截所有加密 DNS。
只有這段設定還不夠,還需要節點、策略群組、規則及合適的上游 DNS 等內容。請優先使用用戶端支援的設定方式;如果核心回報欄位錯誤,先確認實際使用的核心類型與版本,再依照對應文件調整。
分清 TUN 開關與全域模式
啟用 TUN 後,流量會進入 mihomo,仍可在規則模式下依網域名稱、IP 或其他條件比對規則。符合直連規則就直接連線;符合代理群組則使用群組中選定的出口。全域模式通常會將流量交由全域策略群組處理,但仍會受到入口涵蓋範圍與路由排除影響。若要擴大接管範圍,請啟用 TUN;若要變更出口選擇,則應檢查規則與策略群組。
DNS:網頁能開啟,不代表解析路徑相同
DNS 會將網域名稱轉換成 IP 位址。系統代理只會改變應用程式連線至代理的方式,並不會統一控制所有應用程式的網域解析。瀏覽器可能透過代理傳送網域名稱,也可能使用自己的安全 DNS;其他程式則可能先查詢系統 DNS,再連線至取得的 IP 位址。
TUN 可搭配核心 DNS 處理更多解析請求。啟用 fake-ip 後,核心會為網域名稱指派用於對應的虛擬位址,再於連線階段關聯實際目標。看到 198.18.0.0/15 範圍內的位址不一定代表故障,但仍須以實際設定的 fake-ip 位址範圍為準。
從三個層面檢查解析問題
- 檢查系統入口。執行
scutil --dns查看目前的解析器。這會顯示系統設定,但無法證明每個應用程式都使用這些解析器。 - 檢查核心紀錄。開啟用戶端的連線與記錄頁面,使用同一個網域名稱重新發出請求,觀察是否出現 DNS 請求、規則命中情形與出口選擇。
- 檢查應用程式內建設定。查看瀏覽器的安全 DNS、應用程式內的代理與加密解析設定。DoH 使用 HTTPS 傳輸,DoT 通常使用 853 連接埠,不能只靠劫持 53 連接埠來涵蓋。
不要只執行一次 dig,就認定整個系統的 DNS 路徑都相同。macOS 的分域解析、VPN 解析器與應用程式快取都可能造成差異;dig 的查詢路徑也不完全等同於應用程式呼叫系統解析服務的方式。排查時請記錄目標網域、時間與使用的工具,避免混淆不同測試結果。
遊戲與 UDP:成功接管後還要檢查節點
遊戲經常同時使用 TCP 和 UDP。傳統 HTTP 系統代理通常無法承接遊戲自行傳送的 UDP 封包;SOCKS 協定雖然支援 UDP 轉送,但應用程式也必須主動支援並使用這項功能。TUN 能將更多這類流量送進核心,因此更適合排查不使用系統代理的遊戲連線。
不過,虛擬網卡無法替遠端節點補上 UDP 支援。節點協定、伺服器設定、策略群組選用的出口與本機網路,都可能限制 UDP。請先在用戶端的連線清單確認是否看得到遊戲連線,再查看它符合 DIRECT 還是代理群組規則,最後確認選用的節點是否支援所需流量。
- 成功登入,但無法進入對戰:分別檢查登入階段的 TCP 請求與對戰階段的 UDP 連線,不要只測試登入頁面。
- 能連線但延遲偏高:在相同伺服器區域、相同時段比較遊戲內延遲與封包遺失率。節點清單中的 HTTP 測速結果不等同於遊戲延遲。
- 區域網路連線或裝置探索異常:檢查本機網段的略過策略。廣播、多點傳播與探索協定不應視為一般遠端單播連線來處理。
如果應用程式依賴特定網路介面、防作弊元件或特殊傳輸方式,TUN 也不保證能相容。請先保留原有網路設定與復原方式,每次只變更一個項目,才能判斷問題是由接管方式、規則還是出口造成。
Mac 上的選擇方式與故障復原順序
依應用程式需求選擇流量入口
- 主要使用瀏覽器與遵循系統代理的應用程式:先啟用系統代理,設定方式較直覺,也方便檢查本機連接埠。
- 偶爾使用終端機:優先在指令中加入
--proxy,或設定目前工作階段的變數,讓影響範圍一目瞭然。 - 多個程式不使用代理,或需要處理 UDP:可考慮使用 TUN,並一併檢查輔助服務、DNS 與路由。
- 正在連線公司 VPN:請先遵循組織的網路規範。兩種工具都可能修改路由與 DNS,應分開測試,避免直接疊加使用。
啟用 TUN 後無法上網:先復原再排查
- 關閉 TUN,讓用戶端繼續執行,確認一般網路是否恢復。暫時不要反覆匯入不同訂閱。
- 關閉系統代理,清除測試用終端機中的代理變數,再確認是否已恢復直連。如果曾設定
all_proxy或其大寫變數,也要一併清除。 - 執行
scutil --proxy檢查是否有殘留代理設定;執行route -n get default查看預設路由。TUN 可能會使用更具體的分流路由,因此預設路由本身無法代表所有流量的接管結果。 - 使用
netstat -rn -f inet查看 IPv4 路由;若涉及 IPv6,再執行netstat -rn -f inet6。出現utun介面不一定代表它屬於目前使用的用戶端,其他 VPN 也可能使用該介面。 - 確認網路恢復後,只開啟一種流量入口並重新測試。如果只有 TUN 會出問題,再檢查服務權限、路由衝突與 DNS 記錄。
系統代理與 TUN 並沒有固定的優劣之分。前者適合能主動使用代理的應用程式;後者能擴大接管範圍,但也增加路由、權限與 DNS 的排查項目。先以最少設定滿足目前需求,再逐步擴大涵蓋範圍,會比一次啟用所有選項更容易維護。