本教程向您展示如何在 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 客戶端。
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。與往常一樣,如果您發現本文有幫助,請註冊我們的免費時事通訊以獲取提示和技巧。