如何在 Debian 12 設定 WireGuard 點對點 VPN 伺服器

在 Debian 12 (Bookworm) 上使用 WireGuard 點對點 VPN 是一種實用的方法,可以讓筆記型電腦、手機或遠端工作站連接到伺服器或透過伺服器路由流量。首先需要澄清一點:WireGuard 沒有特殊的「伺服器模式」。每個參與者都是對等節點。在點對點架構中,一台 Debian 主機充當穩定且可公開存取的中心節點,每個遠端設備都擁有自己的金鑰對和隧道位址。

本指南使用 Debian 隨附的 WireGuard 工具、wg-quickIPv4 連接埠轉送和 nftables。它假設 Debian 伺服器擁有 root 或 sudo 權限,並且51820可以透過該 UDP 連接埠存取。如果伺服器位於家庭或辦公室路由器之後,則必須將該 UDP 連接埠轉送至 Debian 主機。如果 ISP 使用電信商級 NAT (CGNAT),則普通的路由器連接埠轉送可能不夠;在對 WireGuard 本身進行故障排除之前,請確認您確實擁有一個可存取的公網位址。

這種配置會產生什麼效果?

範例 VPN 使用10.8.0.0/24。伺服器是10.8.0.1,第一個客戶端是10.8.0.2。用戶端可以設定為全隧道 VPN,其中 IPv4 互聯網流量透過 Debian 伺服器發出,或配置為分離隧道,其中只有選定的私有網路使用 WireGuard。

Debian 官方的 WireGuard 文件確認 WireGuard 可透過發行版軟體包取得,而官方的 WireGuard 快速入門指南則介紹了金鑰產生wg-quick以及可選的持久化 keepalive 功能。請參閱Debian WireGuard 文件、官方 WireGuard 快速入門指南以及 Debian 的wg-quick 手冊頁。

步驟 1:安裝 WireGuard 和 nftables

更新軟體包元數據,然後安裝 WireGuard 和 nftables:

sudo apt update
sudo apt install wireguard nftables

人們普遍誤解 Debian 12 需要一個外部的 WireGuard 核心模組。其實不然。 WireGuard 已經整合在 Linux 核心中多年;Debian 的軟體包提供了您所需的使用者空間管理工具。建議:使用 Debian 軟體包,而不是下載未經驗證的安裝腳本。

Debian 終端使用 apt 安裝 wireguard 和 nftables 軟體包。
在建立隧道設定之前,請從 Debian 的軟體包儲存庫安裝 WireGuard 和 nftables。

步驟 2:產生伺服器金鑰對

建立具有限制性權限的關鍵檔案:

sudo -i
install -d -m 700 /etc/wireguard
umask 077
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
chmod 600 /etc/wireguard/server_private.key
cat /etc/wireguard/server_public.key

私鑰必須保密。公鑰才是你需要複製到客戶端設定的金鑰。理想情況下,應該在每個客戶端上產生私鑰,而不是在伺服器上產生。這樣,伺服器就永遠不需要持有客戶端的私鑰。

Debian 終端機顯示了 WireGuard 金鑰產生指令和衍生的公鑰
使用嚴格的檔案權限產生 Debian 伺服器的 WireGuard 私鑰並匯出其公鑰。

步驟三:啟用 IPv4 轉送

VPN隧道可能成功建立,但路由流量仍然失敗。原因是Linux IP轉送是獨立於WireGuard本身的核心設定。建立一個持久的sysctl檔案:

echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
sysctl net.ipv4.ip_forward

最後一條命令應該會報告結果net.ipv4.ip_forward = 1。 Debian 核心文件將其描述ip_forward為啟用 IPv4 封包轉送的開關。操作:明確驗證此值,而不是假設隧道介面會自動啟用路由。請參閱Debian ip(7) 手冊和sysctl.conf 文件。

Debian 終端機顯示 sysctl 設定檔中 net.ipv4.ip_forward 設定為 1
啟用 IPv4 轉發,以便 Debian 可以在 WireGuard 介面和其他網路之間路由封包。

步驟 4:建立伺服器配置

讀取伺服器私鑰,然後建立/etc/wireguard/wg0.conf:

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32

