如何在 Debian 11 上设置 WireGuard

介绍

WireGuard是一个支持IPv4和IPv6连接的轻量级虚拟私人网络(VPN)。一个VPN允许你穿过不受信任的网络,就像你在私人网络上一样。它为你提供从智能手机或笔记本电脑安全地访问互联网的自由,当你连接到不受信任的网络,如酒店或咖啡店的WiFi。你可能还想部署一个VPN来访问自己的基础设施,以免你需要离开SSH或其他敏感端口打开,类似于Tailscale(https://tailscale.com/)的工作方式。

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

相比之下,其他 VPN 软件如 OpenVPNIPSec使用 Transport Layer Security (TLS) 和证书来验证和在系统之间建立加密隧道。 TLS 的不同版本包括支持数百种不同的加密套件和算法,虽然这允许支持不同客户端的巨大灵活性,但它也使得使用 TLS 的 VPN 配置更耗时、复杂和容易出现错误。

在本教程中,您将在 Debian 11 服务器上设置 WireGuard,然后配置另一台机器以使用 IPv4 和 IPv6 连接(通常称为 dual stack 连接)连接为同行连接。

对于本教程的目的,我们将配置另一个 Debian 11 系统作为 WireGuard 服务器的同行(也称为客户端)。

<$>[注] 注: 如果您打算在DigitalOcean Droplet上设置WireGuard,请注意,我们和许多托管提供商一样,会收取带宽超过的费用。

前提条件

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

  • 1台Debian 11服务器,设有Sudo非root用户并启用了防火墙. 要设置此选项, 您可以跟随我们的 [Initial Server setup with Debian 11] (https://andsky.com/tech/tutorials/initial-server-setup-with-debian-11) 教程 。 我们将在本指南中将此称为WireGuard Server。 (_) ( )* 您需要一台客户端机, 用于连接您的网络守护服务器 。 在此教程中,我们称这台机器为"WireGuard Per". 为本教程的目的,建议您使用本地机作为"线导同级"(WireGuard Peer),但您可以使用远程服务器,或手机作为客户端,如果您愿意的话. 如果您正在使用远程系统, 请务必跟随此教程中稍后的所有可选段落, 否则您可能把自己锁出系统 。 ( ) ( )* 要使用 IPv6 的 WireGuard , 您还需要确保您的服务器配置能够支持该类型的流量 。 如果您想在WireGuard上启用 IPv6 支持并使用 DigitalOcean Droplet, 请参考此文档页面[如何在 Droplets 上启用 IPv6 (https://docs.digitalocean.com/products/networking/ipv6/how-to/enable/) 。 您可以在创建 Droplet 时添加 IPv6 支持, 或在之后使用该页面上的指令 。 () (英语)

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

本教程的第一步是在您的服务器上安装 WireGuard. 要开始,请更新您的 WireGuard Server 包索引并使用以下命令安装 WireGuard. 如果您第一次在本会话中使用sudo,您可能会被要求提供您的 sudo 用户密码:

1[environment second]
2sudo apt update
3sudo apt install wireguard

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

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

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

1[environment second]
2wg genkey | sudo tee /etc/wireguard/private.key
3sudo chmod go= /etc/wireguard/private.key

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

您应该收到一个单行的base64编码的输出,这是私钥。 输出的副本也存储在/etc/wireguard/private.key文件中,以便在命令的tee部分进一步参考。

下一步是创建相应的公共密钥,该密钥来自私钥,使用以下命令创建公共密钥文件:

1[environment second]
2sudo 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.:最后命令将公钥生成命令的输出带到名为 /etc/wireguard/public.key_( )的文件中。

当您运行命令时,您将再次收到一个单行的base64加密输出,这是您的WireGuard服务器的公共密钥。

第2步:选择IPv4和IPv6地址

在上一节中,您安装了 WireGuard,并生成了一对密钥对,用于加密服务器的流量。在本节中,您将为服务器创建配置文件,并设置 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 服务器将为其私人隧道 IPv4 地址从范围中使用单一的 IP 地址。我们将在这里使用 10.8.0.1/24',但可以在 10.8.0.110.8.0.255' 的范围内使用任何地址。 如果您使用了 `10.8.0.1/24' 以外的任何东西,请记住您选择的 IP 地址。您将将此 IPv4 地址添加到您在 [步骤 3 - 创建 WireGuard 服务器配置] 中定义的配置文件(#步骤-3%E2%80%94-creating-a-wireguard-server-configuration)。

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

如果您正在与 IPv6 一起使用 WireGuard,那么您需要基于 RFC 4193中的算法生成一个独特的本地 IPv6 unicast 地址前缀。 与 WireGuard Server 一起使用的地址将与虚拟隧道接口相关联。

根据RFC,获得唯一的IPv6前缀的建议方式是将白天的时间与系统的唯一标识值相结合,例如序列号或设备ID。

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

1[environment second]
2date +%s%N

您将收到一个数字,如下,即秒数(日期命令中的%s)和纳米秒数(%N)自1970-01 00:00:00 UTC结合在一起:

1[secondary_label Output]
21650301699497770167

然后,从 /var/lib/dbus/machine-id 文件中复制您的服务器的 machine-id 值。

1[environment second]
2cat /var/lib/dbus/machine-id

您将收到如下的输出:

1[secondary_label /var/lib/dbus/machine-id]
2610cef4946ed46da8f71dba9d66c67fb

现在你需要将时刻印与机器-id相结合,并使用 SHA-1 算法对结果的值进行哈希。

1printf <timestamp><machine-id> | sha1sum

在您的时刻印和机器身份值中运行代替命令:

1[environment second]
2printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum

您将收到如下 hash 值:

1[secondary_label Output]
2442adea1488d96388dae9ab816045b24609a6c18  -

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

RFC 中的算法只需要哈希输出中最少显著的 40 位(或 5 个字节),使用 cut 命令从哈希中打印最后 5 个六十字节编码的字节:

1[environment second]
2printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-

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

您应该获得如下类型的输出:

1[secondary_label Output]
224609a6c18

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

现在你可以通过附加你用fd前缀生成的5个字节来构建你独特的IPv6网络前缀,将每个 2字节与一个:字符串分开,以便可读性。

使用以 `/64’ 子网大小的先前生成的字节,结果的序列将如下:

1[secondary_label Unique Local IPv6 Address Prefix]
2fd24:609a:6c18::/64

fd24:609a:6c18::/64 範圍是您將用來將個別 IP 地址分配到您的 WireGuard 隧道接口在伺服器和同行. 為伺服器分配一個 IP,在最終 :: 字符後添加一個 1。 結果的地址將是 fd24:609a:6c18::1/64. 同行可以使用該範圍中的任何 IP,但通常你會每次添加同行時增加一個值,例如 fd24:609a:6c18::2/64`。 記住 IP 並在本教程的下一節進行 WireGuard 伺服器的設定。

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

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

  1. 请确保您有从 步骤 1 — 安装 WireGuard 和生成密钥对提供的私钥。
  2. 如果您正在使用 WireGuard 与 IPv4 一起,则需要您在 [步骤 2(a) — 选择 IPv4 范围]中为服务器选择的 IP 地址(#步骤-2-a-%E2%80%94-choosing-an-ipv4 范围),这在本示例中是 10.8.0.1/24
  3. 如果您正在使用 WireGuard 与 IPv6,则您需要您在 [步骤 2(b) — 选择 IPv6

一旦您有所需的私钥和 IP 地址(s),请使用nano或您喜爱的编辑器创建一个新的配置文件,运行以下命令:

1[environment second]
2sudo nano /etc/wireguard/wg0.conf

将下列行添加到文件中,取代您的私钥,而不是突出的 base64_encoded_private_key_goes_here 值,以及在 Address 行上的 IP 地址。

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

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

保存并关闭/etc/wireguard/wg0.conf文件. 如果您正在使用nano,您可以使用CTRL+X,然后YENTER来确认。

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

如果您正在使用 WireGuard 将同行连接到 WireGuard 服务器,以便只访问服务器上的服务,那么您不需要完成本节。

要配置转发,请在您的 Wireguard 服务器上打开 /etc/sysctl.conf 文件,使用 `nano' 或您偏好的编辑器:

1[environment second]
2sudo nano /etc/sysctl.conf

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

1[environment second]
2[label /etc/sysctl.conf]
3net.ipv4.ip_forward=1

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

1[environment second]
2[label /etc/sysctl.conf]
3net.ipv6.conf.all.forwarding=1

如果您正在使用 IPv4 和 IPv6,请确保包含两行。

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

1[environment second]
2sudo sysctl -p
1[environment second]
2[secondary_label Output]
3net.ipv6.conf.all.forwarding = 1
4net.ipv4.ip_forward = 1

现在,您的 WireGuard 服务器将能够将从虚拟 VPN 以太网设备传输的流量传输到服务器上的其他设备,并从那里传输到公共互联网。

然而,在通过您的服务器正确导航流量之前,您需要配置一些防火墙规则,这些规则将确保流量从您的 WireGuard 服务器和同行流通正常。

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

在本节中,您将编辑 WireGuard 服务器的配置,以添加防火墙规则,以确保流量向和从服务器和客户端进行正确的路由。

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

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

1[environment second]
2ip route list default

公用接口是该命令输出中所发现的字符串,该字符串跟随dev。 例如,此结果显示了名为eth0的接口,该接口在下面突出显示:

1[environment second]
2[secondary_label Output]
3default via 203.0.113.1 dev eth0 proto static

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

若要将防火墙规则添加到您的 WireGuard 服务器中,请重新打开 /etc/wireguard/wg0.conf 文件,使用 nano 或您偏好的编辑器。

1[environment second]
2sudo nano /etc/wireguard/wg0.conf

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

1[environment second]
2[secondary_label /etc/wireguard/wg0.conf]
3. . .
4PostUp = ufw route allow in on wg0 out on eth0
5PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
6PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
7PreDown = ufw route delete allow in on wg0 out on eth0
8PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
9PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

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

  • ufw路由允许在 wg0 上输出 eth0 - 此规则将允许将您在前一节配置的 IPv4 和 IPv6 流量传输到 wg0 VPN 接口到服务器上的 eth0 网络接口。 它与 net.ipv4.ip_forward 和 `net.ipv6.conf.all.forwarding' 的 sysctl 值一起工作。
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE - 此规则配置隐藏,并重写在 wg0 VPN 接口中的 IPv4 流量,使其看起来像它直接来自 WireGuard 服务器的公共 IPv4 地址(_M

预下载规则在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 端口,请在这里添加它:

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

如果您正在使用不同的防火墙或已定制您的 UFW 配置,您可能需要添加额外的防火墙规则。例如,如果您决定通过 VPN 连接隧道您的所有网络流量,您需要确保端口 53 流量被允许用于 DNS 请求,以及对 HTTP 和 HTTPS 流量的端口如 80 和 443 相应。

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

1[environment second]
2sudo ufw disable
3sudo ufw enable

您可以通过运行ufw status命令来确认规则的存在,然后运行它,您应该收到如下输出:

1[environment second]
2sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
651280/udp ALLOW Anywhere                  
722/tcp ALLOW Anywhere                  
851280/udp (v6)             ALLOW Anywhere (v6)             
922/tcp (v6)                ALLOW Anywhere (v6)

您的 WireGuard 服务器现在已配置为正确处理 VPN 流量,包括向同行传输和隐藏。有了防火墙规则,您可以启动 WireGuard 服务本身来收听同行连接。

步骤 6 – 启动 WireGuard 服务器

WireGuard可以配置为使用其内置的wg-quick脚本作为systemd服务运行,而你可以手动使用wg命令创建隧道,每次你想要使用VPN,但这样做是一个手动的过程,会变得重复性和容易出现错误。

使用systemd服务意味着您可以将WireGuard配置为在启动时启动,以便在服务器运行时随时连接到VPN。

1[environment second]
2sudo systemctl enable [email protected]

<$>[info] 请注意,该命令指定隧道 wg0 设备名称作为服务名称的一部分。这个名称将地图到 /etc/wireguard/wg0.conf 配置文件。这个命名方法意味着您可以创建尽可能多的单独的 VPN 隧道,如您希望使用您的服务器。

例如,你可以有一个隧道设备,名称为prod,其配置文件将是/etc/wireguard/prod.conf。每个隧道配置可能包含不同的IPv4,IPv6和客户端防火墙设置。

现在开始服务:

1[environment second]
2sudo systemctl start [email protected]

重复检查WireGuard服务是否在下面的命令中运行,您应该在输出中看到`活跃(运行):

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

输出显示了用于创建虚拟wg0设备的ip命令,并将您添加到配置文件的IPv4和IPv6地址分配给它,您可以使用这些规则来解决隧道问题,或者使用wg命令本身,如果你想尝试手动配置VPN接口。

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

步骤 7 – 配置 WireGuard 同行

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

您可以通过使用以下步骤生成一个密钥对和配置来添加您想要的尽可能多的同行到您的VPN,如果您将多个同行添加到VPN,请确保跟踪他们的私人IP地址以防止碰撞。

要配置 WireGuard Peer,请确保您使用以下apt命令安装了 WireGuard 包。

1[environment local]
2sudo apt update
3sudo apt install wireguard

创建 WireGuard Peer 密钥对

接下来,您需要使用您在服务器上使用的相同步骤生成同一对钥匙,从您的本地机器或将作为同行的远程服务器,继续使用以下命令创建同行的私钥:

1[environment local]
2wg genkey | sudo tee /etc/wireguard/private.key
3sudo chmod go= /etc/wireguard/private.key

再一次,您将收到一个单行的base64加密输出,即私钥。 输出副本也存储在/etc/wireguard/private.key中。

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

1[environment local]
2sudo 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 地址,您的客户端机有 IPv6 连接到互联网,您可以使用这个代替 IPv4

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

1[environment local]
2sudo nano /etc/wireguard/wg0.conf

将下列行添加到文件中,根据需要在各个数据中替换为突出部分:

 1[environment local]
 2[secondary_label /etc/wireguard/wg0.conf]
 3[Interface]
 4PrivateKey = base64_encoded_peer_private_key_goes_here
 5Address = 10.8.0.**2**/24
 6Address = fd24:609a:6c18::**2**/64
 7
 8[Peer]
 9PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
10AllowedIPs = 10.8.0.0/24, fd24:609a:6c18::/64
11Endpoint = 203.0.113.1:51820

注意第一个地址行如何使用您之前选择的10.8.0.0/24子网的IPv4地址。这个IP地址可以是子网中的任何东西,只要它与服务器的IP不同。

同样,注意第二行地址如何使用您先前生成的子网的 IPv6 地址,并将服务器的地址增加一个。

文件的另一个值得注意的部分是最后一行AllowedIPs。这两个IPv4和IPv6范围指示同行只通过VPN发送流量,如果目标系统在两个范围内都有IP地址。使用AllowedIPs指令,您可以限制同行上的VPN仅连接到VPN上的其他同行和服务,或者您可以配置设置以隧道整个VPN上的流量,并使用WireGuard服务器作为门户。

如果您只使用 IPv4,请忽略后续的 fd24:609a:6c18::/64 范围(包括 , 段)。

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

(可选)配置 peer 来路由隧道上的所有流量

如果您选择使用0.0.0.0/0::/0路径将所有同行流量通过隧道路由,而同行是远程系统,那么您需要完成本节中的步骤。

对于您通过 SSH 或其他协议使用公共 IP 地址访问的远程同行,您需要为同行的 'wg0.conf' 文件添加一些额外的规则. 这些规则将确保您在连接隧道时仍然可以从隧道外部连接到同行系统。

首先,您需要确定同行系统使用的IP地址作为默认网关。

1[environment local]
2ip route list table main default

您将收到如下的输出:

1[environment local]
2[secondary_label Output]
3default via 203.0.113.1 dev eth0 proto static

请注意网关的突出IP地址203.0.113.1用于以后使用,设备eth0。您的设备名称可能不同。

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

1[environment local]
2ip -brief address show eth0

您将收到如下的输出:

1[environment local]
2[secondary_label Output]
3eth0 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后续地址)是指向您需要添加到WireGuard同行配置的eth0设备的公共地址。

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

1[environment local]
2sudo nano /etc/wireguard/wg0.conf

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

1[environment local]
2PostUp = ip rule add table 200 from 203.0.113.5
3PostUp = ip route add table 200 default via 203.0.113.1
4PreDown = ip rule delete table 200 from 203.0.113.5
5PreDown = ip route delete table 200 default via 203.0.113.1
6
7[Peer]
8. . .

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

  • PostUp = ip 规则从 203.0.113.5 添加表 200 - 此命令创建了一个规则,在 IP 匹配 peer 系统的公共地址 203.0.113.5 时,检查在表中编号为 '200' 的任何路由条目。

PreDown线条在隧道关闭时删除自定义规则和路线。

<$>[info] 注意:在构建这些规则时,表数 200 是任意的,您可以使用 2 到 252 之间的值,或者您可以使用自定义名称,将标签添加到 /etc/iproute2/rt_tables` 文件中,然后引用名称而不是数字值。

有关路由表在 Linux 中如何工作的更多信息,请参阅 Routing Tables SectionGuide to IP Layer Network Administration with Linux

如果您正在通过VPN路由所有同行流量,请确保在WireGuard服务器上配置正确的sysctliptables规则(#step-4-%E2%80%94-adjusting-the-wireguard-server-39s-network-configuration)和(#step-5-%E2%80%94-configuring-the-wireguard-server%E2%80%99-s-firewall)中设置WireGuard服务器的防火墙(#step-5-%E2%80%94-configuring-the-wireguard-server%E2%80%99s-firewall)。

(可选) 配置 WireGuard Peer 的 DNS 解决方案

如果您正在使用 WireGuard 服务器作为所有同行流量的 VPN 网关,则需要在指定 DNS 解析器的[接口]部分中添加一行。

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

若要将 DNS 解析器添加到同行配置中,请先确定您的 WireGuard 服务器正在使用哪些 DNS 服务器. 在 WireGuard Server上运行以下命令,如果不同于本示例,则在您的 ethernet 设备名称中代替eth0而不是eth0:

1[environment second]
2resolvectl dns eth0

您应该获得如下类型的输出:

1[environment second]
2[secondary_label Output]
3Link 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文件:

1[environment local]
2sudo nano /etc/wireguard/wg0.conf

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

1[environment local]
2DNS = 67.207.67.2 2001:4860:4860::8844
3
4[Peer]
5. . .

再一次,根据您的 IPv4 和 IPv6 偏好或要求,您可以根据自己的需求编辑列表。

<$>[info] 一旦您在下一步连接到VPN,您可以通过使用像DNS泄漏测试.com(https://www.dnsleaktest.com)这样的网站来检查您是否正在通过VPN发送DNS查询。

您还可以检查您的同行是否正在使用配置的解析器使用resolvectl dns命令,就像您在服务器上运行一样。

1[environment local]
2[secondary_label Output]
3Global: 67.207.67.2 67.207.67.3
4. . .

美元

有了所有这些 DNS 解析设置,您现在可以将 peer 的公共密钥添加到服务器中,并在 peer 上启动 WireGuard 隧道。

步骤 8 — 将同行公共密钥添加到 WireGuard 服务器

在将同行连接到服务器之前,重要的是将同行的公共密钥添加到WireGuard服务器上。此步骤确保您能够通过VPN连接和路由流量。

确保您有WireGuard Peer的base64加密公共密钥的副本,运行:

1[environment local]
2sudo cat /etc/wireguard/public.key
1[environment local]
2[secondary_label Output]
3PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

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

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

请注意,该命令的允许IP部分包含一个单独的IPv4和IPv6地址列表,您可以指定单独的IP地址,如果您想限制同行可以分配的IP地址,或者一个类似的范围,如果您的同行可以在VPN范围内使用任何IP地址。

如果您想更新现有同行的允许IP,您可以再次执行相同的命令,但可以更改IP地址。支持多个IP地址。例如,若要更改您刚刚添加的WireGuard Peer,以便将10.8.0.100等IP添加到现有10.8.0.2fd24:609a:6c18::2的IP,您将执行以下操作:

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

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

1[environment second]
2sudo wg
1[secondary_label Output]
2interface: wg0
3 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
4 private key: (hidden)
5 listening port: 51820
6
7peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
8 allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128

注意对等行如何显示 WireGuard Peer 的公共密钥,以及 IP 地址或允许使用的地址范围来分配自己的 IP。

现在你已经在服务器上定义了同行连接参数,下一步就是在同行上启动隧道。

步骤 9 – 将 WireGuard Peer 连接到隧道

现在,您的服务器和同行都已配置为支持您选择IPv4,IPv6,包转发和DNS分辨率,是时候将同行连接到VPN隧道了。

由于您可能只希望VPN在某些使用情况下启用,我们将使用wg-quick命令来手动建立连接. 如果您想像在服务器上一样自动启动隧道,请遵循 步骤 6 – 启动WireGuard服务器部分中的这些步骤,而不是使用wq-quick命令。

如果您正在通过VPN路由所有流量,并且已经设置了DNS转发,您需要在启动隧道之前在WireGuard Peer上安装resolvconf实用程序。

1[environment local]
2sudo apt install resolvconf

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

1[environment local]
2sudo wg-quick up wg0

您将收到如下的输出:

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

注意您分配给同行的突出 IPv4 和 IPv6 地址。

如果您将同行上的AllowedIPs设置为0.0.0.0/0::/0(或使用您选择的VPN以外的范围),则您的输出将如下:

 1[environment local]
 2[secondary_label Output]
 3[#] ip link add wg0 type wireguard
 4[#] wg setconf wg0 /dev/fd/63
 5[#] ip -4 address add 10.8.0.2/24 dev wg0
 6[#] ip -6 address add fd24:609a:6c18::2/64 dev wg0
 7[#] ip link set mtu 1420 up dev wg0
 8[#] resolvconf -a tun.wg0 -m 0 -x
 9[#] wg set wg0 fwmark 51820
10[#] ip -6 route add ::/0 dev wg0 table 51820
11[#] ip -6 rule add not fwmark 51820 table 51820
12[#] ip -6 rule add table main suppress_prefixlength 0
13[#] ip6tables-restore -n
14[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
15[#] ip -4 rule add not fwmark 51820 table 51820
16[#] ip -4 rule add table main suppress_prefixlength 0
17[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
18[#] iptables-restore -n

在本示例中,注意命令添加的突出路径,这些路径与同行配置中的AllowedIPs相符。

您可以使用wg命令在同行上检查隧道的状态:

1[environment local]
2sudo wg
 1[environment local]
 2[secondary_label Output]
 3interface: wg0
 4 public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
 5 private key: (hidden)
 6 listening port: 49338
 7 fwmark: 0xca6c
 8
 9peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
10 endpoint: 203.0.113.1:51820
11 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64
12 latest handshake: 1 second ago
13 transfer: 6.50 KiB received, 15.41 KiB sent

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

如果您正在使用VPN作为所有互联网流量的网关,请检查哪个接口将用于用于CloudFlare的1.1.1.12606:4700:4700::1111DNS解析器的流量。

<$>[注] 如果您只使用 WireGuard 来访问 VPN 上的资源,请将有效的 IPv4 或 IPv6 地址,如网关本身,替换为这些命令。

1[environment local]
2ip route get 1.1.1.1
1[environment local]
2[secondary_label Output]
31.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
4   cache

请注意使用的wg0设备和您分配给同行的IPv4地址10.8.0.2

1[environment local]
2ip -6 route get 2606:4700:4700::1111
1[environment local]
2[secondary_label Output]
32606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium

再次注意wg0接口和您分配给同行的 IPv6 地址fd24:609a:6c18::2

如果你的同行安装了浏览器,你也可以访问ipleak.net(https://ipleak.net/)和ipv6-test.com(https://ipv6-test.com/)以确认你的同行正在通过VPN路由其流量。

一旦您准备好从同行VPN中断连接,请使用wg-quick命令:

1[environment local]
2sudo wg-quick down wg0

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

1[environment local]
2[secondary_label Output]
3[#] ip link delete dev wg0
4[#] resolvconf -d tun.wg0 -f

如果您将同行上的AllowedIPs设置为0.0.0.0/0::/0(或使用您选择的VPN以外的范围),则您的输出将如下:

 1[environment local]
 2[secondary_label Output]
 3[#] ip rule delete table 200 from 203.0.113.5
 4[#] ip route delete table 200 default via 203.0.113.1
 5[#] ip -4 rule delete table 51820
 6[#] ip -4 rule delete table main suppress_prefixlength 0
 7[#] ip -6 rule delete table 51820
 8[#] ip -6 rule delete table main suppress_prefixlength 0
 9[#] ip link delete dev wg0
10[#] resolvconf -d tun.wg0 -f
11[#] iptables-restore -n
12[#] ip6tables-restore -n

要重新连接到VPN,请在同行上再次运行wg-quick up wg0命令. 如果您想从WireGuard服务器中完全删除同行配置,您可以执行以下命令,确保您取代您想要删除的同行的正确的公钥:

1sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

通常情况下,您只需要删除同行配置,如果同行不再存在,或者如果其加密密钥受到破坏或更改,否则最好留下配置,以便同行可以重新连接到VPN,而无需每次添加其密钥和允许IPS

结论

在本教程中,您已在服务器和客户端 Debian 11 系统上安装了 WireGuard 套件和工具,您为 WireGuard 设置了防火墙规则,并配置了内核设置,以允许使用服务器上的sysctl命令转发数据包。

如果你的网络使用IPv6,你还学会了如何生成一个独特的本地地址范围,用于同行连接,最后,你学会了如何通过限制同行可以使用的网络前缀来限制哪些流量应该通过VPN传输,以及如何使用WireGuard服务器作为VPN网关来处理所有同行的互联网流量。

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

Published At
Categories with 技术
comments powered by Disqus