本教程向您展示如何在 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
- 全球9個數據中心,包括美國、加拿大、英國、德國、荷蘭、香港和以色列。
按照下面鏈接的教程在 Kamatera 上創建 Linux VPS 服務器。
- 如何使用 Kamatera 創建 Linux VPS 服務器
一旦您擁有運行 CentOS/Alma Linux/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
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
CentOS/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。
第 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 偽裝
通過運行以下命令啟用 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
僅在 localhost 上偵聽。如果您希望同一網絡上的客戶端能夠查詢域名,請將這兩行註釋掉。 (在每行的開頭添加一個雙斜杠)
// 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 客戶端。
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。與往常一樣,如果您發現本文對您有幫助,請註冊我們的免費時事通訊以獲取提示和技巧。