然後保護文件:

sudo chmod 600 /etc/wireguard/wg0.conf

AllowedIPs人們常常誤解它只是一個防火牆式的允許清單。它還控制路由。在伺服器端,將位址指派10.8.0.2/32給此對等體,就告訴 WireGuard,傳送往該隧道位址的封包屬於此用戶端。為每個客戶端分配一個唯一的位址和一個單獨的[Peer]位址區塊。

SaveConfig = true另一個有用的選擇是,如果您打算手動管理此文件,則可以省略此選項。使用此選項SaveConfig,wg-quick可以在關機時將即時狀態寫回配置,這可能會覆蓋手動編輯的內容。操作:除非您明確希望儲存即時狀態,否則請保持檔案聲明式。

Debian 終端機顯示了 wg0.conf 伺服器配置,其中包含一個 WireGuard 介面和一個對等節點。
建立伺服器端 wg0.conf 文件,其中包含隧道位址、UDP 監聽連接埠、伺服器私鑰和一個客戶端對等體。

步驟 5:設定 nftables 偽裝

如果全隧道用戶端需要透過 Debian 伺服器存取互聯網,最簡單的方案是 IPv4 位址偽裝。首先確定伺服器的出站介面:

ip route get 1.1.1.1

尋找後面的接口dev,例如eth0,ens3或enp1s0。不要假設它總是eth0。

如果您已經維護了/etc/nftables.confNAT 表,請將其合併到您現有的規則集中,而不是取代該檔案:

table ip wireguard-nat {
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        oifname "eth0" ip saddr 10.8.0.0/24 masquerade
    }
}

請替換eth0為實際的出站介面。加載前請進行驗證:

sudo nft -c -f /etc/nftables.conf
sudo systemctl enable --now nftables
sudo nft list ruleset

WireGuard 本身並不會強制要求使用 NAT。如果目標 LAN 已有返回伺服器的路由10.8.0.0/24,則無需進行位址偽裝即可實現路由存取。 NAT 的主要作用在於,當您希望遠端用戶端使用伺服器現有的 Internet 路由,且您無法控制其他位置的回傳路由。建議:對於簡單的 Internet 出口場景,請使用位址偽裝;如果您控制網路並希望保留來源位址,則建議使用明確路由。

Debian 系統上的 GNU nano 編輯器顯示了 WireGuard 子網路的 nftables 路由後偽裝規則
為 10.8.0.0/24 新增專用的 nftables NAT 規則,並在啟用之前驗證規則集。

您還需要防火牆規則嗎?

這取決於已安裝的防火牆。如果您的 nftables 輸入策略較為嚴格,請允許入站 UDP 流量51820。如果您的轉送鏈預設設定了丟棄策略,請新增規則以允許流量到達wg0目標位址,並允許已建立的回傳流量。雲端 VPS 提供者可能還擁有單獨的安全群組或提供者防火牆,這些安全群組或防火牆必須允許 UDP 流量51820。

不要盲目地將全新的預設防火牆規則集貼到遠端 SSH 伺服器上,這可能會導致您無法存取伺服器。正確做法:檢查sudo nft list ruleset並整合 WireGuard 到您現有的防火牆。

步驟六:建立客戶畫像

在客戶端,使用 WireGuard 應用程式產生自己的金鑰對wg genkey。完整的 IPv4 隧道設定檔如下所示:

[Interface]
Address = 10.8.0.2/24
PrivateKey = CLIENT_PRIVATE_KEY
DNS = 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

替換vpn.example.com為伺服器的公共 DNS 名稱或公用 IP 位址。此DNS行是可選的,客戶端實現的支援情況各不相同。對於分割隧道,請AllowedIPs僅變更為需要通過 VPN 的網絡,例如10.8.0.0/24加上一個私有 LAN,例如192.168.50.0/24。

PersistentKeepalive = 25這也是可選的。 WireGuard 官方文件建議,當 NAT 或有狀態防火牆後的對等方需要在空閒期間保持其映射關係時,25 秒是一個合理的值。這不是性能設置,也不是每個客戶端都必須設置的。操作:主要用於漫遊用戶端或經過 NAT 的用戶端,否則這些用戶端在空閒一段時間後將無法存取。

