如何在Ubuntu 22.04上设置WireGuard

介绍

WireGuard是一种轻量级的虚拟私人网络(VPN),支持IPv4和IPv6连接。VPN允许您在不受信任的网络中穿越,就像您在私人网络上一样。当连接到不受信任的网络时,例如酒店或咖啡店的WiFi,它使您可以安全地从智能手机或笔记本电脑访问互联网。

WireGuard的加密依赖于用于对等体之间建立加密隧道的公钥和私钥。每个WireGuard版本都使用特定的加密密码套件,以确保简单性、安全性和与对等体的兼容性。

相比之下,其他VPN软件如OpenVPN和IPSec使用传输层安全性(TLS)和证书来验证和建立系统之间的加密隧道。TLS的不同版本包括对数百种不同加密套件和算法的支持,虽然这使得配置使用TLS的VPN能够支持不同的客户端,但也使得配置更加耗时、复杂和容易出错。

在本教程中,您将在Ubuntu 22.04服务器上设置WireGuard,然后配置另一台机器作为对等体,使用IPv4和IPv6连接连接到它(通常称为双栈连接)。您还将学习如何将对等体的互联网流量通过WireGuard服务器进行路由配置,以及如何在加密点对点隧道中使用VPN。

为了本教程的目的,我们将配置另一台Ubuntu 22.04系统作为WireGuard服务器的对等体(也称为客户端)。本系列中的后续教程将解释如何在Windows、macOS、Android和iOS系统和设备上安装和运行WireGuard。

注意:如果您计划在DigitalOcean Droplet上设置WireGuard,请注意,我们和许多托管提供商一样,会收取带宽超支的费用。因此,请注意您的服务器处理了多少流量。请参阅此页面了解更多信息。

先决条件

要完成本教程,您需要:

  • 一台带有sudo非根用户和已启用防火墙的Ubuntu 22.04服务器。要设置这个,您可以参考我们的使用Ubuntu 22.04进行初始服务器设置教程。我们将在本指南中将其称为WireGuard服务器
  • 您需要一台客户机,用于连接到您的WireGuard服务器。在本教程中,我们将把这台机器称为WireGuard对等端。对于本教程的目的,建议您使用本地机器作为WireGuard对等端,但如果您愿意,也可以使用远程服务器或手机作为客户端。如果您使用的是远程系统,请确保按照本教程后面的所有可选部分操作,否则可能会将自己锁出系统。
  • 要使用带有IPv6的WireGuard,您还需要确保服务器已配置为支持该类型的流量。如果您想要在WireGuard中启用IPv6支持,并且正在使用DigitalOcean Droplet,请参考此文档页面如何在Droplets上启用IPv6。您可以在创建Droplet时添加IPv6支持,或者按照该页面上的说明进行操作。

步骤1 — 安装WireGuard并生成密钥对

本教程的第一步是在您的服务器上安装WireGuard。首先,更新您的WireGuard服务器的软件包索引,并使用以下命令安装WireGuard。如果这是您在本会话中第一次使用sudo,可能需要您提供sudo用户的密码:

  1. sudo apt update
  2. sudo apt install wireguard

现在您已经安装了 WireGuard,下一步是为服务器生成私钥和公钥对。您将使用内置的 wg genkeywg pubkey 命令来创建密钥,然后将私钥添加到 WireGuard 的配置文件。

您还需要使用 chmod 命令更改刚刚创建的密钥的权限,因为默认情况下,该文件可被服务器上的任何用户读取。

使用以下命令创建 WireGuard 的私钥并更改其权限:

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

sudo chmod go=... 命令会删除文件对于除 root 用户之外的用户和组的所有权限,以确保只有 root 用户可以访问私钥。

您应该收到一行经过 base64 编码的输出,这就是私钥。输出的副本也存储在 /etc/wireguard/private.key 文件中,以供以后通过命令的 tee 部分参考。请仔细记录输出的私钥,因为您稍后需要将其添加到 WireGuard 的配置文件中。

下一步是创建相应的公钥,该公钥是从私钥派生的。使用以下命令创建公钥文件:

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

此命令由三个单独的命令组成,使用 |(管道)运算符连接在一起:

  • sudo cat /etc/wireguard/private.key:该命令读取私钥文件并将其输出到标准输出流。
  • wg pubkey:第二个命令将第一个命令的输出作为其标准输入并处理它以生成公钥。
  • sudo tee /etc/wireguard/public.key:最后一个命令获取公钥生成命令的输出并将其重定向到名为/etc/wireguard/public.key的文件中。

