CentOS Stream 8 與 WireGuard

由於已事隔快要一年,看起來狀態並沒有什麼變化,所以或許是時候說明一下狀況,以及可行的應對方式。在目前 Red Hat 生態體系的各個 Linux 發行版裡,倘若要實現 WireGuard 支援,則 CentOS Stream 8(以下簡稱 CS8)可能是當中最不簡便的一款發行版。而背後的因素,其實也連帶影響了下游的 RHEL 8 及其複製品(AlmaLinux 8Rocky Linux 8 等等),只是就時序而言,下游的處境可能會稍微好一點。

 

事件的起頭是 WireGuard 的維護者放棄將 CS8 納入到 CI 測試裡,因為 CS8/RHEL 8 的 Linux 內核存在一些 Red Hat 開發者並不打算修正的問題(見 The Future of RHEL7,8 Support in WireGuard)。這因此使得 WireGuard 專案本身不再追蹤及處理 CS8/RHEL 8 內核版本更動後、所可能產生的相容性問題。而使用者開始察覺到狀況,大概是從 CS8 在 2022 年 6 月發佈了 kernel-4.18.0-394 套件後。倘若是利用 DKMS 來自動編譯 wireguard 模組的使用者,會發現已無法順利在此內核版本下執行編譯及安裝。

 

至於 RHEL 7、9 這兩個發行版世代的 WireGuard 支援情形,相較之下就沒有這樣的問題。因為前者已經算是後期維護狀態,其內核已經不太有機會再出現大幅變動,也就不會破壞 WireGuard 的相容性;後者則是使用的內核版本直接內建 WireGuard,使用者已無須再自行安裝模組。

 

雖然首當其衝的是 CS8,然而由於 CS8 的內核更動最終也會進入到 RHEL 8(及其複製品)裡,所以影響層面實際上是會擴大的。所幸只需要在 WireGuard 原始碼裡做很小的調整,就能夠修正當前的編譯錯誤。倘若使用者並非是自行編譯 wireguard 模組,而是使用諸如 ELRepo 或者 CentOS Kmods SIG 等套件庫來源,就會需要仰賴套件的維護者釋出相應的更新。

 

DR 手上有幾部 CS8 主機,起初在建置 WireGuard VPN 時,都是透過 DKMS來編譯及安裝模組。後來在開始出現編譯失敗時,便索性自行在 GitHub 上建了一個分支來保存微調過的原始碼。在進行模組安裝之前,系統上預先應安裝的套件及服務如下:

  • sudo dnf install epel-release
  • sudo dnf install git dkms wireguard-tools
  • sudo systemctl enable dkms
  • sudo systemctl start dkms

 

接著以下步驟便是從分支下載原始碼,並透過 DKMS 執行安裝:

  • git clone https://github.com/darkranger-red/wireguard-linux-compat.git
  • cd wireguard-linux-compat/src
  • sudo make dkms-install
  • sudo mv /usr/src/wireguard /usr/src/wireguard-1.0.20220627
  • sudo dkms install -m wireguard -v 1.0.20220627

 

完成前述步驟後,DKMS 應會在每次安裝內核套件、或者在系統啟動時檢查模組是否存在,並在需要時進行編譯。也可以利用諸如以下指令,為指定的內核版本安裝 wireguard 模組:

  • sudo dkms install wireguard/1.0.20220627 -k 4.18.0-483.el8.x86_64

 

倘若欲確認模組安裝狀態,則可以執行以下指令:

  • dkms status
  • modinfo wireguard

 

分類: