如何在 Rocky Linux 8 上设置 WireGuard
介绍
WireGuard 是一个轻量级的虚拟专用网络 (VPN),支持 IPv4 和 IPv6 连接。 VPN 允许您穿越不受信任的网络,就像您在专用网络上一样。当您连接到不受信任的网络(如酒店或咖啡店的 WiFi)时,它让您可以自由地从智能手机或笔记本电脑安全地访问互联网。
WireGuard 的加密依赖于对等方的公钥和私钥在它们之间建立加密隧道。每个版本的 WireGuard 都使用特定的加密密码套件来确保简单性、安全性以及与对等方的兼容性。
相比之下,OpenVPN 和 IPSec 等其他 VPN 软件使用传输层安全 (TLS) 和证书来验证和建立系统之间的加密隧道。不同版本的 TLS 包括对数百种不同加密套件和算法的支持,虽然这为支持不同客户端提供了极大的灵活性,但也使得配置使用 TLS 的 VPN 更加耗时、复杂且容易出错。
在本教程中,您将在 Rocky Linux 8 服务器上设置 WireGuard,然后配置另一台机器以使用 IPv4 和 IPv6 连接(通常称为_双栈_连接)作为对等点连接到它。除了将 VPN 用于加密的对等隧道之外,您还将学习如何在网关配置中通过 WireGuard 服务器路由对等方的 Internet 流量。
出于本教程的目的,我们将配置另一个 Rocky Linux 8 系统作为 WireGuard 服务器的对等点(也称为客户端)。本系列的后续教程将解释如何在 Windows、macOS、Android 和 iOS 系统和设备上安装和运行 WireGuard。
注意: 如果您计划在 DigitalOcean Droplet 上设置 WireGuard,请注意,我们与许多托管服务提供商一样,会对带宽超额收费。因此,请注意您的服务器正在处理多少流量。有关详细信息,请参阅 此页面。
先决条件
要遵循本教程,您将需要:
-
一台具有 sudo 非 root 用户并启用防火墙的 Rocky Linux 8 服务器。要进行此设置,您可以按照我们的 使用 Rocky Linux 8 进行初始服务器设置 教程进行操作。在本指南中,我们将其称为 WireGuard 服务器。
-
您需要一台用于连接 WireGuard 服务器的客户端计算机。在本教程中,我们将此机器称为 WireGuard Peer。出于本教程的目的,建议您使用本地计算机作为 WireGuard Peer,但如果您愿意,也可以使用远程服务器或手机作为客户端。如果您使用的是远程系统,请务必遵循本教程后面的所有可选部分,否则您可能会将自己锁定在系统之外。
-
要将 WireGuard 与 IPv6 一起使用,您还需要确保您的服务器配置为支持该类型的流量。如果您想通过 WireGuard 启用 IPv6 支持并使用 DigitalOcean Droplet,请参阅此文档页面 如何在 Droplets 上启用 IPv6 。您可以在创建 Droplet 时添加 IPv6 支持,或者之后使用该页面上的说明添加。
第 1 步 — 安装 WireGuard 并生成密钥对
本教程的第一步是在您的服务器上安装 WireGuard。首先,您需要在服务器的包索引中添加两个额外的软件存储库,“epel”和“elrepo”。运行以下命令来安装它们。请注意,如果这是您第一次在此会话中使用 sudo,系统可能会提示您提供 sudo 用户的密码:
sudo dnf install elrepo-release epel-release
现在您的服务器可以访问托管 WireGuard 软件包的存储库,请使用以下命令安装 WireGuard:
sudo dnf install kmod-wireguard wireguard-tools
现在您已经安装了 WireGuard,下一步是为服务器生成一个私钥和公钥对。您将使用内置的 wg genkey 和 wg pubkey 命令创建密钥,然后将私钥添加到 WireGuard 的配置文件中。
您还需要使用 chmod 命令更改刚刚创建的密钥的权限,因为默认情况下,服务器上的任何用户都可以读取该文件。
使用以下命令为 WireGuard 创建私钥并更改其权限:
wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod gou003d /etc/wireguard/private.key
sudo chmod gou003d... 命令会删除除 root 用户之外的用户和组对文件的任何权限,以确保只有它可以访问私钥。
您应该会收到一行“base64”编码输出,即私钥。输出的副本也存储在 /etc/wireguard/private.key 文件中,以供命令的 tee 部分将来参考。仔细记下输出的私钥,因为您需要在本节后面将其添加到 WireGuard 的配置文件中。
下一步是创建对应的公钥,该公钥是从私钥派生的。使用以下命令创建公钥文件:
须藤猫/etc/wireguard/private.key | wg 公钥 | sudo tee /etc/wireguard/public.key
此命令由三个单独的命令组成,这些命令使用 |(管道)运算符链接在一起:
-
sudo cat /etc/wireguard/private.key:此命令读取私钥文件并将其输出到[标准输出](https://www.digitalocean.com/community/tutorials/an-introduction-to -linux-i-o-redirection#standard-output) 流。 -
wg pubkey:第二个命令将第一个命令的输出作为其[标准输入](https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection#standard -input) 并对其进行处理以生成公钥。 -
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 规范](https://datatracker.ietf.org/doc/html /rfc1918#section-3)):
-
10.0.0.0到10.255.255.255(10/8 前缀) -
172.16.0.0到172.31.255.255(172.16/12 前缀) -
192.168.0.0到192.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.1到10.8.0.255范围内的任何地址。如果您使用不同于 10.8.0.1/24 的 IP 地址,请记下您选择的 IP 地址。您将将此 IPv4 地址添加到您在 步骤 3 - 创建 WireGuard 服务器配置 中定义的配置文件中。
步骤 2(b) — 选择 IPv6 范围
如果您在 IPv6 中使用 WireGuard,则需要根据 RFC 4193 中的算法生成唯一的本地 IPv6 单播地址前缀)。您与 WireGuard 一起使用的地址将与虚拟隧道接口相关联。您将需要完成几个步骤以在保留的“fd00::/8”私有 IPv6 地址块中生成一个随机的、唯一的 IPv6 前缀。
根据 RFC,获得唯一 IPv6 前缀的推荐方法是将时间与来自系统的唯一标识值(如序列号或设备 ID)结合起来。然后对这些值进行散列和截断,生成一组位,这些位可用作保留的私有“fd00::/8”IP 块中的唯一地址。
要开始为您的 WireGuard 服务器生成 IPv6 范围,请使用 date 实用程序和以下命令收集 64 位时间戳:
日期 +%s%N
您将收到如下所示的数字,即自 1970-01-01 00:00:00 UTC 以来的秒数(date 命令中的%s)和纳秒(%N)结合在一起:
输出1628101352127592197
在某处记录该值以供本节稍后使用。接下来,从 /var/lib/dbus/machine-id 文件中复制服务器的 machine-id 值。此标识符对您的系统是唯一的,只要服务器存在,就不应更改。
猫/var/lib/dbus/机器ID
您将收到如下输出:
/var/lib/dbus/machine-id20086c25853947c7aeee2ca1ea849d7d
现在您需要将时间戳与 machine-id 结合起来,并使用 SHA-1 算法对结果值进行散列。该命令将使用以下格式:
printf <时间戳><机器ID> | sha1sum
运行替换时间戳和机器标识值的命令:
printf 162810135212759219720086c25853947c7aeee2ca1ea849d7d | sha1sum
您将收到如下所示的哈希值:
输出4f267c51857d6dc93a0bca107bca2f0d86fac3bc -
请注意,sha1sum 命令的输出是十六进制的,因此输出使用两个字符来表示单个字节的数据。例如,示例输出中的“4f”和“26”是散列数据的前两个字节。
RFC 中的算法只需要散列输出的最低有效(尾随)40 位或 5 个字节。使用 cut 命令从哈希中打印最后 5 个十六进制编码字节:
printf 4f267c51857d6dc93a0bca107bca2f0d86fac3bc |切-c 31-
-c 参数告诉cut 命令只选择一组指定的字符。 31- 参数告诉 cut 打印从位置 31 到输入行末尾的所有字符。
您应该收到如下输出:
输出0d86fac3bc
在此示例输出中,字节集为:0d 86 fa c3 bc。
现在,您可以通过附加您生成的 5 个字节和 fd 前缀来构造您唯一的 IPv6 网络前缀,并用 : 冒号分隔每个 2 字节以提高可读性。因为您的唯一前缀中的每个子网总共可以容纳 18,446,744,073,709,551,616 个可能的 IPv6 地址,为了简单起见,您可以将子网限制为标准大小“/64”。
使用先前使用 /64 子网大小生成的字节,生成的前缀将如下所示:
唯一的本地 IPv6 地址前缀 fd0d:86fa:c3bc::/64
这个 fd0d:86fa:c3bc::/64 范围是您将用于为服务器和对等方上的 WireGuard 隧道接口分配单个 IP 地址的范围。要为服务器分配 IP,请在最后的 :: 字符后添加 1。结果地址将是fd0d:86fa:c3bc::1/64。对等点可以使用该范围内的任何 IP,但通常您每次添加对等点时都会将该值增加一,例如fd0d:86fa:c3bc::2/64。记下 IP 并在本教程的下一部分继续配置 WireGuard 服务器。
步骤 3 — 创建 WireGuard 服务器配置
在创建 WireGuard 服务器的配置之前,您需要以下信息:
-
确保您拥有 步骤 1 - 安装 WireGuard 并生成密钥对 中可用的私钥)。
-
如果您使用带有 IPv4 的 WireGuard,您将需要在 步骤 2(a) — 选择 IPv4 范围 中为服务器选择的 IP 地址-choosing-an-ipv4-range),在本例中为“10.8.0.1/24”。
-
如果您在 IPv6 中使用 WireGuard,则需要您在 步骤 2(b) — 选择 IPv6 范围 中生成的服务器 IP 地址-选择一个 ipv6 范围)。在这个例子中,IP 是
fd0d:86fa:c3bc::1/64。
获得所需的私钥和 IP 地址后,使用 vi 或您喜欢的编辑器通过运行以下命令创建一个新的配置文件:
sudo 你 /etc/wireguard/wg0.conf
将以下行添加到文件中,用您的私钥代替突出显示的 base64_encoded_private_key_goes_here 值,以及 Address 行上的 IP 地址。如果您希望 WireGuard 在其他端口上可用,您还可以更改“ListenPort”行。
按 i 将 vi 置于插入模式,然后添加以下行:
/etc/wireguard/wg0.conf[接口]
PrivateKey u003d base64_encoded_private_key_goes_here
地址 u003d 10.8.0.1/24,fd0d:86fa:c3bc::1/64
监听端口 u003d 51820
保存配置 u003d 真
SaveConfig 行确保当 WireGuard 接口关闭时,任何更改都将保存到配置文件中。
完成更改后,按 ESC 然后按 :wq 将更改写入文件并退出。您现在有了一个初始服务器配置,您可以根据您计划如何使用 WireGuard VPN 服务器来构建它。
步骤 4 — 调整 WireGuard 服务器的网络配置
如果您使用 WireGuard 将对等点连接到 WireGuard 服务器以访问仅服务器上的服务,则无需完成此部分。如果您想通过 WireGuard 服务器路由 WireGuard Peer 的 Internet 流量,那么您需要按照本教程的这一部分配置 IP 转发。
要配置转发,请使用 vi 或您喜欢的编辑器打开 /etc/sysctl.conf 文件:
sudo 你 /etc/sysctl.conf
如果您将 IPv4 与 WireGuard 一起使用,请在文件底部添加以下行:
/etc/sysctl.conf
net.ipv4.ip_forwardu003d1
如果您将 IPv6 与 WireGuard 一起使用,请在文件底部添加以下行:
/etc/sysctl.conf
net.ipv6.conf.all.forwardingu003d1
如果您同时使用 IPv4 和 IPv6,请确保包含这两行。完成后保存并关闭文件。
要读取文件并为当前终端会话加载新值,请运行:
sudo sysctl -p
Outputnet.ipv6.conf.all.forwarding u003d 1
net.ipv4.ip_forward u003d 1
现在,您的 WireGuard 服务器将能够将来自虚拟 VPN 以太网设备的传入流量转发给服务器上的其他人,并从那里转发到公共互联网。使用此配置将允许您通过服务器的 IP 地址路由来自 WireGuard Peer 的所有 Web 流量,并且您的客户端的公共 IP 地址将被有效隐藏。
但是,在流量可以通过您的服务器正确路由之前,您需要配置一些防火墙规则。这些规则将确保进出 WireGuard 服务器和对等方的流量正常流动。
步骤 5 — 配置 WireGuard 服务器的防火墙
在本节中,您将编辑 WireGuard 服务器的配置以添加“firewall-cmd”防火墙规则,以确保正确路由进出服务器和客户端的流量。与上一节一样,如果您仅将 WireGuard VPN 用于机器到机器连接以访问受限于您的 VPN 的资源,请跳过此步骤。
要将防火墙规则添加到您的 WireGuard 服务器,您将创建一些永久规则,以确保服务器在重新启动后正确配置。运行以下命令以允许在 UDP 端口 51820 上访问 WireGuard 服务本身:
sudo firewall-cmd --zoneu003dpublic --add-portu003d51820/udp --permanent
接下来,您需要将“wg0”设备添加到“内部”区域,这将允许 VPN 接口上的流量到达 WireGuard 服务器上的其他接口。如果您将服务器用作所有对等方 Internet 流量的 VPN 网关,此设置尤其重要。如果您将来向服务器添加更多 WireGuard 隧道,请务必将其设备也添加到内部或受信任区域。
运行以下命令将 wg0 接口添加到 internal 区域:
sudo firewall-cmd --zoneu003dinternal --add-interfaceu003dwg0 --permanent
最后,如果您将 WireGuard 服务器用作 VPN 网关,则需要向公共区域添加伪装规则。伪装用于重写进入内部接口(在本例中为“wg0”)的流量,使其看起来像是直接来自 WireGuard 服务器的公共 IPv4 或 IPv6 地址。
运行以下命令以启用伪装,用您的 IPv4 和 IPv6 网络范围替换突出显示的值:
sudo firewall-cmd --zoneu003dpublic --add-rich-ruleu003d'rule familyu003dipv4 source addressu003d10.8.0.0/24 masquerade' --permanent
sudo firewall-cmd --zoneu003dpublic --add-rich-ruleu003d'rule familyu003dipv6 source addressu003dfd0d:86fa:c3bc::/64 masquerade' --permanent
现在重新加载防火墙以使更改生效,并确保它们是永久性的:
sudo firewall-cmd --reload
注意:如果您使用不同的防火墙或自定义了“firewalld”配置,您可能需要添加额外的防火墙规则。例如,如果您决定通过 VPN 连接对所有网络流量进行隧道传输,则需要确保 DNS 请求允许端口“53”流量,并确保 HTTP 和 HTTPS 流量允许端口“80”和“443”分别。如果您在 VPN 上使用其他协议,那么您还需要为它们添加规则。
您现在可以通过运行以下命令检查整个“公共”、“内部”或其他防火墙区域的状态,以确认规则是否到位。替换您要检查的区域以代替突出显示的“公共”名称:
sudo firewall-cmd --zoneu003dpublic --list-all
您将收到如下输出:
输出公共(活动)
目标:默认
icmp 块反转:否
接口:eth0 eth1
来源:
服务:驾驶舱 dhcpv6-client ssh
端口:51820/udp
协议:
伪装:没有
转发端口:
源端口:
icmp 块:
丰富的规则:
规则族u003d"ipv4" 源地址u003d"10.8.0.0/24" 伪装
规则族u003d"ipv6" 源地址u003d"fd0d:86fa:c3bc::/64" 伪装
突出显示的值表示存在允许端口 51820 上的 UDP 流量的规则,并且为任何列出的网络启用了伪装。
您还可以使用以下命令验证“内部”转发规则是否到位:
sudo firewall-cmd --zoneu003dinternal --list-interfaces
如果存在规则,您将收到如下输出:
输出wg0
您的 WireGuard 服务器现在已配置为正确处理 VPN 的流量,包括对等点的转发和伪装。设置好防火墙规则后,您可以启动 WireGuard 服务本身以侦听对等连接。
步骤 6 — 启动 WireGuard 服务器
WireGuard 可以配置为使用其内置的 wg-quick 脚本作为systemd 服务运行。虽然您可以在每次想要使用 VPN 时手动使用 wg 命令创建隧道,但这样做是一个手动过程,会变得重复且容易出错。相反,您可以在 wg-quick 脚本的帮助下使用 systemctl 来管理隧道。
使用“systemd”服务意味着您可以将 WireGuard 配置为在启动时启动,这样只要服务器正在运行,您就可以随时连接到您的 VPN。为此,请通过将您定义的 wg0 隧道添加到 systemctl 来启用 wg-quick 服务:
sudo systemctl enable wg-quick@wg0.service
<$>[Info] 请注意,该命令将隧道名称“wg0”指定为服务名称的一部分。此名称映射到 /etc/wireguard/wg0.conf 配置文件。这种命名方法意味着您可以使用您的服务器创建任意数量的单独 VPN 隧道。每个隧道可以包含不同的 IPv4、IPv6 和客户端防火墙设置。 <$>
现在启动服务:
sudo systemctl start wg-quick@wg0.service
使用以下命令仔细检查 WireGuard 服务是否处于活动状态。您应该在输出中看到 active (running):
sudo systemctl status wg-quick@wg0.service
输出● wg-quick@wg0.service - 通过 wg-quick(8) 为 wg0 提供 WireGuard
已加载:已加载(/usr/lib/systemd/system/wg-quick@.service;已启用;供应商预设:已禁用)
活跃:自世界标准时间 2021 年 9 月 17 日星期五 19:58:14 起活跃(退出); 6 天前
文档:man:wg-quick(8)
男人: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
主 PID:22924(代码u003d退出,状态u003d0/成功)
任务:0(限制:11188)
内存:0B
CGroup:/system.slice/system-wg-quick.slice/wg-quick@wg0.service
9 月 17 日 19:58:14 wg0 systemd[1]:通过 wg-quick(8) 为 wg0 启动 WireGuard ...
9 月 17 日 19:58:14 wg0 wg-quick[22924]: [#] ip link add wg0 type wireguard
9 月 17 日 19:58:14 wg0 wg-quick[22924]: [#] wg setconf wg0 /dev/fd/63
9 月 17 日 19:58:14 wg0 wg-quick[22924]: [#] ip -4 address add 10.8.0.1/24 dev wg0
9 月 17 日 19:58:14 wg0 wg-quick[22924]: [#] ip -6 address add fd0d:86fa:c3bc::1/64 dev wg0
9 月 17 日 19:58:14 wg0 wg-quick[22924]: [#] ip link set mtu 1420 up dev wg0
9 月 17 日 19:58:14 wg0 systemd[1]:通过 wg-quick(8) 为 wg0 启动 WireGuard。
请注意输出如何显示用于创建虚拟 wg0 设备并为其分配您添加到配置文件中的 IPv4 和 IPv6 地址的 ip 命令。您可以使用这些规则对隧道进行故障排除,如果您想尝试手动配置 VPN 接口,也可以使用 wg 命令本身。
配置并运行服务器后,下一步是将您的客户端计算机配置为 WireGuard Peer 并连接到 WireGuard 服务器。
步骤 7 — 配置 WireGuard 对等体
配置 WireGuard 对等点类似于设置 WireGuard 服务器。安装客户端软件后,您将生成一个公钥和私钥对,确定对等方的一个或多个 IP 地址,为对等方定义一个配置文件,然后使用 wg-quick 启动隧道脚本。
通过使用以下步骤生成密钥对和配置,您可以向 VPN 添加任意数量的对等点。如果您将多个对等方添加到 VPN,请务必跟踪其私有 IP 地址以防止冲突。
要配置 WireGuard Peer,请确保使用以下“dnf”命令安装了 WireGuard 软件包。在 WireGuard 对等体上运行:
sudo dnf install elrepo-release epel-release
sudo dnf install kmod-wireguard wireguard-tools
创建 WireGuard Peer 的密钥对
接下来,您需要使用与服务器上相同的步骤在对等方上生成密钥对。从将作为对等方的本地计算机或远程服务器,继续并使用以下命令为对等方创建私钥:
wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod gou003d /etc/wireguard/private.key
您将再次收到一行“base64”编码输出,即私钥。输出的副本也存储在 /etc/wireguard/private.key 中。仔细记下输出的私钥,因为您需要在本节后面将其添加到 WireGuard 的配置文件中。
接下来使用以下命令创建公钥文件:
须藤猫/etc/wireguard/private.key | wg 公钥 | 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。
掌握所有这些信息后,使用 vi 或您喜欢的编辑器在 WireGuard Peer 机器上打开一个新的 /etc/wireguard/wg0.conf 文件:
sudo 你 /etc/wireguard/wg0.conf
将以下行添加到文件中,根据需要将各种数据替换到突出显示的部分中:
/etc/wireguard/wg0.conf[接口]
PrivateKey u003d base64_encoded_peer_private_key_goes_here
地址 u003d 10.8.0.2/24
地址 u003d fd0d:86fa:c3bc::2/64
[同行]
PublicKey u003d base64_encoded_server_public_key_goes_here
AllowedIPs u003d 10.8.0.0/24, fd0d:86fa:c3bc::/64
端点 u003d 203.0.113.1:51820
请注意第一行“地址”如何使用您之前选择的“10.8.0.0/24”子网中的 IPv4 地址。该 IP 地址可以是子网中的任何内容,只要它与服务器的 IP 不同即可。每次添加对等点时将地址增加 1 通常是分配 IP 的最简单方法。
同样,请注意第二行“地址”如何使用您之前生成的子网中的 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 地址空间,并且::/0 用于整个 IPv6 地址空间。
(可选)配置对等体通过隧道路由所有流量
如果您选择使用 0.0.0.0/0 或 ::/0 路由通过隧道路由所有对等点的流量,并且对等点是远程系统,那么您需要完成本节中的步骤.如果您的对等方是本地系统,那么最好跳过本节。
对于您通过 SSH 或使用公共 IP 地址的其他协议访问的远程对等点,您需要在对等点的“wg0.conf”文件中添加一些额外的规则。这些规则将确保您在连接时仍然可以从隧道外部连接到系统。否则,当隧道建立时,通常在公共网络接口上处理的所有流量将无法正确路由以绕过“wg0”隧道接口,从而导致无法访问的远程系统。
首先,您需要确定系统用作其默认网关的 IP 地址。运行以下 ip route 命令:
ip route list table main default
您将收到如下输出:
Outputdefault 通过 203.0.113.1 dev eth0 proto static
请注意网关突出显示的 IP 地址“203.0.113.1”以供以后使用,以及设备“eth0”。您的设备名称可能不同。如果是这样,请在以下命令中将其替换为 eth0。
接下来通过使用“ip address show”命令检查设备来找到系统的公共 IP:
ip - 简要地址显示 eth0
您将收到如下输出:
输出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 配置中。
现在使用 vi 或您喜欢的编辑器打开 WireGuard Peer 的 /etc/wireguard/wg0.conf 文件。
sudo 你 /etc/wireguard/wg0.conf
在 [Peer] 行之前,添加以下 4 行:
PostUp u003d ip rule add table 200 from 203.0.113.5
PostUp u003d ip route add table 200 default via 203.0.113.1
PreDown u003d ip rule delete table 200 from 203.0.113.5
PreDown u003d ip route delete table 200 default via 203.0.113.1
[同行]
. . .
这些行将创建自定义路由规则,并添加自定义路由以确保到系统的公共流量使用默认网关。
-
PostUp u003d ip rule add table 200 from 203.0.113.5- 当 IP 与系统的公共203.0.113.5地址匹配时,此命令会创建一个规则,检查表中编号为200的任何路由条目。 -
PostUp u003d 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 层网络管理指南](http ://linux-ip.net/html/index.html)。
如果您通过 VPN 路由所有对等方的流量,请确保您在 [步骤 4 — 调整 WireGuard 服务器的网络配置](#step-4 中的 WireGuard 服务器上配置了正确的 sysctl 和 firewall-cmd 规则-%E2%80%94-adjusting-the-wireguard-server-39-s-network-configuration) 和 [步骤 5 - 配置 WireGuard 服务器的防火墙](#step-5-%E2%80%94-configuring- the-wireguard-server%E2%80%99s-firewall)。
(可选)配置 WireGuard Peer 的 DNS 解析器
如果您将 WireGuard 服务器用作所有对等方流量的 VPN 网关,则需要在“[接口]”部分添加一行来指定 DNS 解析器。如果您不添加此设置,则您的 DNS 请求可能不受 VPN 保护,或者它们可能会泄露给您的 Internet 服务提供商或其他第三方。
如果您仅使用 WireGuard 访问 VPN 网络或点对点配置中的资源,则可以跳过本节。
要将 DNS 解析器添加到您的对等配置中,首先确定您的 WireGuard 服务器正在使用哪些 DNS 服务器。在 WireGuard 服务器 上运行以下命令,如果与此示例不同,请用您的以太网设备名称代替 eth0:
猫 /etc/resolv.conf
您应该收到如下输出:
输出;由 cloud-init 在实例启动时自动创建,请勿编辑。
;
名称服务器 67.207.67.2
名称服务器 67.207.67.3
输出的 IP 地址是服务器正在使用的 DNS 解析器。您可以根据需要选择使用其中的任何一个或全部,或者仅使用 IPv4 或 IPv6。记下您将使用的解析器。
接下来,您需要将您选择的解析器添加到 WireGuard Peer 的配置文件中。回到 WireGuard Peer,使用 vi 或您喜欢的编辑器打开 /etc/wireguard/wg0.conf 文件:
sudo 你 /etc/wireguard/wg0.conf
在 [Peer] 行之前,添加以下内容:
DNS u003d 67.207.67.2 67.207.67.3
[同行]
. . .
同样,根据您对 IPv4 和 IPv6 的偏好或要求,您可以根据需要编辑列表。
接下来,在 Peer 上启用并启动“systemd-resolved”服务,以便在建立隧道时,更新 Peer 的 DNS 解析器:
sudo systemctl enable systemd-resolved
如果它正在运行 Rocky Linux 以及可能的其他 RedHat 派生发行版,如 CentOS 或 Fedora,则此时您需要重新启动对等系统。如果您不重新启动它,由于 systemd-resolved 或 wireguard-tools 程序中的错误,当您启动隧道时,/etc/resolv.conf 文件将没有正确的权限设置。使用以下命令重新启动 WireGuard Peer:
须藤重启
在以下步骤中连接到 VPN 后,您可以使用 DNS leak test.com 之类的站点检查是否通过 VPN 发送 DNS 查询。
您还可以使用“resolvectl dns”命令检查您的对等方是否使用配置的解析器,就像您在服务器上运行一样。您应该会收到如下输出,显示您为 VPN 隧道配置的 DNS 解析器:
全球输出:67.207.67.2 67.207.67.3
. . .
在所有这些 DNS 解析器设置到位并且对等方重新启动后,您现在可以将对等方的公钥添加到服务器,然后在对等方上启动 WireGuard 隧道。
步骤 8 — 将对等方的公钥添加到 WireGuard 服务器
在将对等方连接到服务器之前,将对等方的公钥添加到 WireGuard 服务器非常重要。此步骤可确保您能够连接到 VPN 并通过 VPN 路由流量。如果不完成此步骤,WireGuard 服务器将不允许对等方通过隧道发送或接收任何流量。
通过运行以下命令,确保您拥有 WireGuard Peer 的“base64”编码公钥的副本:
须藤猫/etc/wireguard/public.key
输出PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hgu003d
现在登录到 WireGuard 服务器,并运行以下命令:
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hgu003d 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.2 和 fd0d:86fa:c3bc::2 IP 添加类似 10.8.0.100 的 IP,您将运行以下命令:
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hgu003d allowed-ips 10.8.0.2,10.8.0.100,fd0d:86fa:c3bc::2
运行添加对等点的命令后,使用 wg 命令检查服务器上隧道的状态:
须藤工作组
输出接口:wg0
公钥:U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFEu003d
私钥:(隐藏)
监听端口:51820
同行:PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hgu003d
允许的 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 命令。
要启动隧道,请在 WireGuard Peer 上运行以下命令:
sudo wg-快速启动 wg0
您将收到如下输出:
输出[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 地址添加 10.8.0.2/24 dev wg0
[#] ip -6 地址添加 fd0d:86fa:c3bc::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
请注意您分配给对等方的突出显示的 IPv4 和 IPv6 地址。
如果您将对等端上的 AllowedIPs 设置为 0.0.0.0/0 和 ::/0(或使用您为 VPN 选择的范围以外的范围),那么您的输出将类似于以下内容:
输出[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 地址添加 10.8.0.2/24 dev wg0
[#] ip -6 地址添加 fd0d:86fa:c3bc::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] mount `67.207.67.2' /etc/resolv.conf
[#] wg 设置 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
[#] nft -f /dev/fd/63
[#] 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_marku003d1
[#] nft -f /dev/fd/63
[#] ip rule add table 200 from 203.0.113.5
[#] ip route add table 200 default via 203.0.113.1
在此示例中,请注意该命令添加的突出显示的路由,它们对应于对等配置中的“AllowedIPs”。
接下来,通过使用“ping”在隧道接口上生成一些流量,将单个 ICMP 数据包(由以下命令中的“-c 1”参数指示)发送到 WireGuard 服务器:
ping -c 1 10.8.0.1
如果您通过 VPN 路由所有流量,则可以使用 CloudFlare 的服务器之一:
ping -c 1 1.1.1.1
现在使用 wg 命令检查对等体上隧道的状态:
须藤工作组
输出接口:wg0
公钥:PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hgu003d
私钥:(隐藏)
监听端口:49338
fwmark: 0xca6c
对等体:U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFEu003d
端点:203.0.113.1:51820
允许的 ips: 10.8.0.0/24, fd0d:86fa:c3bc::/64
最近一次握手:1 秒前
转账:收到 6.50 KiB,发送 15.41 KiB
您也可以再次检查服务器上的状态,您将收到类似的输出。
使用 ip route 和 ip -6 route 命令验证您的对等方是否正在使用 VPN。如果您使用 VPN 作为所有 Internet 流量的网关,请检查哪个接口将用于发往 CloudFlare 的“1.1.1.1”和“2606:4700:4700::1111”DNS 解析器的流量。
如果您仅使用 WireGuard 访问 VPN 上的资源,请将网关本身等有效的 IPv4 或 IPv6 地址替换为这些命令。例如“10.8.0.1”或“fd0d:86fa:c3bc::1”。
ip 路由获取 1.1.1.1
Output1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
缓存
请注意,使用了“wg0”设备和您分配给对等方的 IPv4 地址“10.8.0.2”。同样,如果您使用的是 IPv6,请运行以下命令:
ip -6 路由获取 2606:4700:4700::1111
Output2606:4700:4700::1111 dev wg0 table 51820 src fd0d:86fa:c3bc::2 metric 1024 pref medium
再次注意 wg0 接口,以及您分配给对等方的 IPv6 地址 fd0d:86fa:c3bc::2。
如果您的同行安装了浏览器,您还可以访问 ipleak.net 和 ipv6-test.com 来确认您的对等方正在通过 VPN 路由其流量。
一旦您准备好从对等方的 VPN 断开连接,请使用 wg-quick 命令:
sudo wg-quick down wg0
您将收到如下输出,表明 VPN 隧道已关闭:
输出[#] ip link delete dev wg0
如果您将对等端上的 AllowedIPs 设置为 0.0.0.0/0 和 ::/0(或使用您为 VPN 选择的范围以外的范围),那么您的输出将类似于以下内容:
输出[#] ip rule delete table 200 from 137.184.109.48
[#] ip route delete table 200 default via 137.184.96.1
[#] ip -4 规则删除表 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip -6 规则删除表 51820
[#] ip -6 rule delete table main suppress_prefixlength 0
[#] ip链接删除dev wg0
[#] 卸载 /etc/resolv.conf
[#] nft -f /dev/fd/63
要重新连接到 VPN,请在对等点上再次运行 wg-quick up wg0 命令。如果您想从 WireGuard 服务器中完全删除对等点的配置,可以运行以下命令,确保用正确的公钥替换要删除的对等点:
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hgu003d删除
通常,如果对等点不再存在,或者其加密密钥被泄露或更改,您只需要删除对等点配置。否则最好保留配置,以便对等方可以重新连接到 VPN,而无需每次都添加其密钥和“允许的 ips”。
结论
在本教程中,您在服务器和客户端 Rocky Linux 8 系统上安装了 WireGuard 包和工具。您为 WireGuard 设置防火墙规则,并配置内核设置以允许在服务器上使用 sysctl 命令转发数据包。您学习了如何生成私有和公共 WireGuard 加密密钥,以及如何配置服务器和对等方(或对等方)以相互连接。
如果您的网络使用 IPv6,您还学习了如何生成唯一的本地地址范围以用于对等连接。最后,您学习了如何通过限制对等方可以使用的网络前缀来限制哪些流量应该通过 VPN,以及如何使用 WireGuard 服务器作为 VPN 网关来处理对等方的所有 Internet 流量。
如果您想了解有关 WireGuard 的更多信息,包括如何配置更高级的隧道,或将 WireGuard 与容器一起使用,请访问 WireGuard 官方文档。
更多推荐




所有评论(0)