运行命令时,您将再次收到一行base64编码的输出,这是您的WireGuard服务器的公钥。将其复制到某个地方以供参考,因为您需要将公钥分发给连接到服务器的任何对等方。

第二步 — 选择IPv4和IPv6地址

在上一节中,您安装了WireGuard并生成了用于加密服务器与对等方之间流量的密钥对。在本节中,您将为服务器创建配置文件,并设置WireGuard在服务器重新启动时自动启动。您还将定义用于您的WireGuard服务器和对等方的私有IPv4和IPv6地址。

如果您计划同时使用IPv4和IPv6地址,则请按照以下两个部分的步骤。否则,请根据您的VPN网络需求在适当部分遵循说明。

步骤2(a) – 选择一个IPv4范围

如果您将WireGuard服务器与IPv4对等体一起使用,则服务器需要一系列私有IPv4地址,以供客户端和隧道接口使用。您可以从以下保留的地址块中选择任何IP地址范围(如果您想了解这些块是如何分配的,请访问RFC 1918规范):

  • 10.0.0.010.255.255.255(10/8前缀)
  • 172.16.0.0172.31.255.255(172.16/12前缀)
  • 192.168.0.0192.168.255.255(192.168/16前缀)

出于本教程的目的,我们将使用10.8.0.0/24作为来自保留IP的第一个范围的IP地址块。此范围将允许最多255个不同的对等连接,并且通常不应与其他私有IP范围具有重叠或冲突的地址。如果此示例范围与您的网络不兼容,请随时选择与您的网络配置兼容的地址范围。

WireGuard服务器将使用一个IP地址范围中的单个IP地址作为其私有隧道IPv4地址。我们在这里将使用10.8.0.1/24,但可以使用10.8.0.110.8.0.255范围内的任何地址。如果您选择与10.8.0.1/24不同的地址,请记下您选择的IP地址。您将把这个IPv4地址添加到您在第3步 – 创建WireGuard服务器配置中定义的配置文件中。

步骤2(b) – 选择一个IPv6范围

如果您正在使用IPv6的WireGuard,则需要根据RFC 4193中的算法生成一个唯一的本地IPv6单播地址前缀。您使用WireGuard的地址将与虚拟隧道接口关联。您需要完成几个步骤,在保留的私有IPv6地址块fd00::/8内生成一个随机的唯一IPv6前缀。

根据RFC,获取唯一IPv6前缀的推荐方法是将当天的时间与来自诸如序列号或设备ID的唯一标识值组合。然后,这些值被哈希和截断,产生一组位,可以在保留的私有fd00::/8 IP地址块内用作唯一地址。

开始生成IPv6范围的WireGuard服务器,使用以下命令使用date实用程序收集64位时间戳:

  1. date +%s%N

您将收到类似以下的数字,这是自1970-01-01 00:00:00 UTC以来的秒数(date命令中的%s),和纳秒数(%N)的组合:

Output
1650301699497770167

记录该值以备后续使用。接下来,从/var/lib/dbus/machine-id文件中复制服务器的machine-id值。该标识符对您的系统是唯一的,并且在服务器存在的整个生命周期中都不应更改。

  1. cat /var/lib/dbus/machine-id

您将收到如下输出:

/var/lib/dbus/machine-id
610cef4946ed46da8f71dba9d66c67fb

现在,您需要将时间戳与machine-id组合起来,并使用SHA-1算法对结果值进行哈希处理。命令将使用以下格式:

printf <timestamp><machine-id> | sha1sum

运行命令,替换您的时间戳和机器标识值:

  1. printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum

您将收到如下哈希值:

Output
442adea1488d96388dae9ab816045b24609a6c18 -

请注意,sha1sum命令的输出是十六进制的,因此输出使用两个字符来表示单个字节的数据。例如,示例输出中的4f26是哈希数据的前两个字节。

RFC中的算法仅需要哈希输出的最低有效(尾部)40位,或5个字节。使用cut命令打印哈希的最后5个十六进制编码字节:

  1. printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-

-c 参数告诉 cut 命令只选择指定的一组字符。 31- 参数告诉 cut 打印从位置 31 到输入行末尾的所有字符。

您应该会收到以下输出:

Output
24609a6c18

在此示例输出中,字节集为:24 60 9a 6c 18

现在,您可以通过在生成的 5 个字节后附加 fd 前缀来构建您的唯一 IPv6 网络前缀,为了可读性,用 : 冒号分隔每 2 个字节。因为您的唯一前缀中的每个子网都可以容纳总共 18,446,744,073,709,551,616 个可能的 IPv6 地址,您可以将子网限制为简单的 /64 大小。

使用先前生成的字节与 /64 子网大小,生成的前缀如下:

Unique Local IPv6 Address Prefix
fd24:609a:6c18::/64

fd24:609a:6c18::/64 范围是您将用于为服务器和对等体的 WireGuard 隧道接口分配单独的 IP 地址。要为服务器分配一个 IP,请在最后的 :: 字符后添加 1。生成的地址将为 fd24:609a:6c18::1/64。对等体可以使用范围内的任何 IP,但通常每次添加一个对等体时,您会递增值一次,例如 fd24:609a:6c18::2/64。记下 IP 并继续配置本教程的下一节中的 WireGuard 服务器。

步骤3 — 创建WireGuard服务器配置

在创建WireGuard服务器配置之前,您将需要以下信息:

  1. 确保您从步骤1 — 安装WireGuard并生成密钥对中获得了私钥。

  2. 如果您正在使用IPv4的WireGuard,则需要在步骤2(a) — 选择IPv4范围中选择的服务器IP地址,在本示例中为10.8.0.1/24

  3. 如果您正在使用IPv6的WireGuard,则需要在步骤2(b) — 选择IPv6范围中生成的服务器IP地址。在本示例中,IP为fd24:609a:6c18::1/64

一旦您获得所需的私钥和IP地址,通过运行以下命令使用nano或您偏好的编辑器创建一个新的配置文件:

  1. sudo nano /etc/wireguard/wg0.conf

将以下行添加到文件中,将您的私钥替换为突出显示的base64_encoded_private_key_goes_here值,并将IP地址替换为Address行上的地址。您还可以更改ListenPort行,如果您希望WireGuard在不同的端口上可用:

/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_private_key_goes_here Address = 10.8.0.1/24, fd24:609a:6c18::1/64 ListenPort = 51820 SaveConfig = true

SaveConfig行确保当WireGuard接口关闭时,任何更改都将保存到配置文件中。

保存并关闭/etc/wireguard/wg0.conf文件。如果您使用nano,可以按CTRL+X,然后按YENTER来确认。现在您有一个初始服务器配置,可以根据您打算如何使用WireGuard VPN服务器来构建。

步骤4 – 调整WireGuard服务器的网络配置

如果您正在使用WireGuard将对等方连接到WireGuard服务器以访问仅服务器上的服务,那么您无需完成此部分。如果您想通过WireGuard服务器路由您的WireGuard对等方的互联网流量,那么您需要按照本教程的此部分配置IP转发。

要配置转发,请使用nano或您喜欢的编辑器打开/etc/sysctl.conf文件:

  1. sudo nano /etc/sysctl.conf

如果您正在使用IPv4与WireGuard,请在文件底部添加以下行:

/etc/sysctl.conf
net.ipv4.ip_forward=1

如果您正在使用IPv6与WireGuard,请在文件底部添加此行:

/etc/sysctl.conf
net.ipv6.conf.all.forwarding=1

如果您同时使用IPv4和IPv6,请确保包含这两行。完成后保存并关闭文件。

要读取文件并加载当前终端会话的新值,请运行:

  1. sudo sysctl -p
Output
net.ipv6.conf.all.forwarding = 1 net.ipv4.ip_forward = 1

现在,您的WireGuard服务器将能够将来自虚拟VPN以太网设备的传入流量转发到服务器上的其他位置,然后再转发到公共互联网。使用此配置将允许您通过您服务器的IP地址路由所有Web流量,而您客户端的公共IP地址将被有效隐藏。

但是,在正确路由流量通过您的服务器之前,您需要配置一些防火墙规则。这些规则将确保流向和来自您的WireGuard服务器和对等方的流量正确流动。

步骤 5 — 配置 WireGuard 服务器的防火墙

在本节中,您将编辑 WireGuard 服务器的配置,添加防火墙规则,以确保服务器和客户端之间的流量正确路由。与上一节一样,如果您只是将 WireGuard VPN 用于机器到机器连接以访问仅限于您的 VPN 的资源,则跳过此步骤。

为了允许 WireGuard VPN 流量通过服务器的防火墙,您需要启用 masquerading,这是一个 iptables 概念,提供即时动态的网络地址转换(NAT)以正确路由客户端连接。

首先使用 ip route 子命令找到您的 WireGuard 服务器的公共网络接口:

  1. ip route list default

公共接口是该命令输出中跟在“dev”后面的字符串。例如,此结果显示了名为 eth0 的接口,如下所示:

Output
default via 203.0.113.1 dev eth0 proto static

请注意您设备的名称,因为您将在下一步中将其添加到 iptables 规则中。

要向您的 WireGuard 服务器添加防火墙规则,请再次使用 nano 或您喜欢的编辑器打开 /etc/wireguard/wg0.conf 文件。

  1. sudo nano /etc/wireguard/wg0.conf

在文件底部的 SaveConfig = true 行之后,粘贴以下行:

/etc/wireguard/wg0.conf
. . . PostUp = ufw route allow in on wg0 out on eth0 PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PreDown = ufw route delete allow in on wg0 out on eth0 PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

PostUp行将在WireGuard服务器启动虚拟VPN隧道时运行。在这里的示例中,它将添加三个ufwiptables规则:

  • ufw route allow in on wg0 out on eth0 – 此规则将允许IPv4和IPv6流量在wg0 VPN接口上进入,并转发到服务器上的eth0网络接口。它与您在上一节中配置的net.ipv4.ip_forwardnet.ipv6.conf.all.forwarding sysctl值配合使用。
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – 此规则配置伪装,并重写在wg0 VPN接口上进入的IPv4流量,使其看起来像来自WireGuard服务器的公共IPv4地址。
  • ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – 此规则配置伪装,并重写在wg0 VPN接口上进入的IPv6流量,使其看起来像来自WireGuard服务器的公共IPv6地址。

PreDown规则在WireGuard服务器停止虚拟VPN隧道时运行。这些规则是PostUp规则的相反,并在VPN停止时撤销VPN接口的转发和伪装规则。

在这两种情况下,编辑配置以包括或排除适用于您的VPN的IPv4和IPv6规则。例如,如果您只使用IPv4,则可以排除带有ip6tables命令的行。

相反,如果您仅使用IPv6,则编辑配置仅包括ip6tables命令。 ufw行应存在于IPv4和IPv6网络的任何组合中。完成后保存并关闭文件。

配置WireGuard服务器防火墙的最后一部分是允许流量通过WireGuard UDP端口。如果您没有更改服务器的/etc/wireguard/wg0.conf文件中的端口,则要打开的端口是51820。如果在编辑配置时选择了不同的端口,请务必在以下UFW命令中进行替换。

如果您在按照先决条件教程时忘记打开SSH端口,请在此处添加:

  1. sudo ufw allow 51820/udp
  2. sudo ufw allow OpenSSH

注意:如果您使用不同的防火墙或自定义了UFW配置,则可能需要添加其他防火墙规则。例如,如果您决定通过VPN连接隧道传输所有网络流量,则需要确保允许端口53的流量以进行DNS请求,以及端口80443用于分别进行HTTP和HTTPS流量。如果您在VPN上使用其他协议,则还需要为它们添加规则。

添加这些规则后,禁用并重新启用UFW以重新启动它并加载您修改的所有文件的更改:

  1. sudo ufw disable
  2. sudo ufw enable

您可以通过运行ufw status命令来确认规则是否已生效。运行它,您应该会收到如下输出:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- 51280/udp ALLOW Anywhere 22/tcp ALLOW Anywhere 51280/udp (v6) ALLOW Anywhere (v6) 22/tcp (v6) ALLOW Anywhere (v6)

您的WireGuard服务器现在已配置为正确处理VPN流量,包括为对等端进行转发和伪装。有了防火墙规则,您可以启动WireGuard服务本身以侦听对等连接。

步骤6 — 启动WireGuard服务器

WireGuard可以配置为使用其内置的wg-quick脚本作为systemd服务运行。虽然您可以手动使用wg命令每次都要使用VPN时创建隧道,但这样做是一个重复的、容易出错的手动过程。相反,您可以使用systemctl管理隧道,并借助wg-quick脚本的帮助。

使用systemd服务意味着您可以配置WireGuard在启动时启动,这样只要服务器正在运行,您就可以随时连接到您的VPN。要做到这一点,请通过将其添加到systemctl来启用wg0隧道的wg-quick服务:

  1. sudo systemctl enable [email protected]

请注意,该命令指定了隧道的名称wg0设备名称作为服务名称的一部分。此名称映射到/etc/wireguard/wg0.conf配置文件。这种命名方法意味着您可以使用服务器创建任意数量的独立VPN隧道。

例如,您可以拥有一个名为prod的隧道设备,其配置文件将是/etc/wireguard/prod.conf。每个隧道配置可以包含不同的IPv4、IPv6和客户端防火墙设置。通过这种方式,您可以支持多个不同的对等连接,每个连接都有自己独特的IP地址和路由规则。

现在启动服务:

  1. sudo systemctl start [email protected]

使用以下命令双重检查WireGuard服务是否处于活动状态。您应该在输出中看到active (running)

  1. sudo systemctl status [email protected]
Output
[email protected] - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled) Active: active (exited) since Mon 2022-04-18 17:22:13 UTC; 2s ago Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 Process: 98834 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 98834 (code=exited, status=0/SUCCESS) CPU: 193ms Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] wg setconf wg0 /dev/fd/63 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -4 address add 10.8.0.1/24 dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -6 address add fd24:609a:6c18::1/64 dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip link set mtu 1420 up dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ufw route allow in on wg0 out on ens3 Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added (v6) Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE Apr 18 17:22:13 thats-my-jam systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

输出显示了用于创建虚拟wg0设备并分配IPv4和IPv6地址的ip命令,这些地址已添加到配置文件中。您可以使用这些规则来排除隧道故障,或者如果希望尝试手动配置VPN接口,也可以使用wg命令本身。

服务器配置和运行后,下一步是将客户机配置为WireGuard对等端并连接到WireGuard服务器。

第7步 – 配置WireGuard对等端

配置WireGuard对等端类似于设置WireGuard服务器。安装了客户端软件后,您将生成公钥和私钥对,为对等端定义IP地址或地址,为对等端定义配置文件,然后使用wg-quick脚本启动隧道。

您可以通过以下步骤生成密钥对和配置,向您的VPN添加任意数量的对等方。如果将多个对等方添加到VPN,请确保跟踪其私有IP地址,以防止冲突。

要配置WireGuard对等方,请确保已安装WireGuard软件包,使用以下apt命令。在WireGuard对等方上运行:

  1. sudo apt update
  2. sudo apt install wireguard

创建WireGuard对等方的密钥对

接下来,您需要在对等方上使用与服务器上相同的步骤生成密钥对。从将用作对等方的本地计算机或远程服务器上,继续并使用以下命令创建对等方的私钥:

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

您将再次收到一行base64编码的输出,这是私钥。输出的副本也存储在/etc/wireguard/private.key中。请仔细记下输出的私钥,因为您稍后需要将其添加到WireGuard的配置文件中。

接下来使用以下命令创建公钥文件:

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

您将再次收到一行base64编码的输出,这是您的WireGuard对等方的公钥。将其复制到某个地方以供参考,因为您需要将公钥分发给WireGuard服务器,以建立加密连接。

创建WireGuard对等端的配置文件

现在您拥有一对密钥,您可以为对等端创建一个配置文件,其中包含所有需要建立与WireGuard服务器连接的信息。

您将需要一些配置文件的信息:

  • 在对等端上生成的base64编码的私钥。

  • 您在WireGuard服务器上定义的IPv4和IPv6地址范围。

  • 来自WireGuard服务器的base64编码的公钥。

  • WireGuard服务器的公共IP地址和端口号。通常这将是IPv4地址,但如果您的服务器有IPv6地址并且您的客户端机器与互联网有IPv6连接,则可以使用IPv6代替IPv4。

将所有这些信息在手上,使用 nano 或您偏好的编辑器,在 WireGuard Peer 机器上打开一个新的 /etc/wireguard/wg0.conf 文件:

  1. sudo nano /etc/wireguard/wg0.conf

将以下行添加到文件中,在需要时将各种数据替换到突出显示的部分:

/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_peer_private_key_goes_here Address = 10.8.0.2/24 Address = fd24:609a:6c18::2/64 [Peer] PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= AllowedIPs = 10.8.0.0/24, fd24:609a:6c18::/64 Endpoint = 203.0.113.1:51820

