CentOS 7 Wireguard 实践小记

Wireguard

WireGuard 是一个在 Linux 内核中运行的高性能 VPN 解决方案。

它使用现代加密机制,并且比许多其他 VPN 解决方案更容易配置。另外,WireGuard 的小代码库降低了安全攻击的攻击面,因此提高安全性。对于身份验证和加密,WireGuard 使用类似于 SSH 的键。

以上摘自Red Hat的产品文档。

参与 WireGuard VPN 的所有主机都是同级的。本文档使用术语客户端来描述建立连接的主机,使用服务器来描述固定主机名或客户端连接的 IP 地址的主机,并可选通过这个服务器路由所有流量。

配置Wireguard VPN需要完以下步骤:

  • 安装 Wireguard
  • 为VPN中的每个主机创建公钥和私钥
  • 使用wg-quick启用服务
  • 防火墙配置
  • 配置自启动服务
  • 客户端连接

以上的操作步骤非常简单,记录操作如下。

安装Wireguard

CentOS 7 安装Wireguard可以使用以下三种方法,安装完成需要重启服务器。

方法一:

1
2
3
4
5
$ sudo yum install yum-utils epel-release
$ sudo yum-config-manager --setopt=centosplus.includepkgs=kernel-plus --enablerepo=centosplus --save
$ sudo sed -e 's/^DEFAULTKERNEL=kernel$/DEFAULTKERNEL=kernel-plus/' -i /etc/sysconfig/kernel
$ sudo yum install kernel-plus wireguard-tools
$ sudo reboot

方法二:

1
2
3
$ sudo yum install epel-release elrepo-release
$ sudo yum install yum-plugin-elrepo
$ sudo yum install kmod-wireguard wireguard-tools

方法三:

1
2
3
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
$ sudo yum install wireguard-dkms wireguard-tools

任选其一即可。安装完成,可以查看一下内核模块是否安装成功。

1
2
3
4
$ modprobe wireguard && lsmod | grep wireguard
wireguard 193586 0
ip6_udp_tunnel 12755 1 wireguard
udp_tunnel 14423 1 wireguard

Wireguard 生成服务端公钥和私钥

安装完成后,Wireguard的配置目录在/etc/wireguard目录下。在配置目录中生成服务端的公钥和私钥。

1
2
3
4
5
cd /etc/wireguard/
# 生成服务端公钥和仅钥
wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key
# 配置密钥读写权限
chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key

服务端配置文件

配置文件中已经生成了服务端的公钥和私钥,我们使用wg-quick命令引用服务端的启动配置文件,来启动Wireguard服务。所以,在/etc/wireguard目录下,需要创建一个配置文件,我们就使用wg0来创建。

1
2
3
4
5
6
7
8
vim wg0.conf
[Interface]
# 绑定的IP
Address = 10.0.0.1/24
# 监听的端口
ListenPort = 51820
# 服务端生成的私钥
PrivateKey = server_privatekey_value

总共就这三个参数,Wireguard中所有主机是对等的,谁发起,谁就是客户端。在这个实践小记中,我们假定的移动设备为客户端,如手机、电脑。如实现内网电脑和手机连接Wireguard后能远程互通,我们可以接着生成电脑、手机的公钥和私钥。

如生成客户端公钥和私钥,以电脑为例,操作如下:

1
2
# 生成笔记本客户端的公钥和私钥
wg genkey | tee /etc/wireguard/laptop.private.key | wg pubkey > /etc/wireguard/laptop.public.key

把客户端的私钥和绑定信息写入配置文件中。

1
2
3
4
5
6
7
8
9
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = server_privatekey_value

[Peer]
# laptop
PublicKey = laptop_publickey_value # 生成的笔记本的公钥
AllowedIPs = 10.0.0.2/32 # 笔记本绑定的IP地址

好了,每增加一个对等体,客户端,即在wg0.conf中写入一个Peer,添加对应生成的公钥和绑定信息即可。

防火墙配置和路由转发

要完成服务器通信,需要防火墙和net forward配置。

1、net forward配置。

在/etc/sysctl.d目录中创建一下配置文件wireguard.conf

1
2
3
4
5
6
7
8
cd /etc/sysctl.d
vim wireguard.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# 保存退出
sysctl -p /etc/sysctl.d/wireguard.conf -w
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

2、防火墙配置

1
2
3
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --add-port=51820/udp
firewall-cmd --complete-reload

服务端启动

