如何在 Ubuntu 20.04 上设置 WireGuard VPN 服务器
传统上,VPN 实施有两种形式。 内核 VPN 实现(例如 IPsec)以“堆栈中的凹凸”方式(即在 IP 堆栈和网络驱动程序之间)在内核中执行重型每数据包加密处理。这提供了速度,因为在数据包处理期间内核和用户空间之间没有上下文切换。但它在单独的用户空间控制平面(例如 IKE)中具有较高的管理复杂性。 VPN 实现的另一种形式是基于用户空间 TUN/TAP 的解决方案,例如 OpenVPN、Tinc、n2n,其中加密处理由用户空间 VPN 守护程序执行。当然,这些基于 TUN/TAP 的 VPN 解决方案与 IPsec 相比性能较差,主要是因为网络数据包多次穿越内核和用户空间边界,导致频繁的上下文切换和数据包复制。尽管存在性能劣势,但用户空间 VPN 解决方案由于其易于使用和配置而比内核内的 VPN 解决方案更受欢迎。
什么是WireGuard?
WireGuard 是 VPN 软件领域的一个相对较新的进入者,它大胆地承诺在速度、易用性和可审核性方面从头顶上取代 OpenVPN。为了在性能方面与内核内 IPsec 竞争,WireGuard 在内核中实现了其数据路径。但为了避免 IPsec 复杂的有状态控制平面的缺陷,WireGuard 允许使用标准 ip
和 ifconfig
工具通过无状态虚拟接口对其进行配置和管理。 WireGuard 内核模块的实现代码少于 4,000 行(仅相当于 OpenVPN 或 IPsec 实现的 1%),并使用经过验证的最先进的加密技术。这种最小的代码库有助于社区在不断更新时进行严格、及时的安全审核。
WireGuard 是否会兑现其承诺还有待观察,但到目前为止,它在提高受欢迎程度方面表现出了良好的成功记录。 WireGuard 已进入 Linux 内核 5.6 的事实有力地证明了其可信度。正如莱纳斯曾经说过的,它简直就是一件艺术品。
WireGuard VPN 服务器的用例
虽然本教程的标题是设置 WireGuard VPN 服务器,但从技术上讲它是不正确的。与 OpenVPN 不同,WireGuard 中没有服务器和客户端的概念。相反,由 WireGuard 连接的网络端点称为“对等点”,它们通过成对的 WireGuard 隧道直接相互通信。类似的概念已经在现有的点对点 VPN(例如 Tinc 或 n2n)中可用。即使在这种点对点 VPN 设计中,一个指定的对等点也可以充当所有其他对等点的 VPN 服务器的角色。这是一个传统的 VPN 服务用例,其目标是隐藏您的数字足迹、规避地理围栏、保护自己免遭公共 WiFi 窥探等。在此用例中,您在虚拟专用服务器 (VPS) 上设置指定的 WireGuard 对等点,并让它作为默认网关路由您的所有流量。由于 WireGuard 对等点在 VPS 上运行,完全在您的控制之下,因此您不必担心您在 VPN 上的在线活动被秘密记录,这对于现有的免费 VPN 托管来说始终是可能的。 WireGuard VPN 服务器还可以配置为在连接的用户之间中继流量(如果他们愿意,但不能直接在 NAT 后面交换流量)。
考虑到此类 VPN 用例,我在本教程中描述了如何在 Ubuntu 环境中设置 Wireguard VPN 服务器。测试的平台是Ubuntu服务器20.04.1 LTS(Focal Fossa),内核为5.8.0-38。但是,本教程的大部分内容(除了特定于发行版的 WireGuard 安装和防火墙设置)适用于所有 Linux 发行版,包括 Debian、Fedora 和 Arch Linux。
在 Ubuntu 上安装 WireGuard
$ sudo apt install wireguard
将 WireGuard 配置为 VPN 服务器
大多数手动 WireGuard 配置可以使用标准 ip
或 ifconfig
工具完成,加密配置除外。对于加密设置等,WireGuard 附带了名为 wg
和 wg-quick
的命令行工具。
WireGuard 配置最好使用 root 来完成,因为它涉及特权操作。所以首先切换到root:
$ sudo -i
该过程的其余部分将作为 root 执行。
在 WireGuard 中,每个连接的对等方(包括服务器和客户端)都需要生成自己的加密(公钥/私钥)密钥对以进行身份验证和加密。因此,WireGuard 服务器配置的第一步是为服务器生成密钥对,如下所示。
# cd /etc/wireguard
# umask 077
# wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey

在上面,umask
命令确保只有 root 对 /etc/wireguard
具有读、写和执行权限。 wg
生成的密钥对可以在/etc/wireguard
中找到。每个想要连接到服务器的客户端也需要生成自己的密钥对。客户端配置将在另一个教程中介绍。
接下来,继续在 /etc/wireguard/wg0.conf
中创建 WireGuard 服务器配置文件。 WireGuard 配置文件被命名为 WireGuard 接口名称,后跟 .conf
。因此,激活后,wg0.conf
将创建一个名为 wg0
的虚拟接口。在配置文件中,我们定义了服务器的监听端口、私钥和分配给服务器的私有IP地址等。
# vi /etc/wireguard/wg0.conf
[Interface]
PrivateKey = SMV0DW6G04+EQDgK5NMzlIEicD0qQ0ORb7njXp4atko=
Address = 10.0.0.1/24
SaveConfig = true
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
PrivateKey
:此字段需要填写/etc/wireguard/privatekey
的内容。地址
:这是分配给该对等点的 WireGuard 虚拟接口的私有 IP 地址。它可以是 IPv4 或 IPv6 地址。SaveConfig
:如果为 true,则当连接新的对等方时,此配置文件将自动更新。ListenPort
:这是来自其他对等点的传入连接的 UDP 侦听端口。标准 WireGuard 端口是 UDP/51820。PostUp
/PostDown
:此处指定的命令应该在该服务器对等点启动 (PostUp
) 或关闭 (PostDown
) 后自动触发。 iptables 命令启用和禁用 IP 伪装,这是允许具有私有 IP 地址的对等方通过其公共 IP 地址相互通信所必需的。此处,请确保使用-o
指定的接口(本例中为ens3
)是Ubuntu 服务器的 WAN 接口。
确保非特权用户无法读取 wg0.conf
。
# chmod 600 /etc/wireguard/wg0.conf
现在继续并激活此配置:
# wg-quick up wg0
这将激活 wg0
虚拟接口,为其分配私有 IP 地址,并在该接口上启用 IP 伪装。您可以通过以下方式验证接口的状态:
# wg show wg0
# ip addr show wg0

如果您看到 wg0
虚拟接口,则表示 WireGuard 对等点已成功启动并在 Ubuntu 上运行。
WireGuard 后配置步骤
为了使该 WireGuard 对等点成功接纳其他对等点并充当其 VPN 服务器,您需要执行以下步骤。
首先,您需要允许 /etc/wireguard/wg0.conf
中指定的 WireGuard 侦听端口 (51820) 上的传入 UDP 连接。
Ubuntu系统默认的防火墙配置工具是ufw
。让我们使用 ufw 打开防火墙中的 WireGuard 端口。如果您通过 SSH 远程配置 Ubuntu 服务器,请不要忘记启用端口 TCP/22。
# ufw allow 51820/udp
# ufw allow 22/tcp
# ufw enable
# ufw status verbose

如上所示,防火墙规则已通过 ufw 成功更新,并将在系统启动时自动启用。
接下来,您需要启用 IP 转发,以便 WireGuard VPN 服务器可以在连接的对等点之间中继流量,并作为默认网关路由流量。打开 /etc/sysctl.conf
并取消注释以下行。
net.ipv4.ip_forward=1
如果您要将 IPv6 地址分配给 WireGuard 对等方,请取消注释以下行。
net.ipv6.conf.all.forwarding=1
使用以下命令重新加载更新后的 sysctl.conf
:
# sysctl -p /etc/sysctl.conf
自动启动 WireGuard VPN 服务
如果您在远程 VPS 实例上运行 WireGuard VPN,您可能需要启用 WireGuard 在 VPS 启动时自动启动。
幸运的是,WireGuard 已经在 Ubuntu 20.04 上与 systemd 集成。因此,您可以使用 systemctl
命令管理 WireGuard 服务(而不是手动运行 wg-quick
)。
如果您已经使用 wg-quick
手动启动了 WireGuard,则首先需要在使用 systemctl
之前停止它:
# wg-quick down wg0
然后您可以使用 systemctl
轻松启动和停止 WireGuard:
# systemctl start [email
# systemctl stop [email
请注意,命令中指定的 wg0 应该是 WireGuard 虚拟接口的名称。
要在启动时启用 WireGuard 自动启动:
# systemctl enable [email
您可以通过以下方式监控 WireGuard 的状态:
# systemctl status [email

现在您的 WireGuard VPN 服务器已可供使用!
概括
在本教程中,我将介绍如何在 Ubuntu Server 20.04 环境中设置 WireGuard VPN。正如您所看到的,WireGuard 服务器端设置非常简单,主要是因为 WireGuard(内核模块和用户区工具)已经被主线 Linux 发行版采用。 WireGuard 有多种 UI 前端正在开发中,NetworkManager 的最新版本 (v1.16) 也开始为 WireGuard 提供本机支持。本教程提供了有关使用 NetworkManager GUI 设置 WireGuard VPN 客户端的详细指南。