请注意,第一个 Address 行使用了您之前选择的 10.8.0.0/24 子网中的一个 IPv4 地址。只要与服务器的 IP 不同,此 IP 地址可以是子网中的任何内容。每次添加对等体时递增地址 1 通常是分配 IP 的最简单方式。

同样,注意第二个 Address 行使用了您之前生成的子网中的一个 IPv6 地址,并递增服务器的地址。如果您决定使用不同的地址,那么范围内的任何 IP 都是有效的。

文件的另一个值得注意的部分是最后一个 AllowedIPs 行。这两个 IPv4 和 IPv6 范围指示对等体仅在目标系统具有任一范围内的 IP 地址时才通过 VPN 发送流量。使用 AllowedIPs 指令,您可以将对等体上的 VPN 限制为仅连接到 VPN 上的其他对等体和服务,或者您可以配置设置以通过 VPN 隧道所有流量,并使用 WireGuard 服务器作为网关。

如果您只使用 IPv4,则省略尾随的 fd24:609a:6c18::/64 范围(包括 , 逗号)。反之,如果您只使用 IPv6,则仅包括 fd24:609a:6c18::/64 前缀,并省略 10.8.0.0/24 IPv4 范围。

在这两种情况下,如果您希望将所有对等方的流量发送到VPN并使用WireGuard服务器作为所有流量的网关,那么您可以使用0.0.0.0/0代表整个IPv4地址空间,以及::/0代表整个IPv6地址空间。

(可选)配置对等方将所有流量路由到隧道

如果您选择使用0.0.0.0/0::/0路由来将所有对等方的流量路由到隧道,并且对等方是远程系统,则您需要完成本节中的步骤。如果您的对等方是本地系统,则最好跳过本节。

对于您通过SSH或其他协议使用公共IP地址访问的远程对等方,您需要向对等方的wg0.conf文件添加一些额外规则。这些规则将确保您在连接到系统时仍然可以从隧道外部连接到系统。否则,当建立隧道时,所有通常在公共网络接口上处理的流量都不会正确路由到绕过wg0隧道接口,导致远程系统无法访问。

首先,您需要确定系统使用的默认网关的IP地址。运行以下ip route命令:

  1. ip route list table main default

您将收到类似以下的输出:

Output
default via 203.0.113.1 dev eth0 proto static

请注意网关的突出显示的IP地址 203.0.113.1 以备后用,以及设备 eth0。 如果您的设备名称不同,请在下面的命令中用其替换 eth0

接下来,通过使用 ip address show 命令检查设备来查找系统的公共IP:

  1. ip -brief address show eth0

您将收到如下输出:

Output
eth0 UP 203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64

在此示例输出中,突出显示的 203.0.113.5 IP(不包括末尾的 /20)是分配给 eth0 设备的公共地址,您需要将其添加到 WireGuard 配置中。

现在用 nano 或您喜欢的编辑器打开 WireGuard Peer 的 /etc/wireguard/wg0.conf 文件。

  1. sudo nano /etc/wireguard/wg0.conf

[Peer] 行之前,添加以下 4 行:

PostUp = ip rule add table 200 from 203.0.113.5
PostUp = ip route add table 200 default via 203.0.113.1
PreDown = ip rule delete table 200 from 203.0.113.5
PreDown = ip route delete table 200 default via 203.0.113.1

[Peer]
. . .

这些行将创建一个自定义的路由规则,并添加一个自定义路由,以确保系统的公共流量使用默认网关。

  • PostUp = ip rule add table 200 from 203.0.113.5 – 此命令创建一个规则,在IP与系统的公共 203.0.113.5 地址匹配时,检查表号为 200 的任何路由条目。
  • PostUp = ip route add table 200 default via 203.0.113.1 – 此命令确保由 200 表处理的任何流量都将使用 203.0.113.1 网关进行路由,而不是 WireGuard 接口。

PreDown 行会在隧道关闭时移除自定义规则和路由。

注意:构建这些规则时,表号200是任意的。您可以使用介于2和252之间的值,或者您可以通过在/etc/iproute2/rt_tables文件中添加标签,然后引用名称而不是数字值。

有关 Linux 中路由表如何工作的更多信息,请访问Linux IP 层网络管理指南路由表部分

如果您正在通过 VPN 路由所有对等体的流量,请确保您已在第 4 步 — 调整 WireGuard 服务器的网络配置第 5 步 — 配置 WireGuard 服务器的防火墙上配置了正确的sysctliptables规则。

(可选)配置 WireGuard 对等体的 DNS 解析器

