介绍
WireGuard是一个轻量级的虚拟私人网络(VPN),支持IPv4和IPv6连接。VPN允许您穿越不受信任的网络,就像您在私人网络上一样。
WireGuard 的加密依赖于公钥和私钥,以便同行之间建立加密隧道. WireGuard 的每个版本都使用特定的加密加密套件,以确保简单性,安全性和同行兼容性。
相比之下,OpenVPN和IPsec等其他VPN软件使用运输层安全(TLS)和证书来验证和建立系统之间的加密隧道。TLS的不同版本包括支持数百种不同的加密套件和算法,虽然这允许支持不同客户端的极大灵活性,但它也使得使用TLS的VPN配置更耗时、复杂和容易出现错误。
在本教程中,您将在Rocky Linux 8服务器上设置WireGuard,然后配置另一台机器以使用IPv4和IPv6连接(通常称为双重堆栈连接)连接为同行。
对于本教程的目的,我们将配置另一个Rocky Linux 8系统作为WireGuard服务器的同行(也称为客户端)。
<$>[注] 注: 如果您打算在DigitalOcean Droplet上设置WireGuard,请注意,我们和许多托管提供商一样,会收取带宽过期费用。
前提条件
要遵循本教程,您将需要:
- 一个 Rocky Linux 8 服务器与 sudo 非 root 用户和启用防火墙. 要设置此,您可以遵循我们的 初始服务器设置与 Rocky Linux 8] 教程. 我们将在本指南中将此称为 WireGuard Server,但您需要一个客户端机器,您将使用连接到您的 WireGuard 服务器。 在本教程中,我们将把这个机器称为 WireGuard Peer。 对于本教程的目的,建议您使用本地机器作为WireGuard Peer,但您可以使用远程服务器,手机或移动客户端,如您喜欢。 如果您正在使用远程系统,请确保在本教程后面遵循所有可选的部分,或者您可以从系统中锁定自己。(
](https://docs.digitalocean.com/products/networking/ipv6/how-to/enable/).您可以在创建 Droplet 时添加 IPv6 支持,或稍后使用该页面上的说明。
步骤 1 — 安装 WireGuard 并生成一个密钥对
本教程的第一步是在您的服务器上安装 WireGuard. 要开始,您需要将两个额外的软件存储库添加到您的服务器的包索引中,即epel
和elrepo
。 运行以下命令来安装它们。
1[environment second]
2sudo dnf install elrepo-release epel-release
现在您的服务器可以访问托管 WireGuard 包的存储库,请使用以下命令安装 WireGuard:
1[environment second]
2sudo dnf install kmod-wireguard wireguard-tools
现在你已经安装了 WireGuard,下一步是为服务器生成私钥和公钥对,你将使用内置的wg genkey
和wg 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=...」命令會移除檔案中的其他用戶和群組的任何權限,以確保只有根用戶才能存取私钥。
您应该收到一个单行的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.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 服务器将为其私人隧道 IPv4 地址从范围中使用单一的 IP 地址。我们将在这里使用「10.8.0.1/24」,但可以在「10.8.0.1」到「10.8.0.255」的范围内使用任何地址。如果您使用了「10.8.0.1/24」以外的任何东西,请记住您选择的 IP 地址。您将将此 IPv4 地址添加到您在 步骤 3 - 创建 WireGuard 服务器配置 中定义的配置文件中)。
步骤 2(b) — 选择 IPv6 范围
如果您正在使用 WireGuard 与 IPv6 连接,则需要基于 RFC 4193中的算法生成一个唯一的本地 IPv6 unicast 地址前缀。与 WireGuard 连接的地址将与虚拟隧道接口相关联。
根据RFC,获得唯一的IPv6前缀的建议方式是将白天的时间与系统的唯一标识值相结合,例如序列号或设备ID。
要开始为您的 WireGuard 服务器生成 IPv6 范围,请使用日期
实用程序使用以下命令收集 64 位时刻印:
1[environment second]
2date +%s%N
您将收到一个数字,如下,即秒数(日期
命令中的%s
)和纳米秒数(%N
)自1970-01 00:00:00 UTC结合在一起:
1[secondary_label Output]
21628101352127592197
然后,从 /var/lib/dbus/machine-id
文件中复制您的服务器的 machine-id
值。
1[environment second]
2cat /var/lib/dbus/machine-id
您将收到如下的输出:
1[secondary_label /var/lib/dbus/machine-id]
220086c25853947c7aeee2ca1ea849d7d
现在你需要将时刻印与机器-id
相结合,并使用 SHA-1 算法对结果的值进行哈希。
1printf <timestamp><machine-id> | sha1sum
在您的时刻印和机器身份值中运行代替命令:
1[environment second]
2printf 162810135212759219720086c25853947c7aeee2ca1ea849d7d | sha1sum
您将收到如下 hash 值:
1[secondary_label Output]
24f267c51857d6dc93a0bca107bca2f0d86fac3bc -
请注意,sha1sum
命令的输出是六进制的,因此输出使用两个字符来表示单个数据字节,例如,示例输出中的4f
和26
是哈希数据的头两个字节。
RFC 中的算法只需要哈希输出中最少显著的 40 位(或 5 个字节),使用 cut
命令从哈希中打印最后 5 个六十字节编码的字节:
1[environment second]
2printf 4f267c51857d6dc93a0bca107bca2f0d86fac3bc | cut -c 31-
c
参数告诉c
命令只选择一个指定的字符组. 31
参数告诉c
打印从位置31到输入行末的所有字符。
您应该获得如下类型的输出:
1[secondary_label Output]
20d86fac3bc
在此示例输出中,字节的集合是: 0d 86 fa c3 bc
。
现在你可以通过附加你用fd
前缀生成的5个字节来构建你独特的IPv6网络前缀,将每个 2字节与一个:
字符串分开,以便可读性。
使用以 `/64′ 子网大小的先前生成的字节,结果的序列将如下:
1[secondary_label Unique Local IPv6 Address Prefix]
2fd0d: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 地址(#步骤-2-a-%E2%80%94-choosing-an-ipv4 范围),这在本示例中是
10.8.0.1/24
- 如果您正在使用 WireGuard 与 IPv6,则需要您在 [步骤 2(b) — 选择 IPv6
一旦您有所需的私钥和 IP 地址(s),请使用vi
或您喜爱的编辑器创建一个新的配置文件,运行以下命令:
1[environment second]
2sudo vi /etc/wireguard/wg0.conf
将下列行添加到文件中,取代您的私钥,而不是突出的 base64_encoded_private_key_goes_here
值,以及在 Address
行上的 IP 地址。
按i
将 vi放入插入模式,然后添加以下行:
1[secondary_label /etc/wireguard/wg0.conf]
2[environment second]
3[Interface]
4PrivateKey = base64_encoded_private_key_goes_here
5Address = 10.8.0.1/24, fd0d:86fa:c3bc::1/64
6ListenPort = 51820
7SaveConfig = true
SaveConfig
行确保当 WireGuard 接口关闭时,任何更改都将保存到配置文件中。
当您完成更改时,请按ESC
,然后按wq
,将更改写入文件并停止使用,您现在有一个初始服务器配置,您可以根据您计划如何使用WireGuard VPN服务器来建立。
步骤 4 — 调整 WireGuard 服务器的网络配置
如果您正在使用 WireGuard 将同行连接到 WireGuard 服务器,以便在 **服务器上仅访问服务,那么您不需要完成本节。
要配置转发,请使用vi
或您喜爱的编辑器打开/etc/sysctl.conf
文件:
1[environment second]
2sudo vi /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 服务器的配置,以添加防火墙-cmd
防火墙规则,以确保流量向和从服务器和客户端进行正确的路由。
要将防火墙规则添加到您的 WireGuard 服务器中,您将创建一些永久性规则,以确保服务器在重启中正确配置。
1[environment second]
2sudo firewall-cmd --zone=public --add-port=51820/udp --permanent
接下来,您将需要将wg0
设备添加到内部
区域,这将允许VPN接口上的流量到达WireGuard服务器上的其他接口。如果您正在使用服务器作为VPN网关,此设置尤其重要。
运行以下操作,将wg0
接口添加到内部
区域:
1[environment second]
2sudo firewall-cmd --zone=internal --add-interface=wg0 --permanent
最后,如果您使用 WireGuard 服务器作为 VPN 网关,则需要将隐形规则添加到公共区域。 隐形是用来重写内部接口(在这种情况下wg0
)上的流量,使其看起来像是直接来自 WireGuard 服务器的公共 IPv4 或 IPv6 地址。
运行以下命令以启用隐藏,在您的 IPv4 和 IPv6 网络范围中代替突出值:
1[environment second]
2sudo firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=10.8.0.0/24 masquerade' --permanent
3sudo firewall-cmd --zone=public --add-rich-rule='rule family=ipv6 source address=fd0d:86fa:c3bc::/64 masquerade' --permanent
现在重新加载防火墙以使更改生效,并确保它们是永久性的:
1[environment second]
2sudo firewall-cmd --reload
如果您正在使用不同的防火墙或已定制您的防火墙
配置,您可能需要添加额外的防火墙规则。例如,如果您决定通过VPN连接隧道您的所有网络流量,您需要确保端口53
的流量允许DNS请求,以及端口如80
和443
分别用于HTTP和HTTPS流量。
现在,您可以检查整个公共
、内部
或其他防火墙区域的状态,通过运行以下命令来确认规则是否存在。
1[environment second]
2sudo firewall-cmd --zone=public --list-all
您将收到如下的输出:
1[secondary_label Output]
2[environment second]
3public (active)
4 target: default
5 icmp-block-inversion: no
6 interfaces: eth0 eth1
7 sources:
8 services: cockpit dhcpv6-client ssh
9 ports: 51820/udp
10 protocols:
11 masquerade: no
12 forward-ports:
13 source-ports:
14 icmp-blocks:
15 rich rules:
16 rule family="ipv4" source address="10.8.0.0/24" masquerade
17 rule family="ipv6" source address="fd0d:86fa:c3bc::/64" masquerade
突出显示的值表示在端口 51820 上允许 UDP 流量的规则存在,并且在列出的任何网络中都启用了隐藏。
您还可以通过以下命令验证内部
转发规则的存在:
1[environment second]
2sudo firewall-cmd --zone=internal --list-interfaces
您将收到如下输出,如果存在规则:
1[secondary_label Output]
2[environment second]
3wg0
您的 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隧道。每个隧道可能包含不同的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 (/usr/lib/systemd/system/wg-quick@.service; enabled; vendor preset: disabled)
5 Active: active (exited) since Fri 2021-09-17 19:58:14 UTC; 6 days 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 Main PID: 22924 (code=exited, status=0/SUCCESS)
13 Tasks: 0 (limit: 11188)
14 Memory: 0B
15 CGroup: /system.slice/system-wg\x2dquick.slice/wg-quick@wg0.service
16
17Sep 17 19:58:14 wg0 systemd[1]: Starting WireGuard via wg-quick(8) for wg0...
18Sep 17 19:58:14 wg0 wg-quick[22924]: [#] ip link add wg0 type wireguard
19Sep 17 19:58:14 wg0 wg-quick[22924]: [#] wg setconf wg0 /dev/fd/63
20Sep 17 19:58:14 wg0 wg-quick[22924]: [#] ip -4 address add 10.8.0.1/24 dev wg0
21Sep 17 19:58:14 wg0 wg-quick[22924]: [#] ip -6 address add fd0d:86fa:c3bc::1/64 dev wg0
22Sep 17 19:58:14 wg0 wg-quick[22924]: [#] ip link set mtu 1420 up dev wg0
23Sep 17 19:58:14 wg0 systemd[1]: Started WireGuard via wg-quick(8) for wg0.
注意输出如何显示用于创建虚拟wg0
设备的ip
命令,并将您添加到配置文件的IPv4和IPv6地址分配给它。
随着服务器配置和运行,下一步是将客户端机器配置为WireGuard Peer并连接到WireGuard服务器。
步骤 7 – 配置 WireGuard 同行
配置 WireGuard 同行类似于设置 WireGuard 服务器. 一旦安装客户端软件,您将生成公共和私钥对,决定同行的 IP 地址或地址,为同行定义配置文件,然后使用wg-quick
脚本启动隧道。
您可以通过使用以下步骤生成一个密钥对和配置来添加您想要的数量的同行到您的VPN,如果您将多个同行添加到VPN,请确保跟踪他们的私人IP地址以防止碰撞。
要配置 WireGuard Peer,请确保您使用以下dnf
命令安装了 WireGuard 包。
1[environment local]
2sudo dnf install elrepo-release epel-release
3sudo dnf install kmod-wireguard wireguard-tools
创建 WireGuard Peer 密钥对
接下来,您需要使用您在服务器上使用的相同步骤生成 peer 上的密钥对,从您的本地机器或将作为 peer 服务的远程服务器,继续使用以下命令创建 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
文件,使用 `vi' 或您喜爱的编辑器:
1[environment local]
2sudo vi /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 = fd0d:86fa:c3bc::2/64
7
8[Peer]
9PublicKey = base64_encoded_server_public_key_goes_here
10AllowedIPs = 10.8.0.0/24, fd0d:86fa:c3bc::/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,请忽略后续的 fd0d:86fa:c3bc::/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
文件,使用 vi
或您喜爱的编辑器。
1[environment local]
2sudo vi /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 匹配系统的公用203.0.113.5
地址时,检查在表中编号为200 的任何路由条目。 *
PostUp = ip 路由通过 203.0.113.1 默认添加表 200- 此命令确保任何由
200' 表处理的流量将使用203.0.113.1
网关进行路由,而不是 WireGuard 接口。
PreDown
线条在隧道关闭时删除自定义规则和路线。
<$>[info]
注意:在构建这些规则时,表数 200 是任意的,您可以使用 2 到 252 之间的值,或者您可以使用自定义名称,将标签添加到
/etc/iproute2/rt_tables` 文件中,然后引用名称而不是数字值。
有关路由表在 Linux 中如何工作的更多信息,请参阅 Routing Tables Section的 Guide to IP Layer Network Administration with Linux。
如果您正在通过VPN路由所有同行流量,请确保在WireGuard服务器上设置正确的sysctl
和firewall-cmd
规则(#step-4-%E2%80%94-adjusting-the-wireguard-server-39s-network-configuration)和(#step-5-%E2%80%94-configuring-the-wireguard-server%E2%80%99s-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]
2cat /etc/resolv.conf
您应该获得如下类型的输出:
1[environment second]
2[secondary_label Output]
3; Created by cloud-init on instance boot automatically, do not edit.
4;
5nameserver 67.207.67.2
6nameserver 67.207.67.3
输出的 IP 地址是服务器正在使用的 DNS 解析器. 您可以选择使用其中任何或所有,或者只使用 IPv4 或 IPv6 取决于您的需求。
接下来,您需要将所选的解析器添加到 WireGuard Peer 的配置文件中。 回到 WireGuard Peer,使用vi
或您喜爱的编辑器打开 `/etc/wireguard/wg0.conf’ 文件:
1[environment local]
2sudo vi /etc/wireguard/wg0.conf
在[Peer]
行之前,添加以下内容:
1[environment local]
2DNS = 67.207.67.2 67.207.67.3
3
4[Peer]
5. . .
再一次,根据您的 IPv4 和 IPv6 偏好或要求,您可以根据自己的需求编辑列表。
接下来,在 Peer 上启用并启动系统解决
服务,以便在建立隧道时,Peer 的 DNS 解决器得到更新:
1[environment local]
2sudo systemctl enable systemd-resolved
如果您正在运行 Rocky Linux,您将需要重新启动您的同行系统,以及可能的其他 RedHat 衍生发行版,如 CentOS 或 Fedora. 如果您没有重新启动它,则在启动隧道时 /etc/resolv.conf
文件将没有正确的权限设置,因为在 systemd-resolved
或 wireguard-tools
程序中出现错误。
1[environment local]
2sudo reboot
<$>[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 的公共密钥添加到服务器中,然后在 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,fd0d:86fa:c3bc::2
请注意,该命令的允许IP
部分包含一个单独的IPv4和IPv6地址列表,您可以指定单独的IP地址,如果您想限制同行可以分配的IP地址,或者一个类似的范围,如果您的同行可以在VPN范围内使用任何IP地址。
如果您想更新现有同行的允许IP
,您可以再次执行相同的命令,但可以更改IP地址。支持多个IP地址。例如,若要更改您刚刚添加的WireGuard Peer,以便将10.8.0.100
等IP添加到现有10.8.0.2
和fd0d:86fa:c3bc::2
的IP,您将执行以下操作:
1sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd0d:86fa:c3bc::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, fd0d:86fa:c3bc::/128
注意对等
行如何显示 WireGuard Peer 的公共密钥,以及 IP 地址或允许使用的地址范围来分配自己的 IP。
现在你已经在服务器上定义了同行连接参数,下一步就是在同行上启动隧道。
步骤 9 – 将 WireGuard Peer 连接到隧道
现在,您的服务器和同行都已配置为支持您选择IPv4,IPv6,包转发和DNS分辨率,是时候将同行连接到VPN隧道了。
由于您可能只希望VPN在某些使用情况下启用,我们将使用wg-quick
命令来手动建立连接. 如果您想像在服务器上一样自动启动隧道,请遵循 步骤 6 – 启动WireGuard服务器部分中的这些步骤,而不是使用wq-quick
命令。
要启动隧道,请在 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 fd0d:86fa:c3bc::2/64 dev wg0
7[#] ip link set mtu 1420 up dev wg0
注意您分配给同行的突出 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 fd0d:86fa:c3bc::2/64 dev wg0
7[#] ip link set mtu 1420 up dev wg0
8[#] mount `67.207.67.2' /etc/resolv.conf
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[#] nft -f /dev/fd/63
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[#] nft -f /dev/fd/63
19[#] ip rule add table 200 from 203.0.113.5
20[#] ip route add table 200 default via 203.0.113.1
在本示例中,注意命令添加的突出路径,这些路径与同行配置中的AllowedIPs
相符。
接下来,使用ping
在隧道界面上生成一些流量,将单个 ICMP 包(以下命令中的 -c 1
参数表示)发送到 WireGuard 服务器:
1[environment local]
2ping -c 1 10.8.0.1
如果您正在通过VPN路由所有流量,您可以使用CloudFlare的服务器之一:
1[environment local]
2ping -c 1 1.1.1.1
现在用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, fd0d:86fa:c3bc::/64
12 latest handshake: 1 second ago
13 transfer: 6.50 KiB received, 15.41 KiB sent
您也可以在服务器上再次检查状态,您将收到类似的输出。
如果您正在使用VPN作为所有互联网流量的网关,请检查哪个接口将用于用于CloudFlare的1.1.1.1
和2606:4700:4700::1111
DNS解析器的流量。
<$>[注] 如果您只使用 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 dev wg0 table 51820 src fd0d:86fa:c3bc::2 metric 1024 pref medium
再次注意wg0
接口和您分配给同行的 IPv6 地址fd0d:86fa:c3bc::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
如果您将同行上的AllowedIPs
设置为0.0.0.0/0
和::/0
(或使用您选择的VPN以外的范围),则您的输出将如下:
1[environment local]
2[secondary_label Output]
3[#] ip rule delete table 200 from 137.184.109.48
4[#] ip route delete table 200 default via 137.184.96.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[#] umount /etc/resolv.conf
11[#] nft -f /dev/fd/63
要重新连接到VPN,请在同行上再次运行wg-quick up wg0
命令. 如果您想从WireGuard服务器中完全删除同行配置,您可以执行以下命令,确保您取代您想要删除的同行的正确的公钥:
1sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove
通常情况下,您只需要删除同行配置,如果同行不再存在,或者如果其加密密钥受到破坏或更改,否则最好留下配置,以便同行可以重新连接到VPN,而无需每次添加其密钥和允许IPS
。
结论
在本教程中,您在服务器和客户端 Rocky Linux 8 系统上安装了 WireGuard 包和工具. 您为 WireGuard 设置了防火墙规则,并配置了内核设置,以允许使用服务器上的sysctl
命令转发数据包。
如果你的网络使用IPv6,你还学会了如何生成一个独特的本地地址范围,用于同行连接,最后,你学会了如何通过限制同行可以使用的网络前缀来限制哪些流量应该通过VPN传输,以及如何使用WireGuard服务器作为VPN网关来处理所有同行的互联网流量。
如果您想了解有关 WireGuard 的更多信息,包括如何配置更高级的隧道,或使用 WireGuard 与容器,请访问 官方 WireGuard 文档。