在 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 RAM)
  • 基於KVM的高性能VPS
  • 全球九個數據中心,包括美國、加拿大、英國、德國、荷蘭、香港和以色列。

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

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

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

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

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

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

CentOS 8

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

RHEL 8

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

CentOS / RHEL 7

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。

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

服務器

創建一個 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 代表整個互聯網。也就是說,所有到 Internet 的流量都必須通過 VPN 路由。
  • 最後一站:VPN 服務器公網 IP 地址和端口號。 將 12.34.56.78 替換為服務器的真實公網 IP 地址。
  • 持久的:每 25 秒向對等方發送一個經過身份驗證的空數據包以保持連接。 如果沒有啟用 PersistentKeepalive,VPN 服務器可能無法 ping VPN 客戶端。

保存並關閉文件。

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

sudo chmod 600 /etc/wireguard/ -R

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

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

sudo nano /etc/sysctl.conf

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

net.ipv4.ip_forward = 1

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

sudo sysctl -p

第 5 步:在服務器上配置 IP Masquerade

運行以下命令以啟用 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 網絡。因此,就像家庭路由器隱藏了您的私人家庭網絡一樣,Internet 只看到 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

使用以下命令啟動 BIND9。

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; };

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

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

您還可以使用 systemd 服務來啟動 WireGuard。

sudo systemctl start [email protected]

如果引導失敗,您應該檢查日誌以查找問題。

sudo journalctl -eu [email protected]

使用以下命令在系統引導時啟用自動引導:

sudo systemctl enable [email protected]

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

systemctl status [email protected]

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

客戶

啟動 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) 檢查隧道是否有效。 如果您 p​​ing 以下錯誤消息:

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-策略路由-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 連接丟失,您的計算機可以通過常規網關訪問 Internet。您可能需要啟用終止開關功能以防止未加密的數據包通過非 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。與往常一樣,如果您覺得這篇文章有用,請訂閱我們的免費時事通訊以獲取更多提示和技巧。