如果您正在将 WireGuard 服务器用作所有对等端流量的 VPN 网关,则需要在 [Interface] 部分添加一行,指定 DNS 解析器。如果您不添加此设置,则您的 DNS 请求可能无法通过 VPN 进行安全处理,或者可能会被透露给您的互联网服务提供商或其他第三方。

如果您只是使用 WireGuard 访问 VPN 网络上的资源或进行点对点配置,则可以跳过此部分。

要将 DNS 解析器添加到对等端的配置中,请首先确定您的 WireGuard 服务器正在使用哪些 DNS 服务器。在 WireGuard 服务器 上运行以下命令,替换您的以太网设备名称以代替 eth0,如果它与此示例不同:

  1. resolvectl dns eth0

您应该会收到如下输出:

Output
Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888

输出的 IP 地址是服务器正在使用的 DNS 解析器。您可以选择使用任何一个或全部解析器,或仅根据您的需求选择 IPv4 或 IPv6。记下您将使用的解析器。

接下来,您需要将所选的解析器添加到 WireGuard 对等端的配置文件中。返回到 WireGuard 对等端,使用 nano 或您喜欢的编辑器打开 /etc/wireguard/wg0.conf 文件:

  1. sudo nano /etc/wireguard/wg0.conf

[Peer] 行之前,添加以下内容:

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

再次根据您对 IPv4 和 IPv6 的喜好或要求编辑列表,以符合您的需求。

一旦您在以下步骤中连接到VPN,您可以通过使用类似DNS leak test.com的网站来检查是否通过VPN发送DNS查询。

您还可以通过像您在服务器上运行的resolvectl dns命令来检查对等方是否使用配置的解析器。您应该会收到以下输出,显示您为VPN隧道配置的DNS解析器:

Output
Global: 67.207.67.2 67.207.67.3 . . .

所有这些DNS解析器设置都已就绪,现在您可以将对等方的公钥添加到服务器,然后在对等方上启动WireGuard隧道。

第8步 — 将对等方的公钥添加到WireGuard服务器

在将对等方连接到服务器之前,重要的是将对等方的公钥添加到WireGuard服务器。这一步骤确保您可以连接到VPN并路由流量。如果不完成此步骤,WireGuard服务器将不允许对等方通过隧道发送或接收任何流量。

确保您通过运行以下命令获取WireGuard对等方的base64编码的公钥的副本:

  1. sudo cat /etc/wireguard/public.key
Output
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

现在登录到WireGuard服务器,并运行以下命令:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2

请注意,命令中的allowed-ips部分接受一个逗号分隔的 IPv4 和 IPv6 地址列表。您可以指定单个 IP,如果您想限制对等方可以分配给自己的 IP 地址,或者像示例中那样指定范围,如果您的对等方可以在 VPN 范围内使用任何 IP 地址。还请注意,没有两个对等方可以具有相同的allowed-ips设置。

如果您想更新现有对等方的allowed-ips,可以再次运行相同的命令,但更改 IP 地址。支持多个 IP 地址。例如,要更改刚刚添加的 WireGuard 对等方以添加一个 IP,比如10.8.0.100到现有的10.8.0.2fd24:609a:6c18::2 IP,您将运行以下命令:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2

一旦您运行了添加对等方的命令,请使用wg命令检查服务器上隧道的状态:

  1. sudo wg
Output
interface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (hidden) listening port: 51820 peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128

请注意,peer行显示了 WireGuard 对等方的公钥,以及它被允许使用的 IP 地址或地址范围来分配自己的 IP。

现在您已经在服务器上定义了对等方的连接参数,下一步是启动对等方上的隧道。

第9步 —— 将 WireGuard 对等方连接到隧道

现在您的服务器和对等方都已配置为支持您选择的IPv4、IPv6、数据包转发和DNS解析,是时候将对等方连接到VPN隧道了。

由于您可能只希望在某些用例中使用VPN,我们将使用wg-quick命令手动建立连接。如果您想要像在服务器上那样自动启动隧道,请在步骤6 —— 启动WireGuard服务器部分按照那些步骤进行,而不是使用wq-quick命令。

如果您正在通过VPN路由所有流量并已设置DNS转发,则需要在启动隧道之前在WireGuard对等方上安装resolvconf实用程序。运行以下命令进行设置:

  1. sudo apt install resolvconf

要启动隧道,请在WireGuard对等方上运行以下命令:

  1. sudo wg-quick up wg0

