How-To:Linux 架設 WireGuard 伺服器

操作環境:

  • 伺服端:CentOS 7.7
  • 客戶端:Fedora 30

 

WireGuard 是一款著重於高效能、實作簡化及低攻擊面的 VPN 方案,它是以 Linux 內核模組的形式運作,但另有以 Go 語言實作的跨平台版本(wireguard-go)。WireGuard 的設計其實並無伺服端(server)與客戶端(client)的分野,兩個端點(peer)可以用完全相等的設定方式來建立彼此之間的安全連線。不過本文流程還是會刻意將其中一部主機(CentOS)視為伺服端,以服務的形式來管理 WireGuard;另一部主機(Fedora)則會表現得更像是一般的客戶端,並且透過伺服端來轉發連線。

 

WireGuard 已合併至 Linux 內核 5.6 以後的版本,至於較舊的內核版本則需要再安裝相應的模組(wireguard-linux-compat)。本文多數操作指令會需要 root 權限,可利用 sudo 或以其它途徑來達成,後續不再特別贅述。

 

1.1 安裝 WireGuard 模組及相關工具

CentOS 7.x 的安裝指令如下:

  • yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
  • yum install yum-plugin-elrepo
  • yum install kmod-wireguard wireguard-tools

 

Fedora 30 的安裝指令如下:

  • dnf copr enable jdoss/wireguard
  • dnf install wireguard-dkms wireguard-tools

 

由於 RHEL/CentOS 的官方內核更新並不會破壞 ABI 相容性,因此適合使用已編譯好的 kmod-wireguard 套件。至於在安裝 wireguard-dkms 套件時,則會自動為當前的內核版本編譯 wireguard 模組,因此應確認是否有安裝吻合的 kernel-devel 套件以確保編譯成功。

 

1.2 建立私鑰與公鑰

有點類似於 SSH 的概念,WireGuard 最基本的安全機制,是每一個端點都應該有自己一組獨特的私鑰及公鑰,私鑰寫入在本地端的設定檔裡,公鑰則寫入到目標端的設定檔裡。可使用 wg 工具來產生私鑰及公鑰,在伺服端及客戶端上各做一次以下操作:

  • umask 077; wg genkey | tee privatekey | wg pubkey > publickey

 

前述指令會產生 privatekey 及 publickey 這兩支文字檔,其內容就分別是私鑰及公鑰的字串。本文後續步驟會示範如何填入到設定檔裡,在完成填入後文字檔便無須保留,可自行刪除或另外找地方存放。

 

2.1 建立伺服端設定檔

於伺服端上執行以下步驟:

  • mkdir -p /etc/wireguard/
  • vim /etc/wireguard/wg0.conf

 

在 wg0.conf 裡寫入以下內容:

[Interface]
Address = 10.9.0.1/24
ListenPort = 25034
PrivateKey = <伺服端私鑰>

[Peer]
PublicKey = <客戶端公鑰>
AllowedIPs = 10.9.0.2/32

 

以上是將伺服端的虛擬網路位址指定為 10.9.0.1,監聽連接埠為 25034,以及客戶端虛擬位址為 10.9.0.2,這些都是可以自行決定的項目。此外也可以加入多個 [Peer] 區塊,並以不同的公鑰及虛擬位址來作為區隔。

 

2.2 伺服端上的網路與防火牆設定

首先啟用封包轉遞,編輯 /etc/sysctl.conf,並加入以下內容:

net.ipv4.ip_forward = 1

 

然後使其生效:

  • sysctl -p

 

接著,使用 firewall-cmd 來啟用 IP 偽裝及放行 UDP 25034 連接埠:

  • firewall-cmd --zone=public --add-port=25034/udp --permanent
  • firewall-cmd --zone=public --add-masquerade --permanent
  • firewall-cmd --reload

 

2.3 以服務形式啟動 WireGuard

  • systemctl enable wg-quick@wg0
  • systemctl start wg-quick@wg0

 

此服務會背景執行 wg-quick 工具以啟動 WireGuard 網路介面。倘若未執行成功,可利用以下指令檢視錯誤訊息以進行進一步的排查:

  • systemctl status wg-quick@wg0 -l

 

3.1 建立客戶端設定檔

同樣是建立一支名為 wg0.conf 的檔案,但路徑不拘。設定內容與先前的伺服端設定檔相呼應,如下所示:

[Interface]
Address = 10.9.0.2/24
PrivateKey = <客戶端私鑰>

[Peer]
PublicKey = <伺服端公鑰>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <伺服端實際 IP 位址>:25034

 

3.2 啟動或關閉客戶端 WireGuard 連線

在 wg0.conf 所在的目錄下,執行 wg-quick 指令便能夠啟動或關閉 WireGuard 連線:

  • wg-quick up ./wg0.conf
  • wg-quick down ./wg0.conf

 

4.1 連線狀態檢查

在前述的操作流程裡,伺服端與客戶端最終都會啟動一個名為 wg0 的網路介面,可以用 ifconfig 等工具來查看。或者是單純地執行 wg 指令,也會顯示當前的 WireGuard 狀態。

 

4.2 其它參考資料