如何在Ubuntu20.04上设置WireGuard

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

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

在本教程中,您将在 Ubuntu 20.04 服务器上设置 WireGuard,然后将另一台机器配置为使用 IPv4 和 IPv6 连接(通常称为 双栈 连接)作为对等点连接到它。 除了将 VPN 用于加密的对等隧道之外,您还将学习如何在网关配置中通过 WireGuard 服务器路由对等方的 Internet 流量。

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

注意: 如果您打算在 DigitalOcean Droplet 上设置 WireGuard,请注意,我们与许多托管服务提供商一样,会对带宽超额收费。 因此,请注意您的服务器正在处理多少流量。 有关详细信息,请参阅 本页


先决条件

要遵循本教程,您将需要:

  • 一台 Ubuntu 20.04 服务器,具有 sudo 非 root 用户并启用了防火墙。 要进行设置,您可以按照我们的 Initial Server Setup with Ubuntu 20.04 教程进行操作。 在本指南中,我们将其称为 WireGuard 服务器
  • 您需要一台用于连接 WireGuard 服务器的客户端计算机。 在本教程中,我们将把这台机器称为 WireGuard Peer。 出于本教程的目的,建议您使用本地计算机作为 WireGuard Peer,但如果您愿意,也可以使用远程服务器或手机作为客户端。 如果您使用的是远程系统,请务必遵循本教程后面的所有可选部分,否则您可能会将自己锁定在系统之外。
  • 要将 WireGuard 与 IPv6 一起使用,您还需要确保您的服务器配置为支持该类型的流量。 如果您想通过 WireGuard 启用 IPv6 支持并使用 DigitalOcean Droplet,请参阅此文档页面 如何在 Droplets 上启用 IPv6。 您可以在创建 Droplet 时添加 IPv6 支持,或者之后使用该页面上的说明添加。

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

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

sudo apt update
sudo apt install wireguard

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

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

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

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

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

您应该收到单行 base64 编码输出,即私钥。 输出的副本也存储在 /etc/wireguard/private.key 文件中,以供命令的 tee 部分将来参考。 仔细记下输出的私钥,因为您需要在本节后面将其添加到 WireGuard 的配置文件中。

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

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 服务器的公钥。 将其复制到某处以供参考,因为您需要将公钥分发给连接到服务器的任何对等方。

第 2 步 — 选择 IPv4 和 IPv6 地址

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

如果您计划同时使用 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 地址作为其私有隧道 IPv4 地址。 我们将在这里使用 10.8.0.1/24,但可以使用 10.8.0.110.8.0.255 范围内的任何地址。 如果您使用与 10.8.0.1/24 不同的 IP 地址,请记下您选择的 IP 地址。 您将将此 IPv4 地址添加到您在 步骤 3 — 创建 WireGuard 服务器配置 中定义的配置文件中。

步骤 2(b) — 选择 IPv6 范围

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

根据 RFC,获得唯一 IPv6 前缀的推荐方法是将时间与来自系统的唯一标识值(如序列号或设备 ID)结合起来。 然后对这些值进行散列和截断,生成一组位,这些位可用作保留的私有 fd00::/8 IP 块中的唯一地址。

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

date +%s%N

您将收到如下所示的数字,即自 1970 年 1 月以来的秒数(date 命令中的 %s)和纳秒(%N) 01 00:00:00 UTC 结合在一起:

Output1628101352127592197

在某处记录该值以供本节稍后使用。 接下来,从 /var/lib/dbus/machine-id 文件中复制服务器的 machine-id 值。 此标识符对您的系统是唯一的,只要服务器存在,就不应更改。

cat /var/lib/dbus/machine-id

您将收到如下输出:

/var/lib/dbus/machine-id20086c25853947c7aeee2ca1ea849d7d

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

printf <timestamp><machine-id> | sha1sum

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

printf 162810135212759219720086c25853947c7aeee2ca1ea849d7d | sha1sum

您将收到如下所示的哈希值:

Output4f267c51857d6dc93a0bca107bca2f0d86fac3bc  -

注意 sha1sum 命令的输出是十六进制的,所以输出使用两个字符来表示一个字节的数据。 例如,示例输出中的 4f26 是散列数据的前两个字节。

RFC 中的算法只需要散列输出的最低有效(尾随)40 位或 5 个字节。 使用 cut 命令从散列中打印最后 5 个十六进制编码字节:

printf 4f267c51857d6dc93a0bca107bca2f0d86fac3bc | cut -c 31-

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

您应该收到如下输出:

Output0d86fac3bc

在此示例输出中,字节集为:0d 86 fa c3 bc

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

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

Unique Local IPv6 Address Prefixfd0d:86fa:c3bc::/64

