如何在 CentOS 8 上设置 WireGuard VPN

WireGuard 是一个使用 state-of-the-art 加密的现代 VPN (Virtual Private Network) 技术。和其他类似的方案相比,例如:IPsec 和 OpenVPN。 WireGuard 更快,更容易配置,并且性能更好。
WireGuard是一个跨平台产品,并且几乎可以在任何地方运行,包括:Linux,Windows,Android 和 macOS。Wireguard 是一个 P2P VPN;它不使用客户端/服务端模式。依赖于它的配置,一个节点即可以作为服务器,或者客户端。
WireGuard通过在每一个节点设备上创建一个网络接口作为一个隧道。节点之间授权通过交换和验证公钥,像 SSH 模式一样。公钥被映射到在隧道中允许的 IP 地址列表上。VPN 流量通过 UDP 协议封装。
在这个指南中,我们将会在 CentOS 8 机器上设置 WireGuard 作为 VPN 服务器。我们也会向你展示如何配置 WireGuard 作为一个客户端。客户端的流量将会通过 CentOS 8 服务器。这个设置可以用来防止中间人攻击,匿名上网,突破地理限制,或者允许远程协作。
一、前提条件
你将需要一台 CentOS 8 服务器,你可以以 root 或者 其他拥有 sudo 权限用户身份登录。
二、设置 WireGuard 服务器
我们将会在 CentOS 机器上安装 WireGuard 并且设置它作为一个服务器。我们将会配置系统来引导客户端的流量通过它。
2.1 在 CentOS 8 上安装 WireGuard
WireGuard 工具和内核模块在 Epel 和 Elrepo 软件源中可用。想要将这些软件源添加到你的系统,运行下面的命令:
sudo dnf install epel-release elrepo-release
一旦完成,安装 WireGuard 软件包:
sudo dnf install kmod-wireguard wireguard-tools
你将会被要求导入软件源 GPG Keys。如果问到时,输入y
。
2.2 配置 WireGuard
wireguard-tools
包含两个工具,名为wg
和wg-quick
,它允许你配置和管理 WireGuard 接口。
我们将会保存 VPN 服务器配置文件在/etc/wireguard
目录。在 CentOS 系统上,这个目录在安装的时候没有创建。运行下面的命令创建这个目录:
sudo mkdir /etc/wireguard
在 /etc/wireguard
目录下生成 公钥和私钥。
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
你可以通过使用cat
或者less
来查看文件。私钥永远不要共享给任何人。
现在密钥已经被生成好了,我们需要配置隧道设备,用来引导 VPN 流量。
这个设备可以通过命令行使用ip
和wg
或者通过文本编辑器创建配置文件来设置。
创建一个名为wg0.conf
的文件,并且添加下面的内容:
sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
PostUp = firewall-cmd --zone=public --add-port 51820/udp && firewall-cmd --zone=public --add-masquerade
PostDown = firewall-cmd --zone=public --remove-port 51820/udp && firewall-cmd --zone=public --remove-masquerade
这个接口可以被命名为任何东西。不管怎么样,我们推荐使用类似wg0
或者wgvpn0
进行命名。这个接口中的设置意义如下:
- Address - 一个使用逗号分隔的 v4 或者 v6 IP 地址列表,用于
wg0
接口。使用 局域网 IP 范围(10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16)。 - ListenPort - WireGuard 将会接受进入连接的端口
- PrivateKey - 一个由
wg genkey
命令生成的私钥。(想要查看文件内容:sudo cat /etc/wireguard/privatekey
) - SaveConfig - 当设置为 true 时,在关机时,当前接口状态将会被保存到配置文件中。
- PostUp - 在接口启动时执行的命令或者脚本。在这个例子中,我们使用 firewall-cmd 来打开WireGuard端口并启用 伪装。 这将允许流量离开服务器,使得 VPN 客户端可以访问网络。
- PostDown - 在接口停用之前执行的命令或者脚本。一旦接口停止,防火墙规则将会被移除,网络接口将会下线。
wg0.conf
和privatekey
文件不应该对普通用户可读。使用 chmod 将权限修改为 600
。
sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}
一旦完成,使用配置文件中的指定配置,将wg0
接口启用:
sudo wg-quick up wg0
这个命令将会产生类似下面的输出:
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.0.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
想要检查接口状态和配置,运行:
sudo wg show wg0
输出:
interface: wg0
public key: My3uqg8LL9S3XZBo8alclOjiNkp+T6GfxS+Xhn5a40I=
private key: (hidden)
listening port: 51820
你也可以运行ip a show wg0
来验证接口状态:
ip a show wg0
输出:
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.0.0.1/24 scope global wg0
valid_lft forever preferred_lft forever
启用 WireGuard 开机启动,运行下面的命令:
sudo systemctl enable wg-quick@wg0
2.3 服务器网络
想要 NAT 运行,我们需要启用 IP 转发。打开/etc/sysctl.d/99-custom.conf
文件,并且添加或者取消下面行的注释:
sudo nano /etc/sysctl.d/99-custom.conf
net.ipv4.ip_forward=1
保存文件,并且应用修改:
sudo sysctl -p /etc/sysctl.d/99-custom.conf
输出:
net.ipv4.ip_forward = 1
就这些。作为服务器的 CentOS 节点已经设置好了。
三、Linux 和 macOS 客户端设置
所有支持平台的安装指南都在https://wireguard.com/install/。在 Linux 系统中,你可以通过使用发行版的软件包管理工具进行安装,在 macOS 上可以使用brew
。一旦你安装好 WireGuard,按照下面的步骤去配置客户端设备。
设置 Linux 和 macOS 客户端的过程和服务器的非常相似。开始生成公钥和私钥:
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
创建文件wg0.conf
并且添加下面的内容:
sudo nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_IP_ADDRESS:51820
AllowedIPs = 0.0.0.0/0
在接口段和服务器上的意思是一样的:
- Address - 一个使用逗号分隔的 v4 或者 v6 IP 地址列表,用于
wg0
接口。 - PrivateKey - 想要查看客户端文件内容运行:
sudo cat /etc/wireguard/privatekey
在节点段,包含下面的字段:
- PublicKey - 你想要连接的节点上的公钥。(服务器
/etc/wireguard/publickey
文件内容)。 - Endpoint - 你想要连接的节点的 IP 地址或者主机名,加上分号,再加上远程节点监听的端口号。
- AllowedIPs - 一个以逗号分隔的 v4 或者 v6 IP 地址列表。我们使用
0.0.0.0/0
因为我们需要引导流量,并且希望服务器节点发送任何源 IP 的包。
如果你需要配置其他的客户端,仅仅需要重复同样的步骤,使用不同的私有 IP 地址。
四、Windows 客户端设置