在 Debian 系統上使用 GNU nano 編輯器開啟 WireGuard 用戶端設定文件,可以看到伺服器端點、允許的 IP 位址以及持久連線狀態 (PersistentKeepalive)。
使用客戶端自己的私鑰、伺服器公鑰、端點、路由策略和可選的 keepalive 設定客戶端。

步驟 7:開機啟動 WireGuard。

首先啟動 nftables,然後啟用 WireGuard 介面:

sudo systemctl enable --now nftables
sudo systemctl enable --now wg-quick@wg0
systemctl is-active nftables
systemctl is-active wg-quick@wg0

wg-quick@wg0讀取/etc/wireguard/wg0.conf。wg-quick手冊確認,這種命名約定是儲存在下的配置的常用快捷方式/etc/wireguard。操作:除非您的網路管理員設計更複雜,否則請使用該服務而不是自訂啟動腳本。

在 Debian 終端中啟用 nftables 和 wg-quick@wg0,並確認這兩個服務都已啟動。
啟用 nftables 和 wg-quick@wg0 systemd 服務,以便 VPN 在重新啟動後自動恢復。

步驟 8:驗證握手和流量

連接客戶端,然後檢查伺服器:

sudo wg show
ip address show wg0
ping -c 3 10.8.0.2

正常的對等節點通常會在流量通過隧道後顯示最近的握手記錄和非零傳輸計數器。如果您設定了完整隧道,請使用可信任的 IP 位址檢查服務檢查用戶端的公用 IPv4 位址;該位址應與 Debian 伺服器的出口位址相符。

Debian 終端機顯示 wg show 的輸出,表示最近與 10.8.0.2 進行了握手並成功 ping 通。
驗證對等方最近是否進行了 WireGuard 握手,傳輸計數器是否增加,以及用戶端隧道位址是否回應。

常見問題及其真正意義

症狀可能原因下一步行動建議
不握手金鑰錯誤、端點錯誤、UDP連接埠錯誤、上游防火牆錯誤、路由器連接埠轉送錯誤或CGNAT錯誤確認 UDP 51820 到達 Debian 主機,並重新檢查兩個公鑰。
握手成功,但無法上網IPv4 轉送、轉送防火牆規則或 NAT 缺失檢查sysctl net.ipv4.ip_forward、nft list ruleset和出站介面名稱。
可以存取 10.8.0.1,但無法存取私有區域網路客戶端缺少 LAN 路由,或 LAN 缺少返迴路由。將 LAN 子網路新增至客戶端AllowedIPs,並適當地設定路由或 NAT。
有些網站停滯不前可能存在路徑 MTU 問題在強制設定 MTU 之前,請先使用較小的資料包進行測試。系統wg-quick可以自動選擇 MTU,因此不要因為其他指南中建議設定 1420 就進行設定。
IPv4 使用 VPN,但 IPv6 不使用。此個人資料僅路由0.0.0.0/0也可以透過 WireGuard 設定 IPv6,或者如果需要避免 IPv6 洩漏,則可以故意停用/封鎖用戶端 IPv6。

全隧道式還是分離式隧道式:你該選擇哪一個?

當目標是保護不受信任的 Wi-Fi 網路上的流量,或將網路流量離開 Debian 伺服器時,請使用完整隧道。當您只需要遠端存取伺服器、家庭網路、實驗室或內部應用程序,並且希望正常的網路流量保持在本地時,請使用分離隧道。選擇哪種方式主要取決於客戶端AllowedIPs。

對於小型點對點部署,上述配置足以建立一個可維護的基線:每個用戶端一個對等區塊、唯一的隧道位址、Debian 管理的服務以及用於實際所需路由行為的 nftables。對於大型部署,即使 WireGuard 協定本身很簡單,金鑰分發、對等節點生命週期、DNS、日誌記錄和組態管理也會成為維運方面需要考慮的問題。

