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