这个 fd0d:86fa:c3bc::/64 范围是您将用于将单独的 IP 地址分配给服务器和对等方上的 WireGuard 隧道接口的范围。 要为服务器分配 IP,请在最后的 :: 字符后添加 1。 结果地址将是 fd0d:86fa:c3bc::1/64。 对等点可以使用范围内的任何 IP,但通常每次添加对等点时您都会将该值增加一,例如 fd0d:86fa:c3bc::2/64。 记下 IP 并在本教程的下一部分继续配置 WireGuard 服务器。

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

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

  1. 确保您拥有 步骤 1 — 安装 WireGuard 并生成密钥对 中可用的私钥。
  2. 如果您将 WireGuard 与 IPv4 一起使用,则需要在 步骤 2(a) — 选择 IPv4 范围 中为服务器选择的 IP 地址,在本例中为 10.8.0.1/24 .
  3. 如果您将 WireGuard 与 IPv6 一起使用,您将需要在 步骤 2(b) — 选择 IPv6 范围 中生成的服务器的 IP 地址。 在此示例中,IP 为 fd0d:86fa:c3bc::1/64

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

sudo nano /etc/wireguard/wg0.conf

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

/etc/wireguard/wg0.conf[Interface]
PrivateKey = base64_encoded_private_key_goes_here
Address = 10.8.0.1/24, fd0d:86fa:c3bc::1/64
ListenPort = 51820
SaveConfig = true

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

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

第 4 步 — 调整 WireGuard 服务器的网络配置

如果您使用 WireGuard 将对等点连接到 WireGuard 服务器以便仅访问 服务器上的服务 ,则无需完成此部分。 如果您想通过 WireGuard 服务器路由您的 WireGuard Peer 的 Internet 流量,那么您需要按照本教程的这一部分配置 IP 转发。

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

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,请确保包含这两行。 完成后保存并关闭文件。

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

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

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

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

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

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

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

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

ip route list default

公共接口是在该命令的输出中找到的跟在单词“dev”后面的字符串。 例如,这个结果显示了名为 eth0 的接口,它在下面突出显示:

Outputdefault via 203.0.113.1 dev eth0 proto static

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

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

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

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

  • ufw route allow in on wg0 out on eth0 - 此规则将允许将进入 wg0 VPN 接口的 IPv4 和 IPv6 流量转发到服务器上的 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 命令。 对于 IPv4 和 IPv6 网络的任意组合,应该存在 ufw 行。 完成后保存并关闭文件。

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

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

sudo ufw allow 51820/udp
sudo ufw allow OpenSSH

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


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

sudo ufw disable
sudo ufw enable

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

sudo ufw status
OutputStatus: 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 服务运行。 虽然您可以在每次想要使用 VPN 时手动使用 wg 命令创建隧道,但这样做是一个手动过程,会变得重复且容易出错。 相反,您可以使用 systemctlwg-quick 脚本的帮助下管理隧道。

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

sudo systemctl enable wg-quick@wg0.service

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

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


现在启动服务:

sudo systemctl start wg-quick@wg0.service

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

sudo systemctl status wg-quick@wg0.service
Output● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
     Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
     Active: active (exited) since Wed 2021-08-25 15:24:14 UTC; 5s 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: 3245 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
   Main PID: 3245 (code=exited, status=0/SUCCESS)

