本文適用於已取得服務商 WireGuard 設定的使用者。先區分本機 Interface 與遠端 Peer,再說明金鑰、隧道位址、Endpoint、AllowedIPs、DNS 和 MTU 的對應關係,最後介紹在 Shadowrocket 中新增設定的步驟與分層排查方式。重點是正確填入現有參數,而非產生一組未在伺服器端登錄的新參數。
先區分 Interface 與 Peer
WireGuard 是以 UDP 傳輸的加密隧道協定,不使用傳統的使用者名稱與密碼登入,而是透過金鑰識別通訊雙方。在 Shadowrocket(小火箭)中選用 WireGuard 時,需要相互配對的用戶端與伺服器參數;只有伺服器位址並不足以完成設定。
常見的 WireGuard 設定檔以 [Interface] 表示本機隧道介面,以 [Peer] 表示對端。此處的「本機」是目前裝置,「對端」通常是使用者現有服務的伺服器。用戶端設定中的 PrivateKey 屬於目前裝置;同一個檔案中 [Peer] 區段的 PublicKey 則屬於伺服器,兩者並非同一組金鑰。
原生 WireGuard 設定檔與 Shadowrocket 設定檔格式不同。前者的 [Interface]、[Peer] 不能直接當成 Shadowrocket 的 [Rule] 規則使用。手動新增時,應將各項值填入 WireGuard 編輯頁面的對應欄位;若某個用戶端沒有顯示原生設定檔中的所有選項,也不代表可以把其餘內容隨意填進其他欄位。
金鑰參數:PrivateKey、PublicKey 與 PresharedKey
PrivateKey 是本機私鑰,必須妥善保密。它通常是 Base64 編碼文字;32 位元組的金鑰編碼後一般為 44 個字元,結尾的 = 也是內容的一部分。複製時不要一併複製欄位名稱、引號、空格或換行,也不要將它當成網址解碼。字元長度正確只代表格式可能正確,無法證明它與伺服器上的登錄資料相符。
PublicKey 是對端公鑰,用來確認通訊對象。用戶端自己的公鑰是由用戶端私鑰推導而來,並登錄在伺服器上對應的 Peer 中;用戶端編輯頁面所需的對端公鑰則來自伺服器。若將用戶端自己的公鑰填入對端欄位,或誤將伺服器公鑰填入私鑰欄位,握手便無法正常建立。
本機 Interface 參數
- PrivateKey
- 目前裝置的私鑰,不是伺服器私鑰。
- Address
- 指派給本機隧道介面的位址,保留原有的前綴長度。
- DNS
- 設定提供的 DNS 解析器位址;請一併確認用戶端 DNS 設定的生效方式。
- MTU
- 隧道介面的最大傳輸單位,單位為位元組。
這些值描述本機介面,不應與伺服器的公網位址混填。
遠端 Peer 參數
- PublicKey
- 伺服器公鑰,必須與目標伺服器相符。
- PresharedKey
- 選填的預共享金鑰;若有啟用,雙方必須完全一致。
- Endpoint
- 伺服器主機位址與 UDP 連接埠。
- AllowedIPs
- 此 Peer 對應的隧道目標位址範圍。
這些值描述對端。請勿將伺服器設定檔原封不動地當成用戶端設定填入。
PresharedKey 是額外的對稱金鑰,不會取代公私鑰。如果現有設定沒有提供此項,請保持未設定;若伺服器端已啟用,則用戶端漏填或填錯也會導致握手失敗。不要為了「填滿所有欄位」自行產生一組值,更不要把 PrivateKey 再複製一次當成 PresharedKey。
- 重新產生用戶端私鑰後,必須同步更新伺服器上對應的用戶端公鑰;通常只修改本機設定無法恢復連線。
- 不同裝置宜使用各自登錄的金鑰與隧道位址。同一組身分同時用於兩部裝置,可能造成伺服器端的對端位址來回變動。
- 提供排查截圖前,請完整遮蔽私鑰與預共享金鑰;勿在公開討論區貼出包含金鑰的完整設定檔。
Endpoint 與 Address:公網入口不等於隧道位址
Endpoint 是建立隧道時首先要連線的伺服器入口。例如 192.0.2.10:51820 中,192.0.2.10 是文件範例位址,51820 是 UDP 連接埠。如果 Shadowrocket 編輯頁面將位址與連接埠分開顯示,請分別填寫,不要將含連接埠的完整字串重複填入位址欄。位址前不需加上 https://,結尾也不要附加網頁路徑。
若 Endpoint 使用網域名稱,該網域必須能先解析,且目前網路必須能連線至對應的 UDP 連接埠。網頁可以開啟或 TCP 連接埠測試成功,都無法證明此 UDP 入口可用。IPv6 合併格式需使用方括號,例如 [2001:db8::10]:51820;若編輯頁面提供獨立的位址欄位,請依欄位格式填寫,不要照搬合併格式中的括號。
| 欄位 | 文件範例 | 不可混用的值 |
|---|---|---|
| Endpoint | 192.0.2.10:51820 | 不可填入本機隧道 Address。 |
| Address | 10.66.0.2/32 | 不可填入伺服器公網入口或家中 Wi-Fi 位址。 |
| AllowedIPs | 0.0.0.0/0, ::/0 | 不可將它當成伺服器位址清單。 |
| DNS | 10.66.0.1 | 只有在現有設定明確提供,且隧道可連通時才使用。 |
Address 是伺服器指派給用戶端的隧道內位址,可能同時包含 IPv4 與 IPv6。請保留服務商提供的前綴長度,例如 /32 或 /128;不要因為家用網路常見 /24 就自行替換。位址衝突、未登錄,或與伺服器允許的範圍不符,都可能導致握手已建立但資料仍無法傳輸。
AllowedIPs、DNS 與 MTU 各自的作用
在 WireGuard 中,AllowedIPs 與 Peer 的隧道位址範圍相關,會影響出站 Peer 選擇與入站來源檢查。0.0.0.0/0 涵蓋所有 IPv4 目標,::/0 涵蓋所有 IPv6 目標;但這不代表伺服器一定提供雙堆疊轉送,也不代表 Shadowrocket 的每個請求都會經由該 WireGuard 連線。用戶端本身的路由模式與設定規則,仍會決定請求採用哪種策略。
DNS 負責將網域名稱解析為位址,隧道則負責傳輸資料。原生設定檔中的 DNS 通常由設定管理程式套用,並非 WireGuard 握手本身的一部分。手動將設定轉填至 Shadowrocket 時,也要確認目前設定中的 DNS 選項;不能只因原始檔案中有一行 DNS,就認定應用程式的解析路徑已一致。
- 只有網域名稱無法連線:若同一目標的位址可正常連線,但網域名稱解析出錯,請先檢查 DNS 請求是否收到回應,以及解析器是否可連線。
- 只有 IPv6 無法連線:請確認 IPv6 Address、
::/0與伺服器端的 IPv6 轉送能力;不要只新增一條範圍,就認定已完整支援 IPv6。 - 握手正常但服務無法使用:請檢查隧道 Address、AllowedIPs 與伺服器端轉送,不要一開始就反覆更換金鑰。
MTU 是隧道介面單次可承載的 IP 封包大小上限。WireGuard 還需要預留外層 IP、UDP 與加密封裝空間;不含其他額外封裝時,IPv4 外層通常約需 60 位元組,IPv6 外層約需 80 位元組。因此,若底層路徑 MTU 為 1500,1420 是常見參考值,但不應視為所有網路或 Shadowrocket 的固定預設值。
優先保留現有設定明確指定的 MTU。若出現小型請求可正常回應,但大型網頁或上傳持續卡住,可先記錄原值,再一次只調整一個變數,例如從 1420 降至 1380,接著重試相同請求。這只是排查路徑 MTU 問題的方法,並非特定網路的實測結論;若降低後沒有改善,請恢復原值並繼續檢查其他層次。
在 Shadowrocket 中新增並驗證
以下步驟以在 Home 手動新增 WireGuard 為主。不同平台的編輯頁面可能會拆分或合併欄位,請依欄位用途對應,而非照搬表單行數。開始前先保存原始設定,完成最基本的連線驗證後,再調整路由、DNS 或 MTU;一次修改太多項目,將難以判斷問題原因。
-
確認原始設定
分別檢視
[Interface]與[Peer],確認包含本機 PrivateKey、Address、伺服器 PublicKey 與 Endpoint。檢查是否有 PresharedKey,不要自行補造缺少的參數。 -
選擇協定
前往 Home → 右上角「+」→ Type → WireGuard。確認目前編輯的是 WireGuard 連線,勿將這些參數填入其他協定類型。
-
填入參數
依本機介面與遠端 Peer 的對應關係填寫。若 Endpoint 分為位址與連接埠兩欄,請分別輸入;完整複製金鑰,並保留 Address 原有的前綴長度。若沒有顯示選填欄位,不要借用其他欄位代填。
-
儲存並選取
儲存後返回 Home,選取剛新增的連線,並記錄 Global Routing 目前的模式。若要暫時排除設定規則的影響,可使用 Proxy 進行單次驗證;測試結束後請恢復原本的日常設定。
-
驗證並記錄
啟動連線,依照系統提示確認 VPN 設定。分別測試網域名稱連線、小型請求與較大內容的載入,並記錄網路類型、錯誤情況及變更項目。若 Settings → On Demand 已設定自動連線條件,排查時也請一併確認,避免影響手動切換。
訂閱中的 WireGuard 項目也要與手動新增的項目區分。更新使用者已有的訂閱後,由遠端管理的項目可能會隨訂閱內容變更;本機的臨時修改不能當成長期設定來源。若更新後無法使用,請先比對 Endpoint、PublicKey、Address 是否已變更,再決定是否需要重新匯入自己的設定。
Global Routing 模式與故障排查
在 Shadowrocket 中,協定參數正確與實際服務請求是否使用這條連線,是兩回事。WireGuard 定義隧道如何建立,Global Routing 與 Config 中的規則則決定請求採用哪條路徑。不要只因為「某個網站能開啟」就認定 WireGuard 已連通,該請求可能使用 DIRECT。
Config
建議依目前啟用設定中的規則選擇策略。規則可將不同請求交由 DIRECT、代理策略或 REJECT 處理;未符合規則的請求則依 FINAL 指定的策略處理,不一定是直接連線。
適用情況:參數驗證完成後,依照現有規則進行日常分流。
Proxy
讓代理路徑使用目前選取的連線,可暫時排除 Config 中業務分流規則的影響。仍須確認選取的是目標 WireGuard 項目,且目前網路能連線至其 UDP Endpoint。
適用情況:短暫確認問題來自 WireGuard 連線或設定規則。
Direct
使用直接連線路徑,作為目前網路的基準對照。此模式下可以成功存取,不代表 WireGuard 的金鑰、伺服器入口或隧道轉送已正常運作。
適用情況:確認目前網路本身能否連線至相同目標。
若使用 Scene,請先確認目前場景實際採用的路由設定,不要把場景名稱當成協定測試結果。在 Config 中,DOMAIN-SUFFIX、IP-CIDR、GEOIP 是不同的比對條件,FINAL 則是最後的備援規則;排查時應確認請求命中了哪種策略,而非只檢查規則檔中是否出現 WireGuard 字樣。
| 觀察到的現象 | 優先檢查 | 下一步處理 |
|---|---|---|
| 沒有成功握手的跡象 | Endpoint、UDP 是否可連線、雙方金鑰及 PresharedKey。 | 若能查看伺服器狀態,請確認握手紀錄;並換用已知可用的網路進行對照。 |
| 已出現握手,但請求逾時 | Address、AllowedIPs、伺服器端轉送與回程路由。 | 確認指派的隧道位址仍有效,再檢查服務請求是否進入目標策略。 |
| 只有網域名稱無法連線 | DNS 回應、解析器可連線狀態與實際 DNS 設定。 | 區分解析逾時、無回應,以及解析成功後的連線失敗。 |
| 小型請求正常,大型內容載入卡住 | 路徑 MTU、封裝額外負擔與網路封包遺失。 | 保留原值後,單獨降低 MTU 進行測試;若未改善則恢復原值。 |
| 切換網路或閒置後失效 | NAT 對應、Endpoint 可連線狀態與自動連線條件。 | 重新建立連線作為對照,再檢查保活設定與 On Demand 條件。 |
排查時每次只變更一個變數,並記錄可重現問題的操作。單次延遲測試結果不能取代握手、DNS 與實際服務驗證;同樣地,連線開關顯示為開啟,也無法證明伺服器已接受目前的金鑰。若要向現有服務商回報,提供發生時間、網路類型、Endpoint 連接埠與錯誤情況即可;請勿在回報內容中公開傳送私鑰或預共享金鑰。