启动和查看服务端状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
systemctl start wg-quick@wg0.service
systemctl status wg-quick@wg0.service
● 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 Thu 2024-05-02 17:05:11 CST; 1 weeks 5 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
Process: 8971 ExecStop=/usr/bin/wg-quick down %i (code=exited, status=0/SUCCESS)
Process: 9011 ExecStart=/usr/bin/wg-quick up %i (code=exited, status=0/SUCCESS)
Main PID: 9011 (code=exited, status=0/SUCCESS)

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

# 查看服务器网络信息
ip addr show wg0
11: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1370 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
inet6 fe80::6e90:8e6c:b749:a6d4/64 scope link flags 800
valid_lft forever preferred_lft forever


# 服务端开机自启动
systemctl enable wg-quick@wg0.service

客户端连接

以上已经生成的客户端的公钥和私钥,所以,要发起连接,需要客户端导入对应的配置文件,连接服务器。Wireguard客户端程序,支持android,ios,mac os, windows,全平台支持,下载对应的Wireguard程序。导入配置文件,连接即可。

以上笔记本为例,配置文件如下:

1
2
3
4
5
6
7
8
9
10
vim laptop.conf
[Interface] # 本端
Address = 10.0.0.2/24 绑定IP
DNS = 223.5.5.5,223.6.6.6
PrivateKey = laptop_private_key_value
[Peer] # 对端,服务端
PublicKey = server_public_key_value
AllowedIPs = 0.0.0.0/0
Endpoint = server_IP_address:51820
PersistentKeepalive = 25

简单一句话,本端写私钥,对端写公钥。客户端配置文件上对端为服务器端,需要对端的公网地址,及监听端口。服务器端的配置文件,因为移动设备无固定公网IP,所以移动端为发起端,配置文件中的Peer只需要填发起端的公钥及绑定IP即可。

把配置文件下载至手机或电脑,通过Wireguard导出即可。

如手机端的程序,可以通过扫描二维码导入。所以我们可以使用二维码创建工具,将配置文件生成为二维码,直接使用手机扫码导出客户端配置。操作如下:

1
2
yum install qrencode 
qrencode -o laptop.png < laptop.conf # 配置文件生成二维码

对于ubuntu,gui上的网络配置工具,目前未发现如何导入wireguard的配置文件。那就和centos一样,直接wg-quick命令行即可。客户端的配置文件复制到/etc/wireguard目录下,操作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
systemctl start wg-quick@laptop.service
systemctl status wg-quick@laptop.service
● wg-quick@laptop.service - WireGuard via wg-quick(8) for laptop
Loaded: loaded (/lib/systemd/system/wg-quick@.service; disabled; vendor preset: enabled)
Active: active (exited) since Wed 2024-05-15 12:35:51 CST; 10s 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
Process: 122170 ExecStart=/usr/bin/wg-quick up laptop (code=exited, status=0/SUCCESS)
Main PID: 122170 (code=exited, status=0/SUCCESS)

5月 15 12:35:50 ian-ThinkPad-X270 wg-quick[122170]: [#] ip -4 address add 10.0.0.2/24 dev laptop
5月 15 12:35:50 ian-ThinkPad-X270 wg-quick[122170]: [#] ip link set mtu 1420 up dev laptop
5月 15 12:35:50 ian-ThinkPad-X270 wg-quick[122206]: [#] resolvconf -a tun.laptop -m 0 -x
5月 15 12:35:50 ian-ThinkPad-X270 wg-quick[122170]: [#] wg set laptop fwmark 51820
5月 15 12:35:51 ian-ThinkPad-X270 wg-quick[122170]: [#] ip -4 route add 0.0.0.0/0 dev laptop table 51820
5月 15 12:35:51 ian-ThinkPad-X270 wg-quick[122170]: [#] ip -4 rule add not fwmark 51820 table 51820
5月 15 12:35:51 ian-ThinkPad-X270 wg-quick[122170]: [#] ip -4 rule add table main suppress_prefixlength 0
5月 15 12:35:51 ian-ThinkPad-X270 wg-quick[122170]: [#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
5月 15 12:35:51 ian-ThinkPad-X270 wg-quick[122170]: [#] nft -f /dev/fd/63
5月 15 12:35:51 ian-ThinkPad-X270 systemd[1]: Finished WireGuard via wg-quick(8) for laptop.
# 测试到服务器的连接
ip addr show laptop
17: laptop: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.0.0.2/24 scope global laptop
valid_lft forever preferred_lft forever

ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=57.4 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=56.3 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=48.7 ms

客户端连接成功,配置结束。


CentOS 7 Wireguard 实践小记
https://ywmy.xyz/2024/05/15/CentOS-7-Wireguard-实践小记/
作者
ian
发布于
2024年5月15日
许可协议