您将收到如下输出:

Output
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x

请注意,这是您为对等方分配的IPv4和IPv6地址。

如果您在对等方上将AllowedIPs设置为0.0.0.0/0::/0(或者使用其他范围而不是您为VPN选择的范围),则输出将类似于以下内容:

Output
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x [#] wg set wg0 fwmark 51820 [#] ip -6 route add ::/0 dev wg0 table 51820 [#] ip -6 rule add not fwmark 51820 table 51820 [#] ip -6 rule add table main suppress_prefixlength 0 [#] ip6tables-restore -n [#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820 [#] ip -4 rule add not fwmark 51820 table 51820 [#] ip -4 rule add table main suppress_prefixlength 0 [#] sysctl -q net.ipv4.conf.all.src_valid_mark=1 [#] iptables-restore -n

在此示例中,请注意命令添加的突出显示的路由,这些路由对应于对等方配置中的AllowedIPs

您可以使用wg命令在对等方上检查隧道的状态:

  1. sudo wg
Output
interface: wg0 public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= private key: (hidden) listening port: 49338 fwmark: 0xca6c peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= endpoint: 203.0.113.1:51820 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64 latest handshake: 1 second ago transfer: 6.50 KiB received, 15.41 KiB sent

您也可以再次在服务器上检查状态,您将收到类似的输出。

验证您的对等方是否使用VPN,可使用ip routeip -6 route命令。如果您正在使用VPN作为所有Internet流量的网关,请检查将用于发送到CloudFlare的1.1.1.12606:4700:4700::1111 DNS解析器的流量的接口。

如果您只是使用WireGuard访问VPN上的资源,请将有效的IPv4或IPv6地址(如网关本身)替换到这些命令中。例如10.8.0.1fd24:609a:6c18::1

  1. ip route get 1.1.1.1
Output
1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache

注意wg0设备的使用以及您分配给对等方的IPv4地址10.8.0.2。同样,如果您正在使用IPv6,请运行以下命令:

  1. ip -6 route get 2606:4700:4700::1111
Output
2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium

再次注意wg0接口,以及您分配给对等方的IPv6地址fd24:609a:6c18::2

如果您的对等方安装了浏览器,您还可以访问ipleak.netipv6-test.com来确认您的对等方是否通过VPN路由其流量。

一旦您准备好从对等方断开VPN连接,可以使用wg-quick命令:

  1. sudo wg-quick down wg0

您将收到如下输出,指示VPN隧道已关闭:

Output
[#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f

如果您在对等方上将AllowedIPs设置为0.0.0.0/0::/0(或者使用除您为VPN选择的范围之外的范围),则您的输出将类似于以下内容:

Output
[#] ip rule delete table 200 from 203.0.113.5 [#] ip route delete table 200 default via 203.0.113.1 [#] ip -4 rule delete table 51820 [#] ip -4 rule delete table main suppress_prefixlength 0 [#] ip -6 rule delete table 51820 [#] ip -6 rule delete table main suppress_prefixlength 0 [#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f [#] iptables-restore -n [#] ip6tables-restore -n

重新连接到VPN,请再次在对等方上运行wg-quick up wg0命令。如果您想要完全删除WireGuard服务器中对等方的配置,您可以运行以下命令,请确保替换为要删除的对等方的正确公钥:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

通常,您只需要删除对等方配置,如果对等方不再存在,或者其加密密钥已被泄露或更改。否则,最好保留配置,以便对等方可以重新连接到VPN,而无需每次都添加其密钥和allowed-ips

结论

在本教程中,您在服务器和客户端Ubuntu 22.04系统上安装了WireGuard软件包和工具。您设置了WireGuard的防火墙规则,并配置了内核设置以允许使用服务器上的sysctl命令进行数据包转发。您学习了如何生成私钥和公钥的WireGuard加密密钥,并学习了如何配置服务器和对等方(或对等方)以相互连接。

如果您的网络使用IPv6,您还学习了如何生成用于对等连接的唯一本地地址范围。最后,您学习了如何通过限制对等方可以使用的网络前缀来限制哪些流量应该通过VPN,并学习了如何使用WireGuard服务器作为VPN网关来处理对等方的所有Internet流量。

如果您想了解更多关于WireGuard的信息,包括如何配置更高级的隧道,或者如何在容器中使用WireGuard,请访问官方WireGuard文档

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-22-04