關於 Wireguard 在 Linux 上的連接方式

感覺這東西之前好像根其他人講過很多次,所以寫篇文章節省時間

wg-quick

我想大多數人第一時間想到的方式就是wg-quick了,不過我個人其實不太喜歡這個方式。

wg-quick最大的好處就是簡單,只要wg-quick up一行指令連線就成功了

不過有一點讓人困擾的是它會使用設定檔內的AllowedIPs作為設定的路由,像 NetworkManager 之類的方式也是如此,因此我個人覺得這種方式比較適合作為終端的連線方式,只需要連線單一 VPN 來連入一個網路的狀況。

為什麼我不喜歡用AllowedIPs設定路由

AllowedIPs 其實只是限制 wireguard 這個 tunnel 內允許通過的 IP destination,其實可以設定AllowedIPs = 0.0.0.0/0,但只將部分網路路由過去。

但是當同時連接多個 WireGuard interface、連接多個網路時,如果使用wg-quick這樣的工具,他就會把0.0.0.0/0當成路由來設定,多個介面就會發生衝突,導致全部無法連線,只能透過限縮AllowedIPs來解決。

這個方法雖然可以解決問題,不過我不太喜歡這種方式

關於wg-quickAllowedIPs = 0.0.0.0/0時的行為

如果用過AllowedIPs = 0.0.0.0/0的設定檔,可能會注意到主路由表並沒有任何更動。

這是因為wg-quickAllowedIPs = 0.0.0.0/0時的啟動方式會略有不同

它在使用wg set套用設定檔時會加上一個 fwmark 0xca6c,讓這個 wireguard 連線的封包都加上這個 fwmark

並且加上一條 ip rule,32765: not from all fwmark 0xca6c lookup 51820,只要不是帶有 0xca6c 這個 fwmark 的封包都會 lookup table 51820,而 table 51820 就是放著讓所有封包都通過 wireguard interface 的路由

Manual

另一種方式就是手動設定了,這部分可以直接參考 WireGuard 官網的 Quick Start 的 Command-line Interface 這個區段

簡單來說就是使用ip這個指令先建立一個 interface,並加上 IP,然後用wg這個指令將設定檔套用到這個介面上,然後啟用這個介面就完成了

當然,也可以把這一系列操作寫成腳本,開機自啟動之類的,不過在我的 Debian router 上,我會喜歡把他寫進ifupdown的設定裡,這樣可以和其他介面配置方式整合在一起,更方便管理

具體大概類似這樣,$IFACE會被ifupdown自動替換成介面名稱,只要把介面名稱對應的設定檔放在 /etc/wireguard 目錄下即可,並且也可以直接設定一些路由在這裡

/etc/network/interfaces

1
2
3
4
5
6
7
auto wg-interface
iface wg-interface inet6 static
address x.x.x.x/x
pre-up ip link add $IFACE type wireguard
pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
up ip -4 route add x.x.x.x/x dev $IFACE
post-down ip link del $IFACE

關於 Wireguard 在 Linux 上的連接方式
https://www.zenwen.eu.org/about-wireguard-connect-methods-on-linux/
作者
Zen Wen
發布於
2026年4月30日
許可協議