|
|
伺服器架好了,設定檔也拿到了,但手機連上去之後家裡的東西還是打不開。這篇處理的就是這一段。
這篇不教你怎麼架伺服器(本系列另外有專門講那件事的篇章)。這篇假設你手上已經有一份用戶端設定檔 —— 不管它是 wg-easy 產生的、是別人給你的、還是你自己寫的 —— 然後處理接下來的每一件事:
- 那六個欄位各自在做什麼,尤其是最容易被誤解的 `AllowedIPs`
- 全流量和分流怎麼選,而且 `AllowedIPs` 要怎麼算
- iPhone、Android、Windows 各自有什麼、沒有什麼
- 連不上的時候,六層一層一層往下查
全篇會用同一組設定當例子,你只要把數字換成你自己的:
- 家裡的區網 192.168.1.0/24
- 家裡的路由器 192.168.1.1
- Home Assistant 192.168.1.10
- 家裡的 DNS 192.168.1.10(跑 AdGuard Home 或 Pi-hole)
- VPN 的隧道網段 10.8.0.0/24
- 伺服器 10.8.0.1
- 你的手機 10.8.0.2
- 你的筆電 10.8.0.3
- 對外 home.example.com:51820(UDP)
複製代碼
---
步驟 1:看懂設定檔的六個欄位
WireGuard 的用戶端設定就是一個純文字檔,副檔名 `.conf`。長這樣:
- [Interface]
- PrivateKey = KG5xL2...(你的私鑰,42 個字元結尾是 =)
- Address = 10.8.0.2/32
- DNS = 192.168.1.10
- MTU = 1420
- [Peer]
- PublicKey = hT8vQ1...(伺服器的公鑰)
- PresharedKey = 9jXm4...(選配,多一層對稱加密)
- Endpoint = home.example.com:51820
- AllowedIPs = 10.8.0.0/24, 192.168.1.0/24
- PersistentKeepalive = 25
複製代碼
一個一個看
- 欄位 在做什麼 寫錯的症狀
- ------------------------------------------------------------------
- PrivateKey 你的身分。跟你的公鑰成對 握手永遠不會成功,
- 而且看不出原因
- Address 你在隧道裡的 IP。 通了但別人回不了你
- **要寫 /32 不是 /24**
- DNS 連上之後用哪台 DNS IP 連得到但名字打不開
- MTU 每個封包最大幾個位元組 握手成功、ping 通、
- 預設 1420 但網頁打不開(步驟 7 第六層)
- PublicKey 伺服器的公鑰 握手永遠不會成功
- Endpoint 伺服器在哪裡(網域或 IP + 埠) 完全沒有任何封包送出
- AllowedIPs 往下看,這個最重要 各式各樣
- PersistentKeepalive 每 25 秒送一個心跳封包 斷線之後不會自己回來
複製代碼
⚠ `Address` 要寫 `/32`。 寫 `/24` 的話,你的裝置會以為「10.8.0.0/24 這整段跟我直接相連」,於是不會把要送給 10.8.0.1 的封包交給 WireGuard 處理 —— 症狀是隧道看起來連上了,但 ping 伺服器不通。
⚠ `PersistentKeepalive = 25` 不要省。 官方的原話是「25 秒是一個對各式各樣防火牆都有效的合理間隔」。沒有它的話,你的手機從 Wi-Fi 切到行動網路、或者放著沒用十分鐘之後,中間的 NAT 會把對應關係忘掉,伺服器就再也找不到你,直到你主動送出下一個封包。做遠端監控的話這是致命的。
---

