WireGuard VPN
简介¶
WireGuard 是一种免费开源的点对点 (P2P) 虚拟专用网络 (VPN)。它是一种轻量级、安全的现代替代方案,可取代具有大型代码库、依赖 TCP 连接的传统 VPN。由于 WireGuard 是 P2P VPN,因此添加到 WireGuard 网络中的每台计算机都可以直接相互通信。本指南采用中心辐射模型,其中一个分配有公共 IP 地址的 WireGuard 对等节点充当所有流量的网关。这使得 WireGuard 流量能够绕过运营商级 NAT (CGNAT),而无需在路由器上启用端口转发。这需要一个具有公共 IP 地址的 Rocky Linux 系统。最简单的方法是通过您选择的云提供商启动一个虚拟专用服务器 (VPS)。在撰写本文时,Google Cloud Platform 为其 e2-micro 实例提供免费套餐。
先决条件和假设¶
此过程的最低要求如下:
- 能够以 root 用户身份运行命令或使用
sudo
提升权限 - 一个具有公共可访问 IP 地址的 Rocky Linux 系统
安装 WireGuard¶
安装企业 Linux 附加包 (EPEL)
sudo dnf install epel-release -y
升级系统包
sudo dnf upgrade -y
安装 WireGuard
sudo dnf install wireguard-tools -y
配置 WireGuard 服务器¶
创建一个文件夹用于存放 WireGuard 配置文件和密钥
sudo mkdir -p /etc/wireguard
创建一个名称自定、以 .conf
扩展名结尾的配置文件
注意
您可以在同一台机器上创建多个 WireGuard VPN 隧道,每个隧道使用不同的配置文件、网络地址和 UDP 端口。
sudo touch /etc/wireguard/wg0.conf
为 WireGuard 服务器生成新的私钥和公钥对
wg genkey | sudo tee /etc/wireguard/wg0 | wg pubkey | sudo tee /etc/wireguard/wg0.pub
使用您选择的编辑器编辑配置文件。
sudo vi /etc/wireguard/wg0.conf
粘贴以下内容:
[Interface]
PrivateKey = server_privatekey
Address = x.x.x.x/24
ListenPort = 51820
您必须将 server_privatekey
替换为之前生成的私钥。您可以使用以下命令查看私钥:
sudo cat /etc/wireguard/wg0
接下来,您需要将 x.x.x.x/24
替换为 RFC 1918 中定义的私有 IP 地址范围内的网络地址。本指南中使用的网络地址是 10.255.255.0/24
。
最后,您可以选择任何 UDP 端口来接受 WireGuard VPN 连接。本指南使用 UDP 端口 51820
。
启用 IP 转发¶
IP 转发允许在网络之间路由数据包。这使得内部设备可以通过 WireGuard 隧道进行通信。
为 IPv4 和 IPv6 打开 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1 && sudo sysctl -w net.ipv6.conf.all.forwarding=1
配置 firewalld
¶
安装 firewalld
sudo dnf install firewalld -y
安装 firewalld
后,启用它:
sudo systemctl enable --now firewalld
创建一个永久防火墙规则,允许在公共区域的 UDP 端口 51820 上进行通信。
sudo firewall-cmd --permanent --zone=public --add-port=51820/udp
接下来,允许来自 WireGuard 接口的流量流向内部区域的其他接口。
sudo firewall-cmd --permanent --add-interface=wg0 --zone=internal
添加防火墙规则以启用内部流量的 IP 伪装。这意味着对等节点之间发送的数据包的 IP 地址将被替换为服务器的 IP 地址。
sudo firewall-cmd --permanent --zone=internal --add-masquerade
最后,重新加载 firewalld
:
sudo firewall-cmd --reload
配置 WireGuard 对等节点¶
由于 WireGuard 网络中的所有计算机在技术上都是对等节点,因此此过程几乎与配置 WireGuard 服务器相同,但略有不同。
创建一个文件夹用于存放 WireGuard 配置文件和密钥
sudo mkdir -p /etc/wireguard
创建一个配置文件,将其命名为您选择的名称,并以 .conf
扩展名结尾。
sudo touch /etc/wireguard/wg0.conf
生成新的私钥和公钥对。
wg genkey | sudo tee /etc/wireguard/wg0 | wg pubkey | sudo tee /etc/wireguard/wg0.pub
使用您选择的编辑器编辑配置文件,添加以下内容:
[Interface]
PrivateKey = peer_privatekey
Address = 10.255.255.2/24
[Peer]
PublicKey = server_publickey
AllowedIPs = 10.255.255.1/24
Endpoint = serverip:51820
PersistentKeepalive = 25
将 peer_privatekey
替换为存储在对等节点 /etc/wireguard/wg0
中的对等节点的私钥。
您可以使用此命令输出密钥,以便复制:
sudo cat /etc/wireguard/wg0
将 server_publickey
替换为存储在服务器 /etc/wireguard/wg0.pub
中的服务器的公钥。
您可以使用此命令输出密钥,以便复制:
sudo cat /etc/wireguard/wg0.pub
将 serverip
替换为 WireGuard 服务器的公共 IP。
您可以使用以下命令在服务器上查找服务器的公共 IP 地址:
ip a | grep inet
对等节点的配置文件现在包含 PersistentKeepalive = 25
规则。此规则指示对等节点每 25 秒 ping 一次 WireGuard 服务器,以维持 VPN 隧道的连接。没有此设置,VPN 隧道将在空闲一段时间后超时。
启用 WireGuard VPN¶
要启用 WireGuard,您将在服务器和对等节点上运行以下命令:
sudo systemctl enable wg-quick@wg0
然后通过在服务器和对等节点上运行以下命令来启动 VPN:
sudo systemctl start wg-quick@wg0
将客户端密钥添加到 WireGuard 服务器配置中¶
输出对等节点的公钥并复制它。
sudo cat /etc/wireguard/wg0.pub
在服务器上,运行以下命令,将 peer_publickey
替换为对等节点的公钥。
sudo wg set wg0 peer peer_publickey allowed-ips 10.255.255.2
使用 wg set
仅对 WireGuard 接口进行临时更改。对于永久配置更改,您可以手动编辑配置文件并添加对等节点。在进行任何永久配置更改后,您都需要重新加载 WireGuard 接口。
使用您选择的编辑器编辑服务器的配置文件。
sudo vi /etc/wireguard/wg0.conf
将对等节点添加到配置文件。内容应与下方类似:
[Interface]
PrivateKey = +Eo5oVjt+d3XWvFWYcOChaLroGj5vapdXKH8UZ2T2Fc=
Address = 10.255.255.1/24
ListenPort = 51820
[Peer]
PublicKey = 1vSho8NvECkG1PVVk7avZWDmrd2VGZ2xTPaNe5+XKSg=
AllowedIps = 10.255.255.2/32
关闭接口
sudo wg-quick down wg0
启动接口
sudo wg-quick up wg0
查看 WireGuard 接口并测试连接性¶
您可以在服务器和对等节点上使用以下命令查看 WireGuard 信息:
sudo wg
您可以通过从对等节点向服务器发送 ping 来测试连接性。
ping 10.255.255.1
结论¶
遵循本指南,您已成功设置了使用中心辐射模型的 WireGuard VPN。此配置提供了一种安全、现代且高效的方式来连接互联网上的多个设备。请访问 官方 WireGuard 网站。
作者:Joseph Brinkman
贡献者:Steven Spencer, Ganna Zhyrnova