WireGuard 可以用來建立安全的點對點的連線。INRIA 的研究人員於 2019 五月發表了對於該協議的一份機器證明。
We contribute proofs for correctness, message secrecy, forward secrecy, mutual authentication, session uniqueness, and resistance against key compromise impersonation, identity mis-binding, and replay attacks.
更換了實驗室以後,同時也喪失了連線到教育網 IPv6 的能力,只能在寢室、或者是使用機房伺服器訪問,非常不方便。於是想透過 WireGuard 建立一個從實驗室電腦到機房伺服器的隧道,實現在實驗室電腦上也能訪問公網 IPv6。
安裝
實驗室電腦是 Arch Linux,核心使用的是官方核心,因此裝好 wireguard-tools
和 wireguard-arch
即可。(更新:如果使用較新的核心, wireguard 模組預設已被啟用,則不再需要安裝 DKMS 核心模組,但如果是使用的其他版本的核心,則還可能需要安裝對應版本的軟體包)
在 Ubuntu 上則需要自己新增相應的源再安裝:
|
|
配置
配置的方法網路上已經有很多教程,比如 WireGuard 的官方教程,Linode 的教程和 Arch Linux Wiki 上的教程,都比較靠譜,並且大同小異。
另外,如果沒有裝 linux-headers
的話,在 ip link add dev wg0 type wireguard
時會報 Error: Unknown device type.
錯誤,務必裝上自己核心版本對應的 headers 。
(更新:接前文更新,如果不再需要安裝 DKMS 的 wireguard 核心模組,則安裝核心標頭檔案也是不必須的)
原生配置檔案中的欄位副作用
一個教訓是:Peers
塊中的 AllowedIPs
不能隨意設定。
- 如果是 Server 端的配置,需要允許擁有對應公鑰的裝置 IP ,並且設定好掩碼。
- 如果是 Client 端的配置,看情況配置:
- 只是為了異地組網,把不同機器連起來,則只需要填入該子網的 IP 段
- 想要訪問內(外)網路,Server 在內(外)網,則需要將要訪問的對應的內(外)網 IP 段填入。
- 經典的配置就是
0.0.0.0/0 , ::/0
,本機上所有流量都被轉發給伺服器了。(伺服器作為一個 VPN Server) - 如果想在外地連入校內網,則可以寫
10.0.0.0/8
。
- 經典的配置就是
AllowIPs
這個欄位通常彷彿都是人畜無害的(只是來個流量再判斷一下 IP 決定是否 drop 嘛)。但是在 WireGuard 上是有副作用的:它會新增路由,以便能夠使用 WireGuard 建立的那個網路。
所以,想象一下,如果在 Server 上設定了 AllowedIPs = 0.0.0.0, ::/0
,會發生什麼?
答案
- 如果沒有別的網絡卡,伺服器上的幾乎所有區域網 IPv4 流量都會透過 wg。
- 而此時,大機率已經無法連線到該伺服器了。
您好!我想借用一下機房的鑰匙。
最終配置檔案
|
|
|
|
最後終於:
Bonus: 遷移到 Systemd
後來我逐漸將自己的網路配置完全遷移到 systemd-networkd
,根據 Arch Linux 優秀的文件,需要兩個檔案來配置 wireguard 連線。
其中 .netdev
檔案用於設定網路裝置,.network
用於配置路由等(此時 .netdev
中的 AllowedIPs
欄位終於幾乎對本機網路沒有副作用了,很合理)。摘錄如下。
|
|
更詳細的說明可參閱文件。