Raspberry Pi 與 WireGuard 應用
10/10/2021 更新:
本文的原始碼編譯流程已無必要性,因為目前 Raspbian 10 官方套件庫已經有收納更新的 Linux 內核版本,在升級內核後,已無須再另外編譯及安裝 wireguard 模組。以及套件庫內已收納 wg 工具,即便是初代 Raspberry Pi 也可單純使用 APT 安裝:
- sudo apt install wireguard-tools
近期因設備管理因素,可能需要從外部監控特定場域的網路對外連通性,以及在必要時能夠透過 Wake-on-LAN 啟動區網中的特定主機。這些場域並沒有伺服器的存在,為一般用戶環境。雖然乍聽之下,似乎是挑一台電腦保持上線,再隨便弄一個遠端控制途徑就可以了,但這實在是不怎麼節能又醜陋。於是想了一下,歪腦筋動到庫存裡一顆從來沒用過的 Raspberry Pi(初代,Model B Rev 2)。
所設想的方案同時保障了可攜性與延展性。當 Raspberry Pi 開機並預設以 DHCP 接上網路後,便自動以 WireGuard 接上某外部 VPN 通道。如此一來,連接至相同 VPN 的任一裝置都能夠查看它的狀態及進行登入,並且擁有一個完整的作業系統來執行各種遠端操作。
DR 在 Raspberry Pi 裡所置入的 Linux 發行版是官方的 Raspbian Buster Lite,而常見的 WireGuard 安裝方式(例如 Installing and Configuring WireGuard on Raspbian Buster 一文的說明),是加入 Debian 的套件庫來源來進行安裝。然而 Raspberry Pi 初代是 ARMv6 架構,Debian armhf 套件庫則是 ARMv7。儘管 wireguard 模組仍可以按此方式完成自動編譯,但預先編譯的 wg 工具則由於架構不相容,執行時會出現 Segmentation fault 錯誤。
所以針對初代 Raspberry Pi 的情形,應該是統一以原始碼編譯方式來安裝 wireguard 及 wireguard-tools 最為單純。安裝流程如下所示:
- sudo apt update
- sudo apt-get install raspberrypi-kernel-headers libmnl-dev libelf-dev build-essential git
- git clone https://git.zx2c4.com/wireguard-linux-compat
- git clone https://git.zx2c4.com/wireguard-tools
- make -C wireguard-linux-compat/src
- sudo make -C wireguard-linux-compat/src install
- make -C wireguard-tools/src
- sudo make -C wireguard-tools/src install
關於 WireGuard 的設定方式已在本站的 How-To 文件裡有些說明。至於針對本次需求,少部份的設定相異之處,是在端點無須透過 VPN 對外連線的情況下,則 AllowedIPs 可以單純指定為虛擬位址的網段;以及加入 PersistentKeepalive,以便確保端點在長時間閒置下仍可以保持 VPN 接通,設定值列舉如下:
AllowedIPs = 10.9.0.0/24
PersistentKeepalive = 25
上圖為正在測試中的 Raspberry Pi。看著看著有點唏噓,因為它的電源、microSD 及網路線都是從已退役的 Nokia N900 拿來的啊。