如何在 Rocky Linux 9 上安装 Wireguard VPN
在此页
- 先决条件
- 启用 Wireguard 内核模块
- 生成服务器和客户端密钥对
- 生成服务器密钥对
- 生成客户端密钥对
Wireguard 是一种替代 IPSec、IKEv2 和 OpenVPN 的开源 VPN 协议。 Wiruguard 专为 Linux 和 Unix 操作系统设计,它运行在 Linux 内核空间,这使得 Wireguard 更快、更可靠。 Wireguard 用于在两台或多台计算机之间创建安全隧道连接。
Wireguard 旨在取代 VPN 协议,例如 IPSec、IKEv2 和 OpenVPN。 Wireguard 更轻、更快、易于设置且更高效。同时,Wiregurad 并没有牺牲 VPN 协议的安全性。 Wireguard 支持现代密码学,如 Noise 协议框架、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF 和安全可信结构。
与OpenVPN、IPSec、IKEv2等其他VPN协议相比,wireguard是一种新的VPN协议。 Wireguard 于 2015 年由 Jason A. Donenfeld 发布,作为替代 VPN 协议,它于 2020 年被 Linus Torvalds 合并到 Linux kernel v5.6,同年也移植到 FreeBSD 13。
本指南教您如何在 Rocky Linux 9 服务器上安装和设置 Wirgeuard 服务器。您还将学习如何设置客户端计算机以连接到 Wireguard 服务器。
在此示例中,您可以使用任何 Linux 发行版作为客户端计算机。但本指南将使用 Rocky Linux 客户端计算机,它是基于 RHEL9 的发行版之一。
先决条件
要开始使用本指南,您必须确保满足以下要求:
- Rocky Linux 9 服务器 - 此示例使用主机名为 wireguard-rocky 的 Rocky Linux。
- 具有 sudo/root 管理员权限的非 root 用户。
- 一个 SELinux 以宽容模式运行。
现在先决条件已准备就绪,您现在可以开始安装和配置 Wireguard 服务器。
启用 Wireguard 内核模块
最新版本的 Rocky Linux 9 附带默认的 Linux 内核 5.14,默认情况下嵌入在其之上的 wireguard 内核模块。在此步骤中,您将启用 Wirguard 内核模块并在您的 Rocky Linux 服务器上安装 wireguard-tools。
运行以下 modprobe 命令以启用 wireguard 内核模块。然后,通过 lsmod 命令验证启用的内核模块列表。
sudo modprobe wireguard
lsmod | grep wireguard如果启用了 wireguard 内核模块,您应该会收到类似于以下内容的输出:
要永久加载 wireguard 模块,您可以运行以下命令将新配置文件添加到 /etc/modules-load.d/ 目录。这将在系统启动时永久加载 wireguard 内核模块。
sudo echo wireguard > /etc/modules-load.d/wireguard.conf
启用wireguard内核模块后,您必须安装wireguard-tools包来管理Wireguard服务器。这包括生成密钥、启动 Wireguard 服务器等等。
运行下面的 dnf 命令来安装 wireguard-tools。当提示确认时,输入 y 并按 ENTER 继续。
sudo dnf install wireguard-tools
现在 wireguard-tools 安装应该开始了。
您的 Rocky Linux 服务器现在启用了 wireguard 内核模块并安装了 wireguard-tools。接下来,您将了解如何通过 wireguard-tools 为 Wireguard 服务器和客户端生成密钥对。
生成服务器和客户端密钥对
wireguard-tools 提供用于管理 Wireguard 部署的用户空间命令行。 wireguard-tools 提供的两个主要实用程序:
- wg - 一个命令行实用程序,可用于设置 wireguard 隧道接口。使用此实用程序,您可以生成密钥对、验证当前的 Wireguard 运行时和接口,并设置 Wireguard 隧道接口。
- wg-quick - 一个可以管理 Wireguard 界面的简单命令行。您可以通过 wg-quick 命令启动、停止和重新启动任何 wireguard 接口。
启用 wireguard 内核模块并安装 wireguard-tools 后的第一步是为 Wireguard 服务器和客户端生成密钥对。这可以通过 wg 命令实用程序完成。
生成服务器密钥对
运行以下 wg genkey 命令生成服务器私钥 /etc/wireguard/server.key。然后,将默认权限更改为 0400 以禁用其他人和组的写入和执行。
wg genkey | sudo tee /etc/wireguard/server.key
sudo chmod 0400 /etc/wireguard/server.key之后,运行以下命令为 wireguard 服务器 /etc/wireguard/server.pub 生成公钥。 Wireguard 公钥派生自 Wireguard 私钥 /etc/wireguard/server.key。
sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
输出:
接下来,通过下面的 cat 命令验证 wireguard 服务器的公钥和私钥。
cat /etc/wireguard/server.key
cat /etc/wireguard/server.pub您可能对公钥和私钥使用不同的密钥,但输出与此类似:
生成客户端密钥对
生成 wireguard 服务器密钥对后,您将为客户端生成一个新密钥对。在此示例中,您将生成一个名为 client1 的新密钥对。
运行以下命令创建一个新目录 /etc/wireguard/clients。该目录将用于存储客户端密钥对。
mkdir -p /etc/wireguard/clients
接下来,运行以下 wg genkey 命令生成客户端私钥 /etc/wireguard/clients/client1.key。然后,通过 wg pubkey 命令生成客户端公钥 /etc/wireguard/clients/client1.pub。
wg genkey | tee /etc/wireguard/clients/client1.key
cat /etc/wireguard/clients/client1.key | wg pubkey | tee /etc/wireguard/clients/client1.pub输出:
现在使用下面的 cat 命令验证客户端公钥和私钥。
cat /etc/wireguard/clients/client1.key
cat /etc/wireguard/clients/client1.pubWireguard 服务器和客户端密钥对的密钥应该相似,这是一个类似 base64 的密钥。
配置 Wireguard 服务器
在此步骤中,您将为 wireguard 服务器创建一个新的配置文件,设置 wireguard 接口,并为客户端连接设置对等连接。这包括 wireguard VPN 子网的配置、wireguard 服务器的 IP 地址以及对等客户端的 IP 地址。
首先,使用以下 nano 编辑器命令创建一个新的 wireguard 服务器配置文件 /etc/wireguard/wg0.conf。
sudo nano /etc/wireguard/wg0.conf
将以下行添加到文件中,并确保将 PrivateKey 更改为 Wirguard 服务器私钥 server.key。这样,您还将设置要在 IP 地址 10.8.0.1 上运行的 Wireguard 服务器接口。对于客户端连接,您将使用 UDP 端口 51820。最后,您还将启用 SaveConfig 参数,以确保任何更改都保存到 Wireguard 配置文件中,即使 Wireguard 接口已关闭。
[Interface]
# Wireguard Server private key - server.key
PrivateKey = iHaI5bkEbW8wqTQDbU/KITGhxtKoiezWVohVZsKwj3w=
# Wireguard interface will be run at 10.8.0.1
Address = 10.8.0.1/24
# Clients will connect to UDP port 51820
ListenPort = 51820
# Ensure any changes will be saved to the Wireguard config file
SaveConfig = true接下来,添加以下行来定义客户端对等连接。请务必使用客户端公钥 client1.pub 更改 PublicKey 参数。使用 AllowedIPs 参数,您可以指定允许访问此对等方的 Wireguard 客户端。在此示例中,仅允许 IP 为 10.8.0.8 的客户端访问此对等连接。此外,您还可以允许内部网络子网范围(例如 172.16.100.0/24)访问 wireguard 对等体。
[Peer]
# Wireguard client public key - client1.pub
PublicKey = iWskvxyj+QK4185xO6Z2Fb0XYo1jGyiyI3iKbyGTkT8=
# clients' VPN IP addresses you allow to connect
# possible to specify subnet ⇒ [172.16.100.0/24]
AllowedIPs = 10.8.0.8/24完成后保存并退出文件。
这样,您就已经为 Wreguard 服务器创建了基本配置。此外,您还使用客户端公钥 client1.pub 为客户端定义了对等连接。在下一步中,在 wireguard 服务器上设置端口转发并设置 firewalld 流量路由规则。
设置端口转发
要设置任何 VPN 服务器,您必须在部署服务器上启用端口转发。在此步骤中,您将通过 /etc/sysctl.conf 文件在 Rocky Linux 服务器上启用端口转发。
使用下面的 nano 编辑器打开配置文件 /etc/sysctl.conf。
sudo nano /etc/sysctl.conf
将以下行添加到该行的底部。这些行将为 IPv4 和 IPv6 启用端口转发。无论您是否需要 IPv6,都可以通过在行首添加注释 # 来禁用它。
# Port Forwarding for IPv4
net.ipv4.ip_forward=1
# Port forwarding for IPv6
net.ipv6.conf.all.forwarding=1完成后保存文件并退出编辑器。
现在运行以下 sysctl 命令以应用对 /etc/sysctl.conf 文件的更改。
sudo sysctl -p
你会收到类似这样的输出:
启用端口转发后,您接下来将设置一个 firewalld,用于将流量从客户端路由到 wireguard 服务器上的特定网络接口。
设置防火墙
在此步骤中,您将在 Wireguard 服务器上设置 firewalld。您将通过 firewalld 将客户端流量路由到 wireguard 服务器上的特定网络接口。这可以通过向 firewalld 永久添加新规则,或使用 Wireguard 配置文件中的 wireguard PostUp 和 PostDown 参数来完成。
在开始之前,运行以下 ip 命令来检查 wireguard 服务器上用于 Internet 访问的默认网络接口。
ip route show default
您将收到类似于此的输出 - 在此示例中,wireguard 服务器使用接口 eth0 进行互联网访问。您的服务器上可能有不同的网络接口名称。
接下来,使用以下 nano 编辑器命令打开 wireguard 服务器配置文件 /etc/wireguard/wg0.conf。
sudo nano /etc/wireguard/wg0.conf
将以下行添加到 [Interface] 部分。
PostUp = firewall-cmd --zone=public --add-masquerade
PostUp = firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg -o eth0 -j ACCEPT
PostUp = firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
PostDown = firewall-cmd --zone=public --remove-masquerade
PostDown = firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -i wg -o eth0 -j ACCEPT
PostDown = firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE保存并退出文件。
- 只要 Wirguard 服务器启动 VPN 隧道,就会执行 PostUp 参数。
- 只要 Wireguard 服务器停止 VPN 隧道,就会执行 PostDown 参数。
- 命令 firewall-cmd --zone=public --add-masquerade 将在 firewalld 上启用伪装。
- 命令 firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg -o eth0 -j ACCEPT 将为从 wireguard 接口到 eth0 的流量添加 firewalld rich-rule。
- 命令 firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE 将通过 eth0 接口启用 NAT。
- 在 PostDown 参数中,所有这些命令都用于通过删除在执行 PostUp 参数的命令期间应用的规则来恢复 firewalld 上的更改。
接下来,运行以下 firewall-cmd 命令打开将用于 wirguard 客户端的 UDP 端口 51820。然后,重新加载 firewalld 以应用更改。
sudo firewall-cmd --add-port=51820/udp --permanent
sudo firewall-cmd --reload最后,通过以下 firewall-cmd 命令验证 firewalld 规则。
sudo firewall-cmd --list-all
您应该会收到这样的输出 - Wireguard 客户端端口 51820/udp 添加到 firewalld。
有了这个,你现在已经在 wireguard 服务器上启用了端口转发,并配置了 firewalld 将流量从 wireguard 接口路由到特定的网络接口。您现在已准备好启动 wireguard 服务器。
启动 Wireguard 服务器
在此步骤中,您将启动并启用 Wireguard 服务器。您还将验证 Wireguard 服务器并验证将由 Wireguard 服务创建的 wg0 接口。
运行以下 systemctl 命令实用程序以启动并启用 wireguard 服务器。这将启动 wireguard 服务并创建一个新的 wireguard 接口 wg0。
sudo systemctl start
使用以下 systemctl 命令验证 wireguard 服务器。这将确保 wireguard 服务器正在运行。
sudo systemctl status
你会收到类似这样的输出——wireguard 服务器现在已启用并将在启动时自动运行。而wireguard服务器的状态是running。
您还可以通过下面的 ip 命令验证由 wireguard 服务器创建的接口 wg0。
ip a show wg0
您将收到 wg0 的详细接口,它与 wireguard 服务器配置文件 /etc/wireguard/wg0.conf 相匹配。 wg0 接口的 IP 地址应为 10.8.0.1,如 wireguard 配置文件 /etc/wireguard/wg0.conf 中所述。
另一种可用于启动 wireguard 服务器的方法是使用 wireguard-tools 提供的 wg-quick 命令实用程序。
运行 wg-quick up 启动 wireguard 服务器,运行 wg-quick down 停止 wireguard 服务器。此外,请务必指定 wireguard 服务器配置文件 /etc/wireguard/wg0.conf 的完整路径。
sudo wg-quick up /etc/wireguard/wg0.conf
sudo wg-quick down /etc/wireguard/wg0.conf此时,wireguard 服务器正在 Rocky Linux 服务器上运行。在下一步中,您将设置一台客户端计算机并将其连接到 Wireguard 服务器。
设置客户端并连接到 Wireguard 服务器
在此步骤中,您将在 Linux 客户端计算机上设置 wireguard,然后将客户端计算机连接到 wireguard 服务器。此示例使用主机名为 client1 的 Rocky Linux 作为客户端计算机,但您也可以使用任何 Linux 发行版。
登录到客户端计算机并运行以下 dnf 命令以将 wireguard-tools 包安装到您的客户端。此操作还会安装依赖项 systemd-resolved,wireguard-tools 将使用它来管理 DNS 解析器。
sudo dnf install wireguard-tools
出现提示时输入 y,然后按 ENTER 继续。
在 wireguard-tools 安装期间,systemd-resolved 包也作为依赖项安装。
运行以下命令以启动并启用 systemd-resolved 服务。
sudo systemctl start systemd-resolved
sudo systemctl enable systemd-resolved安装 wireguard-tools 并运行 systemd-resolved 后,您接下来将设置 NetworkManager 以使用 systemd-resolved 作为 DNS 后端。
使用以下 nano 编辑器命令打开 NetworkManager 配置文件 /etc/NetworkManager/NetworkManager.conf。
sudo nano /etc/NetworkManager/NetworkManager.conf
将 dns 参数添加到 [main] 部分,如下所示。
[main]
dns=systemd-resolved保存文件并退出编辑器。
接下来,运行以下命令删除 /etc/resolv.conf 文件并创建由 systemd-resolved 管理的 resolv.conf 文件的新符号链接文件。
rm -f /etc/resolv.conf
sudo ln -s /usr/lib/systemd/resolv.conf /etc/resolv.conf现在重新启动 NetworkManager 服务以应用更改。
sudo systemctl restart NetworkManager
现在 NetworkManager 已配置,您现在可以设置 wireguard 客户端了。
使用下面的 nano 编辑器创建一个新文件 /etc/wireguard/wg-client1.conf。
sudo nano /etc/wireguard/wg-client1.conf
将以下行添加到文件中。
[Interface]
# Define the IP address for the client - must be matched with wg0 on Wireguard Server
Address = 10.8.0.8/24
# Private key for the client - client1.key
PrivateKey = 4FsCdtKr9GrLiX7zpNEYeqodMa5oSeHwH/m9hsNNfEs=
# Run resolvectl command
PostUp = resolvectl dns %i 1.1.1.1 9.9.9.9; resolvectl domain %i ~.
PreDown = resolvectl revert %i
[Peer]
# Public key of the Wireguard server - server.pub
PublicKey = aK+MQ48PVopb8j1Vjs8Fvgz5ZIG2k6pmVZs8iVsgr1E=
# Allow all traffic to be routed via Wireguard VPN
AllowedIPs = 0.0.0.0/0
# Public IP address of the Wireguard Server
Endpoint = 192.168.5.59:51820
# Sending Keepalive every 25 sec
PersistentKeepalive = 25完成后保存文件并退出编辑器。
在 [Interface] 部分,您必须定义以下内容:
- 客户端的 IP 地址必须与 Wireguard 服务器的子网相匹配。在此示例中,Wireguard 客户端将获得 IP 地址 10.8.0.8。
- 通过 resolvectl 命令为客户端指定 DNS 服务器。
- 使用您生成的客户端私钥更改 PrivateKey 参数 client1.key。
在 [Peer] 部分,您必须添加以下内容:
- Wireguard 服务器公钥 server.pub 到 PublicKey 参数。
- 指定允许的 IP 以限制对 VPN 对等点的访问,您可以指定网络的子网,或者您可以只放置 0.0.0.0/0 以通过 VPN 隧道传输所有流量。
- 使用 Wireguard 服务器的公共 IP 地址指定端点参数,或者您也可以使用域名。
创建 wireguard 客户端配置文件后,您可以通过下面的 wg-quick up 命令在客户端计算机上运行 wireguard。
wg-quick up wg-client1
您将收到类似于此的输出 - 创建了新的 wireguard 接口 wg-client1 并获得 IP 地址 10.8.0.8。
现在通过下面的 ip 命令验证 wg-client1 接口。
ip a show wg-client1
下面是将打印到您的终端的类似输出。
您还可以通过下面的 resolvectl 命令在 wg-client1 接口上验证 DNS 解析器。
resolvectl status wg-client1
以下是您将在终端上收到的输出——wireguard 接口 wg-client1 使用通过 PostUp 参数定义的 DNS 解析器,该解析器使用 systemd-resolved.
除此之外,您还可以通过 wg show 命令验证 Wireguard 连接。
在 wireguard 客户端机器上运行 wg show 命令,您将收到如下图所示的输出。
wg show
Wireguard 服务器 IP 地址应显示在端点部分。此外,您还可以看到 wireguard 服务器公钥 server.pub。
返回 wireguard 服务器并运行下面的 wg show 命令。
wg show
以下是您将在终端上收到的类似输出 - 在端点部分,您将看到客户端公共 IP 地址,在对等部分,您将看到客户端公钥 client1.pub。
最后,运行以下命令以确保客户端计算机可以访问互联网或访问 Wireguard VPN 的内部网络子网。
ping -c5 10.8.0.1
ping -c5 1.1.1.1
ping -c5 duckduckgo.com以下是您应该收到的输出:
客户端机器可以连接到 IP 地址为 10.8.0.1 的 Wireguard 服务器。
客户端机器可以访问互联网。所有流量都通过 Wireguard 服务器公共 IP 地址路由。
现在您已经在客户端计算机上配置了 wireguard VPN。您还验证了客户端计算机与 Wireguard 服务器之间的连接。
结论
在本指南中,您已经在 Rocky Linux 9 上安装和配置了 wireguard VPN 服务器。您还学习了如何设置 Rocky Linux 客户端计算机以连接到 wireguard 服务器。除此之外,您还学习了如何通过 firewalld 启用端口转发和设置 NAT。
最后,您了解了 wg 命令实用程序的基本用法,用于生成公钥和私钥对以及验证 wireguard VPN 连接。然后,您还学习了如何使用 wg-quick 命令启动和停止 wireguard 连接。
如果您想了解有关 WireGuard 的更多信息,请访问 WireGuard 文档。此外,您还可以访问与 Wireguard 相关的 GitHub 主题,以查找 WireGuard VPN Server 的自动化部署。