如何在 Ubuntu 20.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。

先决条件

要学习本教程,您需要:

  • 一台 Ubuntu 20.04 服务器,具有 sudo 非 root 用户并启用了防火墙。我们将在本指南中将其称为WireGuard 服务器
  • 您将需要一台用于连接到 WireGuard 服务器的客户端计算机。在本教程中,我们将这台机器称为WireGuard Peer。出于本教程的目的,建议您使用本地机器作为 WireGuard Peer,但如果您愿意,也可以使用远程服务器或手机作为客户端。如果您使用的是远程系统,请务必遵循本教程后面的所有可选部分,否则您可能会将自己锁定在系统之外。
  • 要将 WireGuard 与 IPv6 一起使用,您还需要确保您的服务器配置为支持该类型的流量。

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

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

sudo apt update
sudo apt install wireguard

复制

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

由于您将创建一个用于加密 WireGuard 服务器上的流量的私钥,因此在创建此文件之前,需要将应用于新文件的默认权限临时更改为更具限制性的值。您需要使用umask命令为新创建的文件设置默认权限。

使用以下umask命令确保以有限的读写权限创建新目录和文件(仅在您当前的终端会话中):

umask 077

复制

A umaskof077将确保只有目录的所有者才能进入其中,并且只有文件的所有者才能对其进行读取或写入。再次注意,当您退出 shell 并重新登录时,您umask将被重置为默认022值,这允许对系统上创建的任何新文件进行读取访问。

现在您可以继续使用以下命令为 WireGuard 创建私钥:

wg genkey | sudo tee /etc/wireguard/private.key

复制

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

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

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

复制

此命令由三个单独的命令组成,这些命令使用|(pipe) 运算符链接在一起:

  • 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.1to范围内的任何地址10.8.0.255。如果您使用不同于10.8.0.1/24. 您将将此 IPv4 地址添加到您在步骤 3 — 创建 WireGuard 服务器配置中定义的配置文件中。

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

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

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

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

date +%s%N

复制

将收到的数象下文中,它是(所述的秒数%sdate命令),以及纳秒(所述%N),因为1970-01-01 0时00分零零秒UTC结合在一起:

Output1628101352127592197

在某处记录该值以供本节稍后使用。接下来,machine-id/var/lib/dbus/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 个字节附加到前缀中来构建您唯一的 IPv6 网络前缀fd,每2个字节用:冒号分隔以提高可读性。因为您的唯一前缀中的每个子网总共可以容纳 18,446,744,073,709,551,616 个可能的 IPv6 地址,所以/64为了简单起见,您可以将子网限制为标准大小。

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

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

步骤 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值,以及行中的 IP 地址AddressListenPort如果您希望 WireGuard 在不同的端口上可用,您也可以更改线路:

/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 转发。

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

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 以太网设备的传入流量转发到服务器上的其他设备,并从那里转发到公共 Internet。使用此配置将允许您通过服务器的 IP 地址从 WireGuard Peer 路由所有网络流量,并且您的客户端的公共 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 服务器,请再次/etc/wireguard/wg0.conf使用nano或您首选的编辑器打开该文件。

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- 此规则将允许将进入wg0VPN 接口的IPv4 和 IPv6 流量转发到eth0服务器上的网络接口。它与您在上一节中配置的net.ipv4.ip_forwardnet.ipv6.conf.all.forwardingsysctl 值结合使用。
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE- 此规则配置伪装,并重写进入wg0VPN 接口的IPv4 流量,使其看起来像是直接来自 WireGuard 服务器的公共 IPv4 地址。
  • ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE- 此规则配置伪装,并重写进入wg0VPN 接口的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 端口,请在此处添加:

sudo ufw allow 51820/udp
sudo ufw allow OpenSSH

复制

注意:如果您使用不同的防火墙或自定义了 UFW 配置,则可能需要添加其他防火墙规则。例如,如果你决定隧道所有的网络流量通过VPN连接,你需要确保端口53流量允许DNS请求,而像港口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 可以配置为systemd使用其内置wg-quick脚本作为服务运行。虽然您可以wg在每次想要使用 VPN 时手动使用该命令创建隧道,但这样做是一个手动过程,会变得重复且容易出错。相反,您可以借助脚本systemctl来管理隧道wg-quick

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

