OpenWrt 建置 WireGuard

版上已經有一篇了,不過是 iStoreOS 版本,想說記錄一篇官方 25.12.5 版本

我的網路是浮動 IP,假設已經設定好 DDNS,使用的是 deSEC


首先安裝套件,【系統 - Software】按 Update lists... 更新列表,如圖

OpenWrt 建置 WireGuard

安裝完成後,【系統 - 重新啟動】執行重新啟動,重開機後就會認得 WireGuard 協定

接著到【網路 - 介面】
新增介面
OpenWrt 建置 WireGuard
一般設定
OpenWrt 建置 WireGuard
進階設定
OpenWrt 建置 WireGuard
防火牆設定
OpenWrt 建置 WireGuard
對等點
OpenWrt 建置 WireGuard
編輯對等點
OpenWrt 建置 WireGuard


一般設定
  1. 產生新的金鑰對,生成公鑰與私鑰
  2. 監聽連接埠,這邊選擇預設的 51820
  3. IP 位址,填入 VPN 網段,這裡選 10.14.0.1/24,不勾選無主機路由,openwrt 會新增這個網段路由,我們需要使用它與 Peer 溝通
進階設定

 不勾選使用預設閘道,我們上網是靠 wan

防火牆設定

 在 --自訂-- 處輸入名稱 wireguard,按 Enter

編輯對等點
  1. 輸入端點的名稱
  2. 產生新的金鑰對,生成公鑰與私鑰
  3. 產生預先共用金鑰,PresharedKey (PSK),可以加強連線安全
  4. 允許的 IP,填入端點的位址 10.14.0.99/32
  5. 路由允許的 IP,如果有其他允許的 IP 網段,勾選建立路由
 如果有安裝套件 qrencode / luci-lib-uqr,按產生配置可以直接掃描
 最後儲存 -> 儲存並應用,建立 wg0 介面

OpenWrt 建置 WireGuard
一般設定
OpenWrt 建置 WireGuard
編輯區域
OpenWrt 建置 WireGuard
Traffic Rules
OpenWrt 建置 WireGuard
編輯規則
OpenWrt 建置 WireGuard


【網路 - 防火牆 - 一般設定】
  1. 輸出輸入都選 accept,讓路由器能從這個 zone 連出,Peer 也能連入
  2. wireguard 要去其他區網或外網,就勾選 Allow forward to destination zones
    wireguard 要允許其他區網通過,就勾選 Allow forward from source zones
  3. 勾選 MSS clamping
  4. 勾選 IPv4 Masquerading,如果區網要訪問 Peer,可偽裝源位址為 wg0 IP,對端就能認得回來的路

【網路 - 防火牆 - Traffic Rules】

 如圖設定接受外網連入,這樣才能建立 VPN 連線


OpenWrt 建置 WireGuard

最後把設定貼到客戶端軟體,就可以連線了

[Interface]
貼 Server 新增的對等點資訊

[Peer]
貼 Server 的資訊,其中 PresharedKey 是在對等點中產生的,每個客戶端都會有一個預先共用金鑰。AllowedIPs 是 Peer 負責的網段,假如有很多 Peers,WireGuard 會判斷哪個網段該走哪個 Peer 並幫我們傳送,我們要做的是在主機把該網段的流量路由到 WireGuard,不過 Windows 客戶端軟體已經幫我們把這步做好了,不用自己來



socket: improve reply-to-src algorithm
We store the destination IP of incoming packets as the source IP of
outgoing packets. When we send outgoing packets, we then ask the routing
table..... If not, we fall back to the default IP address.

WireGuard 收到連線時,會記住連入的目標 IP,並嘗試用它當回應的來源 IP
但有一個例外,當他架在路由器上,如果我們在區網想跟他連線,用外網 IP,他沒辦法用外網 IP 回應,會根據路由表決定源位址來回應,所以你連他 (192.168.1.100, x.y.z.w) 他會回你 (192.168.1.1, 192.168.1.100),連線會成功,WireGuard 接受這種情形。但這樣有兩個問題,有些防毒軟體的防火牆如 ESET,會阻擋這種連線,連線就會失敗,再來就是,如果在第二層子路由器連他,也會有問題,因為區網電腦會收不到回應。

像是這樣:
(192.168.8.180,IP) -> (192.168.2.220,IP) -> 主路由器收到然後回應
(192.168.2.1,192.168.2.220) -> 子路由器收到無法回應給 192.168.8.180
我們希望這樣:
(192.168.8.180,IP) -> (192.168.2.220,IP) -> (192.168.2.220,192.168.2.1)
(192.168.2.1,192.168.2.220) -> (IP,192.168.2.220) -> (IP,192.168.8.180)

為了讓多層子路由器仍然可以連線成功,需要在主路由器把它改為內網位址,可以用 DNS 轉換,可以用 Port Forwards 轉換,這裡就看看連接埠轉發:

圖1
OpenWrt 建置 WireGuard
圖2
OpenWrt 建置 WireGuard
圖3
OpenWrt 建置 WireGuard
圖4
OpenWrt 建置 WireGuard


這個轉發會做兩件事,看圖4

1) 他把外網進來的連線目標 IP 改寫為 lan IP
2) 他設定一個 reflection,把 lan 進來的連線,目標為 wan IP 的改寫為 lan IP

我們需要第二條,因為目標位址被改為 lan IP,WireGuard 回應時會是 (lan IP, client IP),然後因為第二條 un-NAT 回 (wan IP, client IP),這樣子路由器收到後,就會繼續 un-NAT,然後回傳給客戶端,不管幾層都可以連線。

按理說我們不需要第一條,但 LuCI 會買一送一,無法拒絕。



2026-08-07 19:03 發佈
客戶端的設置


新增介面
一般設定
進階設定
對等點
編輯對等點

編輯對等點 (其他跟之前差不多)
  1. 輸入端點的名稱
  2. 產生新的金鑰對,生成公鑰與私鑰
  3. 產生預共享金鑰,誰來產生都可以,連線兩端用一樣的值就好
  4. 端點連接埠,51820
  5. 持續保持連線,25 (PersistentKeepalive)
 設定持續保持連線,因為我們在 NAT 後面,要主動發出連線訊號,這樣對方才能
 跟我們通訊,否則在我們送出第一個訊號前,對方會無法主動與我們通訊及 ping
 這個設定會保持防火牆連線狀態,否則時間久了這問題會再次發生


一般設定
編輯區域

【網路 - 防火牆 - 一般設定】

 依自己需要設定,以上圖為例:
  • Output: accept,允許路由器透過 wg1 連出去
  • Input: reject,拒絕其他 wireguard 端點連進來
  • Intra zone forward: reject,拒絕區域內網路間的轉發
  • Allow forward from source zones: lan,允許區網從 wg1 連到其他 Peer
  • Allow forward to destination zones: 未指定,Peer 進入不能轉發到區網或外網

路由
一般設定

【網路 - 路由】

 設定 linux 交給 wg1 的網段,之後會由 AllowedIPs 機制送給正確的 peer
 這邊是個別設定,也可以在前面編輯對等點的時候勾選 - 路由允許的 IP
 差別只是自己個別設定,或一個勾全部項目都幫你設定





【系統 - 排程任務】

 最後在一開始安裝的套件 wireguard-tools,裡面有一個 wireguard_watchdog
 要如上圖設定,因為我連接的目標是浮動 IP,靠 DDNS 解析,中華電信每 3 天
 還是多久會重設一次 IP,這樣 wireguard 就會失去通訊,這個看門狗可以重新
 解析 DDNS,並且更新 Peer IP,這樣通訊就不會中斷


內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?