關於 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-quick在AllowedIPs = 0.0.0.0/0時的行為
如果用過AllowedIPs = 0.0.0.0/0的設定檔,可能會注意到主路由表並沒有任何更動。
這是因為wg-quick在AllowedIPs = 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 | |