Aug 25 15:24:14 wg0 wg-quick[3245]: [#] wg setconf wg0 /dev/fd/63
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip -4 address add 10.8.0.1/24 dev wg0
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip -6 address add fd0d:86fa:c3bc::1/64 dev wg0
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip link set mtu 1420 up dev wg0
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ufw route allow in on wg0 out on eth0
Aug 25 15:24:14 wg0 wg-quick[3279]: Rule added
Aug 25 15:24:14 wg0 wg-quick[3279]: Rule added (v6)
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Aug 25 15:24:14 wg0 systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

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

配置并运行服务器后,下一步是将您的客户端计算机配置为 WireGuard Peer 并连接到 WireGuard 服务器。

第 7 步 — 配置 WireGuard 对等体

配置 WireGuard 对等点类似于设置 WireGuard 服务器。 安装客户端软件后,您将生成公钥和私钥对,确定对等方的一个或多个 IP 地址,为对等方定义配置文件,然后使用 [X225X ] 脚本。

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

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

sudo apt update
sudo apt install wireguard

创建 WireGuard Peer 的密钥对

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

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

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

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

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

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

创建 WireGuard Peer 的配置文件

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

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

  • 您在对等方生成的 base64 编码私钥。
  • 您在 WireGuard 服务器上定义的 IPv4 和 IPv6 地址范围。
  • 来自 WireGuard 服务器的 base64 编码公钥。
  • WireGuard 服务器的公共 IP 地址和端口号。 通常这将是 IPv4 地址,但如果您的服务器具有 IPv6 地址并且您的客户端计算机具有与 Internet 的 IPv6 连接,您可以使用它来代替 IPv4。

掌握所有这些信息后,使用 nano 或您喜欢的编辑器在 WireGuard Peer 机器上打开一个新的 /etc/wireguard/wg0.conf 文件:

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 = fd0d:86fa:c3bc::2/64

[Peer]
PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
AllowedIPs = 10.8.0.0/24, fd0d:86fa:c3bc::/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,则省略结尾的 fd0d:86fa:c3bc::/64 范围(包括 , 逗号)。 相反,如果您仅使用 IPv6,则仅包含 fd0d:86fa:c3bc::/64 前缀并省略 10.8.0.0/24 IPv4 范围。

在这两种情况下,如果您想通过 VPN 发送所有对等方的流量并将 WireGuard 服务器用作所有流量的网关,那么您可以使用 0.0.0.0/0,它代表整个 IPv4 地址空间,并且 [ X217X] 用于整个 IPv6 地址空间。

(可选)配置对等体通过隧道路由所有流量

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

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

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

ip route list table main default

您将收到如下输出:

Outputdefault via 203.0.113.1 dev eth0 proto static

请注意网关突出显示的 IP 地址 203.0.113.1 以供以后使用,以及设备 eth0。 您的设备名称可能不同。 如果是这样,请将其替换为以下命令中的 eth0

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

ip -brief address show eth0

您将收到如下输出:

Outputeth0             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 文件。

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 服务器的网络配置中的 WireGuard 服务器上配置了正确的 sysctliptables 规则步骤 5 — 配置 WireGuard 服务器的防火墙

(可选)配置 WireGuard Peer 的 DNS 解析器

如果您将 WireGuard 服务器用作所有对等方流量的 VPN 网关,则需要在 [Interface] 部分添加一行来指定 DNS 解析器。 如果您不添加此设置,则您的 DNS 请求可能不受 VPN 保护,或者它们可能会泄露给您的 Internet 服务提供商或其他第三方。

如果您仅使用 WireGuard 访问 VPN 网络或点对点配置中的资源,则可以跳过本节。

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

resolvectl dns eth0

您应该收到如下输出:

OutputLink 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888

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

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

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 解析器:

OutputGlobal: 67.207.67.2 67.207.67.3
. . .

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

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

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

通过运行以下命令确保您拥有 WireGuard Peer 的 base64 编码公钥的副本:

sudo cat /etc/wireguard/public.key
OutputPeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

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

sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd0d:86fa:c3bc::2

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

如果您想更新现有对等方的 allowed-ips,可以再次运行相同的命令,但更改 IP 地址。 支持多个 IP 地址。 例如,要更改您刚刚添加的 WireGuard Peer,将 10.8.0.100 之类的 IP 添加到现有的 10.8.0.2fd0d:86fa:c3bc::2 IP,您将运行以下命令:

sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd0d:86fa:c3bc::2

运行添加对等点的命令后,使用 wg 命令检查服务器上隧道的状态:

sudo wg
Outputinterface: wg0
 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
 private key: (hidden)
 listening port: 51820

peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
 allowed ips: 10.8.0.2/32, fd0d:86fa:c3bc::/128

请注意 peer 行如何显示 WireGuard Peer 的公钥,以及 IP 地址或允许它用来为自己分配 IP 的地址范围。

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

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

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

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

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

sudo apt install resolvconf

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

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 fd0d:86fa:c3bc::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 fd0d:86fa:c3bc::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 命令检查对等体上隧道的状态:

sudo wg
Outputinterface: 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, fd0d:86fa:c3bc::/64
 latest handshake: 1 second ago
 transfer: 6.50 KiB received, 15.41 KiB sent

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

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

如果您仅使用 WireGuard 访问 VPN 上的资源,请将网关本身等有效的 IPv4 或 IPv6 地址替换为这些命令。 例如 10.8.0.1fd0d:86fa:c3bc::1


ip route get 1.1.1.1
Output1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
   cache

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

ip -6 route get 2606:4700:4700::1111
Output2606:4700:4700::1111 from :: dev wg0 table 51820 src fd0d:86fa:c3bc::2 metric 1024 pref medium

再次注意 wg0 接口,以及您分配给对等方的 IPv6 地址 fd0d:86fa:c3bc::2

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

一旦您准备好与对等方的 VPN 断开连接,请使用 wg-quick 命令:

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 服务器中完全删除对等点的配置,可以运行以下命令,确保用正确的公钥替换要删除的对等点:

sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

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

结论

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

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

如果您想了解有关 WireGuard 的更多信息,包括如何配置更高级的隧道,或将 WireGuard 与容器一起使用,请访问 官方 WireGuard 文档