sudo systemctl enable wg-quick@wg0.service

复制

请注意,该命令将隧道wg0设备名称的名称指定为服务名称的一部分。此名称映射到配置文件。这种命名方法意味着您可以根据需要使用服务器创建任意数量的独立 VPN 隧道。/etc/wireguard/wg0.conf例如,您可能有一个隧道设备和名称,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.

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

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

步骤 7 — 配置 WireGuard Peer

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

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

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

sudo apt update
sudo apt install wireguard

复制

创建 WireGuard Peer 的密钥对

接下来,您需要使用在服务器上使用的相同步骤在对等方上生成密钥对。从将充当对等方的本地计算机或远程服务器,运行以下命令将 设置umask077

umask 077

复制

现在,您可以继续使用以下命令为对等方创建私钥:

wg genkey | sudo tee /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 地址范围。
  • base64来自 WireGuard 服务器的编码公钥。
  • WireGuard 服务器的公共 IP 地址和端口号。通常这将是 IPv4 地址,但如果您的服务器具有 IPv6 地址并且您的客户端计算机具有到 Internet 的 IPv6 连接,您可以使用它而不是 IPv4。

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

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 地址,并将服务器地址加 1。同样,如果您决定使用不同的地址,该范围内的任何 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/24IPv4 范围。

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

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

如果您选择使用0.0.0.0/0or::/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.5IP(不带尾随/20)是分配给eth0您需要添加到 WireGuard 配置的设备的公共地址。

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

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- 此命令创建一个规则,用于检查200IP 与系统公共203.0.113.5地址匹配时编号的表中的任何路由条目。
  • 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的路由表是如何工作的访问更多信息路由表节的的指南IP层网络管理使用Linux

如果您的路由通过VPN所有同行的交通,确保你已经配置了正确的sysctliptables在规则WireGuard服务器上的第4步-调整WireGuard服务器的网络配置和第5步-配置WireGuard服务器的防火墙。

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

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

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

要将 DNS 解析器添加到对等方的配置中,请首先确定您的 WireGuard 服务器正在使用哪些 DNS 服务器。在WireGuard Server上运行以下命令,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/etc/wireguard/wg0.conf使用nano或您喜欢的编辑器打开文件:

sudo nano /etc/wireguard/wg0.conf

复制

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

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

同样,根据您对 IPv4 和 IPv6 的偏好或要求,您可以根据需要编辑列表。

在以下步骤中连接到 VPN 后,您可以使用DNS 泄漏 test.com 之类的站点检查您是否正在通过 VPN 发送 DNS 查询。您还可以使用resolvectl dns您在服务器上运行的命令来检查您的对等方是否正在使用配置的解析器。您应该会收到如下输出,其中显示了您为 VPN 隧道配置的 DNS 解析器:OutputGlobal: 67.207.67.2 67.207.67.3 . . .

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

步骤 8 — 将 Peer 的公钥添加到 WireGuard 服务器

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

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

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同行刚才添加添加一个IP像10.8.0.100现有10.8.0.2fd0d:86fa:c3bc::2IP地址,你会运行以下命令:

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 Peer 连接到隧道

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

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

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

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 流量的网关,请检查哪个接口将用于以 CloudFlare1.1.1.12606:4700:4700::1111DNS 解析器为目的地的流量。

如果您仅使用 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已使用设备以及10.8.0.2您分配给对等方的 IPv4 地址。同样,如果您使用的是 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 流量。

Z2ER大部分下载资源收集于网络,只做学习和交流使用,版权归原作者所有,请在下载后24小时之内自觉删除,若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与Z2ER无关。本站发布的内容若侵犯到您的权益,请联系z2er@z2er.com删除,将及时处理!
Z2ER » 如何在 Ubuntu 20.04 上设置 WireGuard