介绍
WireGuard 是支持 IPv4 和 IPv6 连接的轻量级虚拟专用网络 (VPN)。 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 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.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 范围
如果您将 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
命令的输出是十六进制的,所以输出使用两个字符来表示一个字节的数据。 例如,示例输出中的 4f
和 26
是散列数据的前两个字节。
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 — 安装 WireGuard 并生成密钥对 中可用的私钥。
- 如果您将 WireGuard 与 IPv4 一起使用,则需要在 步骤 2(a) — 选择 IPv4 范围 中为服务器选择的 IP 地址,在本例中为
10.8.0.1/24
. - 如果您将 WireGuard 与 IPv6 一起使用,您将需要在 步骤 2(b) — 选择 IPv6 范围 中生成的服务器的 IP 地址。 在此示例中,IP 为
fd0d:86fa:c3bc::1/64
。
获得所需的私钥和 IP 地址后,使用 vi
或您喜欢的编辑器通过运行以下命令创建一个新的配置文件:
sudo vi /etc/wireguard/wg0.conf
将以下行添加到文件中,用您的私钥代替突出显示的 base64_encoded_private_key_goes_here
值和 Address
行上的 IP 地址。 如果您希望 WireGuard 在其他端口上可用,也可以更改 ListenPort
行。
按 i
使 vi 进入插入模式,然后添加以下行:
/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 接口关闭时,任何更改都将保存到配置文件中。
完成更改后,按 ESC
,然后按 :wq
将更改写入文件并退出。 您现在有了一个初始服务器配置,您可以根据您计划如何使用 WireGuard VPN 服务器来构建它。
第 4 步 — 调整 WireGuard 服务器的网络配置
如果您使用 WireGuard 将对等点连接到 WireGuard 服务器以便仅访问 服务器上的服务 ,则无需完成此部分。 如果您想通过 WireGuard 服务器路由您的 WireGuard Peer 的 Internet 流量,那么您需要按照本教程的这一部分配置 IP 转发。
要配置转发,请使用 vi
或您喜欢的编辑器打开 /etc/sysctl.conf
文件:
sudo vi /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 服务器的配置以添加 firewall-cmd
防火墙规则,以确保正确路由进出服务器和客户端的流量。 与上一节一样,如果您仅将 WireGuard VPN 用于机器到机器连接以访问受限于您的 VPN 的资源,请跳过此步骤。
要将防火墙规则添加到您的 WireGuard 服务器,您将创建一些永久规则,以确保服务器在重新启动后正确配置。 运行以下命令以允许在 UDP 端口 51820 上访问 WireGuard 服务本身:
sudo firewall-cmd --zone=public --add-port=51820/udp --permanent
接下来,您需要将 wg0
设备添加到 internal
区域,这将允许 VPN 接口上的流量到达 WireGuard 服务器上的其他接口。 如果您将服务器用作所有对等方 Internet 流量的 VPN 网关,此设置尤其重要。 如果您将来向服务器添加更多 WireGuard 隧道,请务必将其设备也添加到内部或受信任区域。
执行以下命令,将 wg0
接口添加到 internal
区域:
sudo firewall-cmd --zone=internal --add-interface=wg0 --permanent
最后,如果您将 WireGuard 服务器用作 VPN 网关,则需要向公共区域添加伪装规则。 伪装用于重写进入内部接口(在本例中为 wg0
)的流量,使其看起来像是直接来自 WireGuard 服务器的公共 IPv4 或 IPv6 地址。
运行以下命令以启用伪装,用您的 IPv4 和 IPv6 网络范围替换突出显示的值:
sudo firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=10.8.0.0/24 masquerade' --permanent sudo firewall-cmd --zone=public --add-rich-rule='rule family=ipv6 source address=fd0d:86fa:c3bc::/64 masquerade' --permanent
现在重新加载防火墙以使更改生效,并确保它们是永久性的:
sudo firewall-cmd --reload
注意:如果您使用不同的防火墙或自定义了您的firewalld
配置,您可能需要添加额外的防火墙规则。 例如,如果您决定通过 VPN 连接隧道传输所有网络流量,则需要确保 DNS 请求允许端口 53
流量,以及 80
和 443
分别用于 HTTP 和 HTTPS 流量。 如果您在 VPN 上使用其他协议,那么您还需要为它们添加规则。
您现在可以通过运行以下命令检查整个 public
、internal
或其他防火墙区域的状态,以确认规则已到位。 在您要检查的区域中替换突出显示的 public
名称:
sudo firewall-cmd --zone=public --list-all
您将收到如下输出:
Outputpublic (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: cockpit dhcpv6-client ssh ports: 51820/udp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="10.8.0.0/24" masquerade rule family="ipv6" source address="fd0d:86fa:c3bc::/64" masquerade
突出显示的值表示存在允许端口 51820 上的 UDP 流量的规则,并且为任何列出的网络启用了伪装。
您还可以使用以下命令验证 internal
转发规则是否到位:
sudo firewall-cmd --zone=internal --list-interfaces
如果存在规则,您将收到如下输出:
Outputwg0
您的 WireGuard 服务器现在已配置为正确处理 VPN 的流量,包括对等点的转发和伪装。 设置好防火墙规则后,您可以启动 WireGuard 服务本身以侦听对等连接。
第 6 步 — 启动 WireGuard 服务器
WireGuard 可以配置为使用其内置的 wg-quick
脚本作为 systemd
服务运行。 虽然您可以在每次想要使用 VPN 时手动使用 wg
命令创建隧道,但这样做是一个手动过程,会变得重复且容易出错。 相反,您可以使用 systemctl
在 wg-quick
脚本的帮助下管理隧道。
使用 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
Output● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; enabled; vendor preset: disabled) Active: active (exited) since Fri 2021-09-17 19:58:14 UTC; 6 days 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 Main PID: 22924 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 11188) Memory: 0B CGroup: /system.slice/system-wg\x2dquick.slice/wg-quick@wg0.service Sep 17 19:58:14 wg0 systemd[1]: Starting WireGuard via wg-quick(8) for wg0... Sep 17 19:58:14 wg0 wg-quick[22924]: [#] ip link add wg0 type wireguard Sep 17 19:58:14 wg0 wg-quick[22924]: [#] wg setconf wg0 /dev/fd/63 Sep 17 19:58:14 wg0 wg-quick[22924]: [#] ip -4 address add 10.8.0.1/24 dev wg0 Sep 17 19:58:14 wg0 wg-quick[22924]: [#] ip -6 address add fd0d:86fa:c3bc::1/64 dev wg0 Sep 17 19:58:14 wg0 wg-quick[22924]: [#] ip link set mtu 1420 up dev wg0 Sep 17 19:58:14 wg0 systemd[1]: Started WireGuard via wg-quick(8) for wg0.
请注意输出如何显示 ip
命令,这些命令用于创建虚拟 wg0
设备并为其分配您添加到配置文件中的 IPv4 和 IPv6 地址。 您可以使用这些规则对隧道进行故障排除,如果您想尝试手动配置 VPN 接口,也可以使用 wg
命令本身。
配置并运行服务器后,下一步是将您的客户端计算机配置为 WireGuard Peer 并连接到 WireGuard 服务器。
第 7 步 — 配置 WireGuard 对等体
配置 WireGuard 对等点类似于设置 WireGuard 服务器。 安装客户端软件后,您将生成公钥和私钥对,确定对等方的一个或多个 IP 地址,为对等方定义配置文件,然后使用 [X225X ] 脚本。
通过使用以下步骤生成密钥对和配置,您可以向 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 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。
掌握所有这些信息后,使用 vi
或您喜欢的编辑器在 WireGuard Peer 机器上打开一个新的 /etc/wireguard/wg0.conf
文件:
sudo vi /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 = base64_encoded_server_public_key_goes_here 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 配置。
现在使用 vi
或您喜欢的编辑器打开 WireGuard Peer 的 /etc/wireguard/wg0.conf
文件。
sudo vi /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 服务器上配置了正确的 sysctl
和 firewall-cmd
规则 和 步骤 5 — 配置 WireGuard 服务器的防火墙 。
(可选)配置 WireGuard Peer 的 DNS 解析器
如果您将 WireGuard 服务器用作所有对等方流量的 VPN 网关,则需要在 [Interface]
部分添加一行来指定 DNS 解析器。 如果您不添加此设置,则您的 DNS 请求可能不受 VPN 保护,或者它们可能会泄露给您的 Internet 服务提供商或其他第三方。
如果您仅使用 WireGuard 访问 VPN 网络或点对点配置中的资源,则可以跳过本节。
要将 DNS 解析器添加到您的对等配置中,首先确定您的 WireGuard 服务器正在使用哪些 DNS 服务器。 在 WireGuard 服务器 上运行以下命令,如果与此示例不同,请用您的以太网设备名称代替 eth0
:
cat /etc/resolv.conf
您应该收到如下输出:
Output; Created by cloud-init on instance boot automatically, do not edit. ; nameserver 67.207.67.2 nameserver 67.207.67.3
输出的 IP 地址是服务器正在使用的 DNS 解析器。 您可以根据需要选择使用其中的任何一个或全部,或者仅使用 IPv4 或 IPv6。 记下您将使用的解析器。
接下来,您需要将您选择的解析器添加到 WireGuard Peer 的配置文件中。 返回 WireGuard Peer,使用 vi
或您喜欢的编辑器打开 /etc/wireguard/wg0.conf
文件:
sudo vi /etc/wireguard/wg0.conf
在 [Peer]
行之前,添加以下内容:
DNS = 67.207.67.2 67.207.67.3 [Peer] . . .
同样,根据您对 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:
sudo reboot
在以下步骤中连接到 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.2
和 fd0d: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
命令。
要启动隧道,请在 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
请注意您分配给对等方的突出显示的 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 [#] mount `67.207.67.2' /etc/resolv.conf [#] 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 [#] 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_mark=1 [#] 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
命令检查对等体上隧道的状态:
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 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 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 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 隧道已关闭:
Output[#] ip link delete dev wg0
如果您将对等体上的 AllowedIPs
设置为 0.0.0.0/0
和 ::/0
(或使用您为 VPN 选择的范围以外的范围),那么您的输出将类似于下列的:
Output[#] ip rule delete table 200 from 137.184.109.48 [#] ip route delete table 200 default via 137.184.96.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 [#] umount /etc/resolv.conf [#] nft -f /dev/fd/63
要重新连接到 VPN,请在对等方上再次运行 wg-quick up wg0
命令。 如果您想从 WireGuard 服务器中完全删除对等点的配置,可以运行以下命令,确保用正确的公钥替换要删除的对等点:
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove
通常,如果对等点不再存在,或者其加密密钥被泄露或更改,您只需要删除对等点配置。 否则最好保留配置,以便对等方可以重新连接到 VPN,而无需每次都添加其密钥和 allowed-ips
。
结论
在本教程中,您在服务器和客户端 Rocky Linux 8 系统上安装了 WireGuard 包和工具。 您为 WireGuard 设置防火墙规则,并配置内核设置以允许在服务器上使用 sysctl
命令转发数据包。 您学习了如何生成私有和公共 WireGuard 加密密钥,以及如何配置服务器和对等方(或对等方)以相互连接。
如果您的网络使用 IPv6,您还学习了如何生成唯一的本地地址范围以用于对等连接。 最后,您学习了如何通过限制对等方可以使用的网络前缀来限制哪些流量应该通过 VPN,以及如何使用 WireGuard 服务器作为 VPN 网关来处理对等方的所有 Internet 流量。
如果您想了解有关 WireGuard 的更多信息,包括如何配置更高级的隧道,或将 WireGuard 与容器一起使用,请访问 官方 WireGuard 文档 。