最終核查清單

  • wg-quick@wg0活躍且wg0擁有10.8.0.1/24。
  • 伺服器監聽UDP端口51820,該端口可透過任何上游防火牆或路由器存取。
  • 每個客戶端都有自己的金鑰對和/32伺服器上的唯一條目。
  • net.ipv4.ip_forward1當需要路由存取時,情況就相同了。
  • 除非您有意使用路由返迴路徑,否則 nftables 偽裝功能適用於全隧道網路存取。
  • wg show顯示客戶端傳送流量後最近的握手訊息。
  • 客戶的要求AllowedIPs與預期的全隧道或分離式隧道設計相符。

這些步驟針對 Debian 12 以及 Debian 提供的標準 WireGuard 工具集。網路拓撲、上游 NAT、雲端防火牆、私人 LAN 路由和 IPv6 策略都與特定環境相關,因此無法僅從 WireGuard 設定推斷這些因素。請分別驗證每個因素,而不是將所有連線問題視為 WireGuard 故障。

留下評論

如何在Linux系統上使用Cameractrls更改網路攝影機設置

如何在Linux系統上使用Cameractrls更改網路攝影機設置

使用 Cameractrls 在 Linux 上變更網路攝影機設定:調整曝光、色彩、減少閃爍和其他支援的控件,然後檢查相容的視訊模式。

如何在 Linux 上安裝 PhpStorm:工具箱、Tar.gz、Snap 和 AUR

如何在 Linux 上安裝 PhpStorm:工具箱、Tar.gz、Snap 和 AUR

在 Linux 系統上,您可以使用 JetBrains Toolbox 或獨立的 tar.gz 壓縮套件安裝 PhpStorm,此外還有 Snap 和 Arch AUR 版本可供選擇。 Java 已預先安裝。

如何在 Linux 系統上將 CD-ROM 備份為 ISO 文件

如何在 Linux 系統上將 CD-ROM 備份為 ISO 文件

在 Linux 上使用 GNOME Disks 或 dd 建立 CD-ROM ISO。識別光碟機,監控複製過程,驗證鏡像,並了解何時損壞的光碟或音訊光碟需要其他工具。

如何在 XFCE 4 上設定雙面板

如何在 XFCE 4 上設定雙面板

為每個顯示器建立一個單獨的 XFCE 4 面板,將第二個面板指派給正確的輸出,調整其位置和大小,並新增所需的啟動器和狀態項目。

如何在Linux上安裝Cisco Packet Tracer

如何在Linux上安裝Cisco Packet Tracer

下載適用於 Ubuntu 64 位元系統的 Cisco Packet Tracer 9.0.1,使用 APT 安裝 DEB 軟體包,在終端機中接受許可協議,然後登入以啟動實驗環境。

如何在Linux系統下使用GIMP摳圖

如何在Linux系統下使用GIMP摳圖

在 Linux 系統上使用 GIMP 去除照片背景:描繪主體,刪除選定的背景,保持透明度,並匯出可重複使用的 PNG 檔案。

免費下載 FlightGear:官方安裝指南

免費下載 FlightGear:官方安裝指南

從官方網站免費下載 FlightGear。比較 Windows、macOS 和 Linux 版本的軟體包,安裝資料文件,即可開始您的首次飛行。

Google Tasks桌面應用程式:如何在電腦上使用

Google Tasks桌面應用程式:如何在電腦上使用

在瀏覽器中開啟 Google Tasks,新增 Chrome 捷徑或應用程式啟動,並透過行事曆和 Gmail 管理有日期的待辦事項。

OKSampler:一款免費、簡單的鍵盤節拍音樂採樣器

OKSampler:一款免費、簡單的鍵盤節拍音樂採樣器

OKSampler 可以將 MP3 片段對應到鍵盤按鍵,並支援音訊循環播放。了解這款經典免費軟體的功能、其舊功能的缺失以及下載前需要檢查的事項。

如何在 Linux 系統上安裝 Wireshark:Ubuntu、Fedora、Arch 等

如何在 Linux 系統上安裝 Wireshark:Ubuntu、Fedora、Arch 等

使用目前軟體包命令在 Ubuntu、Debian、Fedora、Arch 或 openSUSE 上安裝 Wireshark,然後安全地配置即時資料包擷取。