一个公钥被自动创建,并且显示在屏幕上。

输入隧道名字,并且编辑配置文件如下:
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_IP_ADDRESS:51820
AllowedIPs = 0.0.0.0/0
在接口端,添加一个新行来定义客户端隧道地址。
在节点段添加下面字段:
- PublicKey - CentOS 服务器上的公钥(
/etc/wireguard/publickey
文件)。 - Endpoint - CentOS 服务器,加上分号,再加上 WireGuard 端口(51820)。
- AllowedIPs - 0.0.0.0/0
一旦完成,点击"Save"按钮。
五、将节点添加到服务器
最后一步就是将客户端的公钥和 IP 地址添加到服务器:
sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.0.0.2
确保修改CLIENT_PUBLIC_KEY
为你在客户端机器上修改的公钥(sudo cat /etc/wireguard/publickey
),并且调整客户端 IP 地址。Windows 用户可以从 WireGuard 应用中拷贝公钥。
一旦完成,返回客户端机器,并且使隧道接口上线。
5.1 Linux 和 macOS 客户端
在 Linux 客户端上,运行下面的命令,将接口上线:
sudo wg-quick up wg0
现在你将被连接到 CentOS 服务器,并且从你客户端机器的流量将会通过这个服务器。你可以检查连接:
sudo wg
输出:
interface: wg0
public key: sZThYo/0oECwzUsIKTa6LYXLhk+Jb/nqK4kCCP2pyFg=
private key: (hidden)
listening port: 60351
fwmark: 0xca6c
peer: My3uqg8LL9S3XZBo8alclOjiNkp+T6GfxS+Xhn5a40I=
endpoint: XXX.XXX.XXX.XXX:51820
allowed ips: 0.0.0.0/0
latest handshake: 41 seconds ago
transfer: 213.25 KiB received, 106.68 KiB sent
你可以打开你的浏览器,并且输入"what is my ip",并且你可以看到你的 CentOS 服务器地址。
想要停止隧道,将wg0
接口下线:
sudo wg-quick down wg0
5.2 Windows 客户端
如果你在 Windows 上安装了 WireGuard。点击"Activate"按钮。一旦节点连接,隧道状态,将会变成 Active:

六、总结
我们已经展示了如何在 CentOS 8 机器上安装 WireGuard 并且配置为一个 VPN 服务器。这个设置允许你匿名上网,保证流量数据私有。
如果你有任何疑问,请通过以下方式联系我们:
微信:

微信群: 加上面的微信,备注微信群
QQ: 3217680847

原文 :https://linuxize.com/post/how-to-set-up-wireguard-vpn-on-centos-8/
版权声明:本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。