在 CentOS/RHEL 上設置您自己的 WireGuard VPN 服務器


本教程向您展示如何在 CentOS/RHEL 上設置您自己的 WireGuard VPN 服務器。 WireGuard 專為 Linux 內核設計。 它在 Linux 內核上運行,允許您創建快速、現代和安全的 VPN 隧道。

WireGuard VPN 功能

  • 它重量輕,速度快如閃電,讓 OpenVPN 脫穎而出。
  • 跨平台。 WireGuard 適用於 Linux、BSD、macOS、Windows、Android、iOS 和 OpenWRT。
  • 用戶身份驗證是通過交換公鑰來完成的,類似於 SSH 密鑰。
  • 為您的 VPN 客戶端分配一個靜態隧道 IP 地址。有些人可能不喜歡它,但它在某些情況下很有用。
  • 移動設備可以在 Wi-Fi 和移動網絡之間無縫切換,而不會中斷連接。
  • 旨在在大多數用例中替代 OpenVPN 和 IPSec。

必需的

要學習本教程,您需要一個 VPS(虛擬專用服務器),它可以免費訪問被阻止的網站(外國或互聯網過濾系統)。我們推薦 Kamatera VPS:

  • 30 天免費試用。
  • 每月 4 美元起(1GB 內存)
  • 基於KVM的高性能VPS
  • 全球9個數據中心,包括美國、加拿大、英國、德國、荷蘭、香港和以色列。

按照下面鏈接的教程在 Kamatera 上創建 Linux VPS 服務器。

  • 如何使用 Kamatera 創建 Linux VPS 服務器

一旦您擁有運行 CentOS/Alma Linux/Rocky Linux 的 VPS,請按照以下步驟操作。

本教程假設 VPN 服務器和 VPN 客戶端都在運行 中央操作系統/RHEL 操作系統。

第 1 步:在 CentOS/RHEL 服務器和桌面上安裝 WireGuard

登錄到您的 CentOS/RHEL 服務器並運行以下命令來安裝 WireGuard。

中央操作系統 8

sudo dnf install elrepo-release epel-release -y
sudo dnf install kmod-wireguard wireguard-tools -y

RHEL8

sudo dnf install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo dnf install kmod-wireguard wireguard-tools -y

中央操作系統/RHEL7

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

然後使用相同的命令在本地 CentOS/RHEL 機器(VPN 客戶端)上安裝 WireGuard。

第二步:生成公鑰/私鑰對

服務器

為 WireGuard 創建一個目錄。

sudo mkdir -p /etc/wireguard/

通過在 CentOS/RHEL 服務器上運行以下命令來創建公鑰/私鑰對, /etc/wireguard/ 目錄。

wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

客戶

為 WireGuard 創建一個目錄。

sudo mkdir -p /etc/wireguard/

通過運行以下命令在本地 CentOS/RHEL 計算機(VPN 客戶端)上創建公鑰/私鑰對:

wg genkey | sudo tee /etc/wireguard/client_private.key | wg pubkey | sudo tee /etc/wireguard/client_public.key

第 3 步:創建 WireGuard 配置文件

服務器

使用命令行文本編輯器(例如 Nano)在 CentOS/RHEL 服務器上創建 WireGuard 配置文件。 wg0 是網絡接口名稱。

sudo dnf install nano
sudo nano /etc/wireguard/wg0.conf

複製下面的文本並將其粘貼到配置文件中。您必須使用自己的服務器私鑰和客戶端公鑰。

[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = cD+ZjXiVIX+0iSX1PNijl4a+88lCbDgw7kO78oXXLEc=

[Peer]
PublicKey = AYQJf6HbkQ0X0Xyt+cTMTuJe3RFwbuCMF46LKgTwzz4=
AllowedIPs = 10.10.10.2/32

在哪裡:

  • 地址:指定VPN服務器的私有IP地址。此處我們使用 10.10.10.0/24 網絡範圍,因此它不會與家庭網絡範圍衝突。 (大多數家庭路由器使用 192.168.0.0/24 或 192.168.1.0/24)。 10.10.10.1 是 VPN 服務器的私有 IP 地址。
  • 私鑰: VPN 服務器的私鑰。 /etc/wireguard/server_private.key 服務器上的文件。
  • 偵聽端口:WireGuard VPN 服務器監聽默認的 UDP 端口 51820。
  • 公鑰: VPN 客戶端的公鑰。 /etc/wireguard/client_public.key 客戶端計算機上的文件。
  • 允許的 IP:VPN客戶端可以使用的IP地址。在此示例中,客戶端只能在 VPN 隧道內使用 10.10.10.2 IP 地址。

保存並關閉文件。 (要在 Nano 文本編輯器中保存文件, Ctrl+O單擊並按 Enter 確認。根據 Ctrl+X 停止。 )

修改文件權限模式,只有root用戶可以讀取文件。

sudo chmod 600 /etc/wireguard/ -R

客戶

使用命令行文本編輯器(例如 Nano)在本地 CentOS/RHEL 計算機上創建 WireGuard 配置文件。 wg-client0 是網絡接口名稱。

sudo nano /etc/wireguard/wg-client0.conf

複製下面的文本並將其粘貼到配置文件中。您必須使用自己的客戶端私鑰和服務器公鑰。

[Interface]
Address = 10.10.10.2/24
DNS = 10.10.10.1
PrivateKey = cOFA+x5UvHF+a3xJ6enLatG+DoE3I5PhMgKrMKkUyXI=

[Peer]
PublicKey = vxyo4l4I3jWK+KZquNIDJF/hzQq29DOIxSUOrfNZZCs=
AllowedIPs = 0.0.0.0/0
Endpoint = 12.34.56.78:51820
PersistentKeepalive = 25

在哪裡:

  • 地址:指定VPN客戶端的私有IP地址。
  • 域名系統:指定10.10.10.1(VPN服務器)為DNS服務器。它通過 resolvconf 命令。您還可以指定多個 DNS 服務器以實現冗餘,如下所示: DNS = 10.10.10.1 8.8.8.8
  • 私鑰: 客戶的私鑰。 /etc/wireguard/client_private.key 客戶端計算機上的文件。
  • 公鑰: 服務器的公鑰。 /etc/wireguard/server_public.key 服務器上的文件。
  • 允許的 IP: 0.0.0.0/0 代表整個互聯網,意味著所有到互聯網的流量都應該通過 VPN 路由。
  • 最後一站:VPN服務器的公網IP地址和端口號。 將 12.34.56.78 替換為您服務器的實際公網 IP 地址。
  • 活著:通過每 25 秒向對等方發送一個經過身份驗證的空數據包來保持連接。 如果未啟用 PersistentKeepalive,VPN 服務器可能無法 ping 通 VPN 客戶端。

保存並關閉文件。

更改文件模式,以便只有 root 可以讀取文件。

sudo chmod 600 /etc/wireguard/ -R

第 4 步:在您的服務器上啟用 IP 轉發

必須啟用 IP 轉發,VPN 服務器才能在 VPN 客戶端和 Internet 之間路由數據包。編輯 sysctl.conf 文檔。

sudo nano /etc/sysctl.conf

將以下行添加到此文件的末尾:

net.ipv4.ip_forward = 1

保存並關閉文件。然後使用以下命令應用更改:這 -p 選項加載 sysctl 設置 /etc/sysctl.conf 文檔。此命令將在系統重啟後保留您的更改。

sudo sysctl -p

第 5 步:在您的服務器上配置 IP 偽裝

通過運行以下命令啟用 IP 偽裝: 10.10.10.0/24 服務器防火牆內的子網。

sudo firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.10.10.0/24" masquerade"
sudo systemctl reload firewalld

這將對外界隱藏您的 VPN 網絡。因此,就像您的家庭路由器隱藏了您的私人家庭網絡一樣,互聯網只能看到 VPN 服務器的 IP,而看不到 VPN 客戶端。

如果找不到 CentOS/RHEL firewall-cmd 必須安裝 firewalld 並啟動服務才能運行命令。

sudo dnf install firewalld

sudo systemctl start firewalld

第 6 步:在您的服務器上安裝 DNS 解析器

由於您將 VPN 服務器指定為客戶端的 DNS 服務器,因此您需要在 VPN 服務器上運行 DNS 解析器。 您可以安裝一個 bind9 DNS 服務器。

sudo dnf install bind

使用以下命令啟動 BIND 9:

sudo systemctl start named

並在啟動時啟用自動啟動:

sudo systemctl enable named

您可以通過以下方式檢查狀態:

systemctl status named

示例輸出:

 named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disable>
   Active: active (running) since Sun 2020-05-17 11:07:34 EDT; 9s ago
  Process: 7203 ExecStop=/bin/sh -c /usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TE>
  Process: 7218 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited,>
  Process: 7215 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; the>
 Main PID: 7220 (named)
    Tasks: 4 (limit: 5045)
   Memory: 55.5M
   CGroup: /system.slice/named.service
           └─7220 /usr/sbin/named -u named -c /etc/named.conf -4

提示:如果上述命令沒有立即退出,請按 Q。

編輯主 BIND 配置文件 /etc/named.conf.

sudo nano /etc/named.conf

裡面 options 你可以找到這節經文的下兩行。

listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };

做什麼 named 只聽本地主機。如果希望同一網絡的客戶端能夠查詢到域名,請將這兩行註釋掉。 (每行開頭加雙斜杠)

// listen-on port 53 { 127.0.0.1; };
// listen-on-v6 port 53 { ::1; };

查找行:

allow-query { localhost; };

添加 10.10.10.0/24 網絡範圍以允許 VPN 客戶端發送 DNS 查詢。請注意,每個網絡範圍都必須以分號結尾。

allow-query { localhost; 10.10.10.0/24; };

保存並關閉文件。重新啟動 BIND9 以使更改生效。

sudo systemctl restart named

接下來,您需要通過運行以下命令允許您的 VPN 客戶端連接到端口 53:

sudo firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="10.10.10.0/24" accept"

第 7 步:在防火牆中打開 WireGuard 端口

通過運行以下命令在服務器上打開 UDP 端口 51820:

sudo firewall-cmd --permanent --add-port=51820/udp
sudo systemctl reload firewalld

第 8 步:啟動 WireGuard

服務器

通過在服務器上運行以下命令來啟動 WireGuard:

sudo wg-quick up /etc/wireguard/wg0.conf

要停下來,跑

sudo wg-quick down /etc/wireguard/wg0.conf

WireGuard 也可以使用 systemd 服務啟動。

sudo systemctl start [email protected]

如果啟動失敗,您應該檢查日誌以查看出了什麼問題。

sudo journalctl -eu [email protected]

使用以下命令在系統啟動時啟用自動啟動。

sudo systemctl enable [email protected]

使用以下命令檢查狀態:它的狀態是 active (exited).

systemctl status [email protected]

WireGuard 服務器現在已準備好接受客戶端連接。

客戶

激活電線保護。

sudo systemctl start [email protected]

如果啟動失敗,您應該檢查日誌以查看出了什麼問題。

sudo journalctl -eu [email protected]

如果您在日誌中看到以下錯誤,您可以嘗試重新啟動操作系統。

RTNETLINK answers: Operation not supported

系統啟動時啟用自動啟動。

sudo systemctl enable [email protected]

檢查狀態。

systemctl status [email protected]

現在訪問這個網站: https://icanhazip.com/ 檢查您的公共 IP 地址。如果一切順利,您應該會看到 VPN 服務器的公共 IP 地址,而不是客戶端計算機的公共 IP 地址。

您還可以通過運行以下命令來獲取當前的公共 IP 地址:

curl https://icanhazip.com

故障排除提示

您可以從 VPN 服務器 ping VPN 客戶端 (ping 10.10.10.2) 以查看隧道是否正常工作。 如果 ping 顯示以下錯誤消息:

ping: sendmsg: Required key not available

也許 AllowedIPs 錯誤的參數,如錯字。

如果VPN 隧道建立成功,但客戶端的公網IP 地址沒有變化,那是因為防火牆中的偽裝沒有起作用。我的防火牆規則曾經有一個拼寫錯誤,導致我的電腦無法瀏覽互聯網。

請注意,我們不建議使用 SaveConfig=true 裡面 [Interface] WireGuard 配置文件的一部分。 SaveConfig 告訴 WireGuard 在關閉時保存運行時配置。所以如果你添加額外的 [Peer] 在配置文件中,下次重啟WireGuard時,新添加的配置將被覆蓋。

如果 VPN 仍然不起作用,請嘗試重新啟動 VPN 服務器。

sudo systemctl restart [email protected]

然後停止 VPN 客戶端。

sudo systemctl stop [email protected]

然後升級 VPN 客戶端包。

sudo dnf update

然後重新啟動您的 VPN 客戶端。

sudo shutdown -r now

sudo systemctl start [email protected]

添加 VPN 客戶端

WireGuard 旨在將 IP 地址與 VPN 客戶端相關聯。要添加更多 VPN 客戶端,您必須為每個客戶端創建一個唯一的私鑰/公鑰對,然後添加每個 VPN 客戶端的公鑰(/etc/wireguard/wg0.conf) 像這樣:

[Interface]
Address = 10.10.10.1/24
PrivateKey = UIFH+XXjJ0g0uAZJ6vPqsbb/o68SYVQdmYJpy/FlGFA=
ListenPort = 51820

[Peer]
PublicKey = 75VNV7HqFh+3QIT5OHZkcjWfbjx8tc6Ck62gZJT/KRA=
AllowedIPs = 10.10.10.2/32

[Peer]
PublicKey = YYh4/1Z/3rtl0i7cJorcinB7T4UOIzScifPNEIESFD8=
AllowedIPs = 10.10.10.3/32

[Peer]
PublicKey = EVstHZc6QamzPgefDGPLFEjGyedJk6SZbCJttpzcvC8=
AllowedIPs = 10.10.10.4/32

每個 VPN 客戶端都有一個靜態私有 IP 地址(10.10.10.2、10.10.10.3、10.10.10.4 等)。重新啟動 WireGuard 服務器以使更改生效。

sudo systemctl restart [email protected]

然後像往常一樣將 WireGuard 配置添加到每個 VPN 客戶端。

策略路由、拆分隧道、VPN 終止開關

現在讓我告訴你如何使用它 策略路由, 分裂隧道, 和 VPN終止開關 使用 WireGuard VPN。 筆記 我們不建議將它們組合使用。使用策略路由時,請勿啟用拆分隧道或 VPN 終止開關。

策略路由

默認情況下,VPN 客戶端上的所有流量都通過 VPN 服務器路由。您可能只想根據傳輸層協議和目標端口路由某些類型的流量。這稱為策略路由。

由於在客戶端計算機上配置了策略路由,因此必須先停止 VPN 連接。

sudo systemctl stop [email protected]

然後編輯客戶端配置文件。

sudo nano /etc/wireguard/wg-client0.conf

例如,如果你有 [interface] 在該部分中,WireGuard 創建了一個名為“1234”的路由表,並將 IP 規則添加到路由表中。在此示例中,僅當客戶端計算機使用 TCP 作為傳輸層協議發送電子郵件且目標端口為 25 時,流量才會通過 VPN 服務器進行路由。

Table = 1234
PostUp = ip rule add ipproto tcp dport 25 table 1234
PreDown = ip rule delete ipproto tcp dport 25 table 1234

wireguard-policy-routing-centos

保存並關閉文件。然後重啟 WireGuard 客戶端。

sudo systemctl start [email protected]

拆分隧道

默認情況下,VPN 客戶端上的所有流量都通過 VPN 服務器路由。這就是啟用拆分隧道的方式。 10.10.10.0/24 IP 範圍通過 WireGuard VPN 隧道傳輸。這對於為多個雲服務器構建專用網絡很有用。使用完整的 VPN 隧道會導致 VPN 客戶端在雲服務器上運行並失去與雲服務器的連接。

編輯客戶端配置文件。

sudo nano /etc/wireguard/wg-client0.conf

改變

AllowedIPs = 0.0.0.0/0

到達

AllowedIPs = 10.10.10.0/24

因此,如果目標地址在 10.10.10.0/24 IP 範圍內,流量將僅通過 VPN 路由。保存並關閉文件。然後重啟 WireGuard 客戶端。

sudo systemctl restart [email protected]

VPN終止開關

默認情況下,即使 VPN 連接丟失,您的計算機仍然可以通過常規網關訪問互聯網。您可能需要啟用終止開關功能以防止未加密的數據包穿過非 WireGuard 接口。

停止 WireGuard 客戶端進程。

sudo systemctl stop [email protected]

編輯客戶端配置文件。

sudo nano /etc/wireguard/wg-client0.conf

添加以下兩行 [interface] 部門。

PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

像這樣:

[Interface]
Address = 10.10.10.2/24
DNS = 10.10.10.1
PrivateKey = cOFA+x5UvHF+a3xJ6enLatG+DoE3I5PhMgKrMKkUyXI=
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

[Peer]
PublicKey = RaoAdsIEIwgV9DHNSubxWVG+nZ1GP/c3OU6A/efBJ0I=
AllowedIPs = 0.0.0.0/0
Endpoint = 12.34.56.78:51820
PersistentKeepalive = 25

保存並關閉文件。然後啟動 WireGuard 客戶端。

sudo systemctl start [email protected]

包起來

就是這樣!我希望本教程能幫助您在 CentOS/RHEL 上安裝和配置 WireGuard。一如既往,如果您覺得本文有幫助,請訂閱我們的免費時事通訊以獲取提示和技巧。