跳至内容

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