步驟 2:AllowedIPs —— 同一個欄位,兩邊的意思不一樣
這是整個 WireGuard 最容易被誤解的地方,而且誤解的後果是「通了但用不了」。
- 在「用戶端」的設定檔裡:
- AllowedIPs = 這些目的地的封包,請走這條隧道
- (等於在你的裝置上加路由)
- 在「伺服器」的設定檔裡(每個 peer 各一份):
- AllowedIPs = 只接受這個 peer 送來、來源 IP 在這個範圍內的封包
- (等於存取控制)
複製代碼
所以伺服器端每個用戶端的 AllowedIPs 一定要寫 `/32`:
- [Peer]
- # 手機
- PublicKey = ...
- AllowedIPs = 10.8.0.2/32 ← 一定要 /32
- [Peer]
- # 筆電
- PublicKey = ...
- AllowedIPs = 10.8.0.3/32 ← 一定要 /32
複製代碼
寫成 `10.8.0.0/24` 的話,第二個 peer 會覆蓋第一個 —— WireGuard 是靠「這個來源 IP 屬於哪個 peer」來決定回信要送給誰的。兩個 peer 宣告同一段,後面那個會搶走全部。症狀是「第二個人連上之後,第一個人就斷了」。
⚠ 用 MikroTik RouterOS 當伺服器的話多注意一件事:它的 WireGuard 預設監聽埠是 13231 不是 51820。照著網路教學填 51820 會完全連不上,而且你會一直去查防火牆。
分流 vs 全流量
這是用戶端 `AllowedIPs` 唯一要做的決定。
- 分流(split tunnel) 全流量(full tunnel)
- ------------------------------------------------------------------
- AllowedIPs 10.8.0.0/24, 0.0.0.0/0, ::/0
- 192.168.1.0/24
- 哪些流量走隧道 只有家裡的 全部
- 上網速度 不受影響 受你家上傳頻寬限制
- 在外面用公用 Wi-Fi 不受保護 受保護
- 是否被偷看
- 家裡的網路被看到 只有你連家裡時 所有網站都看到你家的 IP
- 的來源 IP
- 手機耗電 低 高
- 適合 日常長時間掛著 公用 Wi-Fi、飯店、
- 需要台灣 IP 的服務
複製代碼
建議:手機上建兩份設定,日常用分流,在外面接公用 Wi-Fi 時切到全流量。兩份可以共用同一把金鑰,只有 `AllowedIPs` 那一行不一樣。
分流的 AllowedIPs 怎麼算
把你要從外面存取的網段全部列出來,隧道網段本身也要列:
- AllowedIPs = 10.8.0.0/24, 192.168.1.0/24
複製代碼
有多個 VLAN 的話一段一段加:
- AllowedIPs = 10.8.0.0/24, 192.168.1.0/24, 192.168.20.0/24, 192.168.30.0/24
複製代碼
只要存取一台機器的話可以更緊:
- AllowedIPs = 10.8.0.0/24, 192.168.1.10/32
複製代碼
⚠ 一個非常常見的失敗:只寫 `192.168.1.0/24` 而漏掉 `10.8.0.0/24`。症狀是家裡的東西都連得到,但 ping 不到伺服器本身,而且伺服器上跑的服務(例如 wg-easy 的網頁介面)也打不開。
全流量的兩個版本
- 最簡單:
- AllowedIPs = 0.0.0.0/0, ::/0
- 排除私有網段(Windows / Android 的勾選框會自動產生):
- AllowedIPs = 0.0.0.0/5, 8.0.0.0/7, 11.0.0.0/8, 12.0.0.0/6, ...
- (一長串,這是把 10/8、172.16/12、192.168/16 等
- 從 0.0.0.0/0 裡「減掉」之後的結果)
複製代碼
「排除私有網段」是做什麼用的:讓你在走全流量的同時,還能連到你人在的那個地方的區網(飯店的印表機、咖啡廳的網路認證頁)。
⚠ 但它跟 WireGuard 最大的坑撞在一起:如果你人在的那個地方,區網剛好也是 `192.168.1.0/24`(這在台灣極常見,中華電信的數據機預設就是),那你永遠連不到家裡的 192.168.1.10 —— 你的裝置會認為那是本地的機器。
解法只有一個:把家裡的網段改掉。 改成 `192.168.77.0/24`、`10.20.30.0/24` 這種沒人用的。這件事要在架 VPN 之前先做,改完家裡所有裝置的 IP 都會變。
---
步驟 3:三個平台的實際操作
先決定金鑰在哪裡產生
- 伺服器幫你產生(wg-easy 這類工具的做法)—— 你會拿到一個 QR code 或一個 `.conf` 檔,直接匯入。缺點是你的私鑰曾經存在伺服器上
- 在裝置上產生 —— 三個平台的 App 都可以在新增隧道時按「產生金鑰對」,然後你只要把公鑰交給伺服器管理員。私鑰從頭到尾沒離開過你的裝置
Linux / macOS 上手動產一對:
- wg genkey | tee private.key | wg pubkey > public.key
- cat private.key
- cat public.key
複製代碼
你會看到什麼:兩串 44 個字元、結尾是 `=` 的 Base64 字串。
iPhone / iPad
- App Store 搜 WireGuard(發行者是 WireGuard Development Team,免費、沒有廣告)
- 右上角 + → 從 QR code 掃描 或 從檔案或封存匯入 或 從頭開始建立
- 第一次啟用時 iOS 會跳出「WireGuard 想要加入 VPN 設定」,按允許
你會看到什麼:隧道清單裡出現一個項目,右邊有一個開關。打開之後手機狀態列會出現 VPN 的字樣。
⚠ iOS 沒有「排除私有網段」的勾選框。 要做那件事只能自己把那一長串 AllowedIPs 貼進去。
Android
- Google Play 搜 WireGuard
- 右下角 + → 掃描 QR code / 從檔案匯入 / 從頭建立
- 編輯隧道時,Peer 那一段有一個 Exclude private IPs 勾選框 —— 勾下去它會自動把那一長串算好填進 AllowedIPs
Windows
- 去 wireguard.com 下載官方的 Windows 版(現行穩定版是 1.0.20260223)
- 左下角「新增隧道」→ 從檔案匯入,或者「新增空白隧道」(它會自動幫你產金鑰對)
- 匯入之後按「啟用」
Windows 版獨有的兩個勾選框:
- Block untunneled traffic(kill-switch) —— 隧道斷掉時直接切斷所有網路,避免 IP 外洩。只有在 AllowedIPs 是 `0.0.0.0/0, ::/0` 的時候才能勾;勾了「排除私有網段」之後 AllowedIPs 會變成一長串,這個選項就會變灰
- On-Demand(隨需啟用) —— 可以設定「乙太網路或 Wi-Fi 一連上就自動啟用」
三個平台的差異整理
- Windows Android iOS
- ------------------------------------------------------------------
- 排除私有網段的勾選框 有 有 沒有
- kill-switch 有(真的擋) 系統的「一律開啟 只能靠按需啟用,
- VPN」 沒有真正的阻斷
- 按需啟用 有(依網路介面) 靠系統的一律開啟 有(依 SSID
- 或行動網路)
複製代碼
---
步驟 4:DNS —— 這是「IP 通了但名字打不開」的原因
`DNS = 192.168.1.10` 這一行在做什麼:隧道啟用時,把你裝置的 DNS 伺服器換成家裡那一台。
好處:
- 你可以用 `ha.home.lan` 這種內部名稱連回家,而不是背 IP
- 家裡如果跑 AdGuard Home 或 Pi-hole,在外面上網也會擋廣告
代價:
|
|