跳到内容

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