安装

WireGuard的安装条件非常苛刻,对内核的版本要求极高。

目前WireGuard已经被合并到5.6内核之中,如果你的内核版本>=5.6,那么你只需要安装一个wireguard-tools工具,就可以使用原生的Wireguard了,否则你需要先更新内核或者安装对应的内核模块。

以AlmaLinux8系统为例,首先需要安装两个仓库,前者提供kmod-wireguard内核支持,后者提供wireguard-tools配置工具。

sudo dnf install elrepo-release epel-release
sudo dnf install kmod-wireguard wireguard-tools

配置

WireGuard极其精简,每个客户端/服务端只需要一个公钥和一个私钥,使用wg命令生成一对密钥。

wg genkey | tee wg0-prikey | wg pubkey > wg0-pubkey

作为服务端配置

在/etc/wireguard目录中创建wg0.conf,配置文件名称wg0即是虚拟网络接口的名称。

[Interface]
Address = 172.16.1.1/24
ListenPort = 5432
PrivateKey = mNeijvAyAyFkI3nqvGdTXHnXEH1l5FmOQIS4kP6W33c=

[Peer]
PublicKey = M+CWlLCaRt0vJVS1l8Ot3auOmxaDze5/kswhkkBQwm8=
AllowedIPs = 192.168.1.1/24
PersistentKeepalive = 25

作为客户端配置

[Interface]
Address = 172.16.1.1/24
PrivateKey = mNeijvAyAyFkI3nqvGdTXHnXEH1l5FmOQIS4kP6W33c=

[Peer]
PublicKey = M+CWlLCaRt0vJVS1l8Ot3auOmxaDze5/kswhkkBQwm8=
Endpoint = 10.20.30.3:5432
AllowedIPs = 192.168.1.1/24
PersistentKeepalive = 25

注意:实际上每个WireGuard节点并不区分服务端和客户端,由谁发起连接谁就是客户端,所以客户端必须配置Endpoint指明向哪里发送连接。而服务端则需要配置ListenPort指明监听的UDP端口,如果不配置的话,会随机生成一个监听端口。

PersistentKeepalive参数用于保持链接的存活,默认情况下wireguard在不使用的情况下尽量少发送数据包,但是在对于位于NAT后的peer1来讲,其公网地址随时都在变化,所以我们希望通过定时发送存活包让peer2知晓peer1的公网地址与对应的端口,保持链接的存活性,这就是所谓的IP漫游。

AllowedIPs实际上表示的是此接口运行转发的数据包目的地址段,还需要配合系统路由使用。

启动

使用wg-quick命令控制WireGuard接口的启停,接口名称wg0实际上就是配置文件的名称。

wg-quick up wg0
wg-quick down wg0

可以通过wg查看WireGuard的运行状态。

interface: wg0
  public key: 7irKUQDLvXMG46LQU51F3pG0+LTEar0AK9l+G9U6RGM=
  private key: (hidden)
  listening port: 53427

peer: M+CWlLCaRt0vJVS1l8Ot3auOmxaDze5/kswhkkBQwm8=
  endpoint: 10.20.30.1:5432
  allowed ips: 192.168.0.0/24
  latest handshake: 1 second ago
  transfer: 17.63 MiB received, 693.92 MiB sent
  persistent keepalive: every 25 seconds

建立连接后,可以通过隧道的虚拟接口地址进行连接。如果要实现子网间的路由,则需要配置对应的路由转发规则。例如使用iptables,可以在WireGuard配置文件中PostUp和PostDown参数指定接口启停时执行的iptables命令。

[Interface]
Address = 5.5.5.2/24
# 内网转发规则,将数据包做MASQUERADE源地址转换,并通过eth0转发出去
# eth0根据实际情况修改,ifconfig可查看
PostUp   = iptables -A FORWARD -i %i -j ACCEPT
PostUp   = iptables -A FORWARD -o %i -j ACCEPT
PostUp   = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 在wireguard关闭时清除这些iptables转发规则
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PrivateKey = oAaT5OjURGvVqs/pbMa2HAsZXpbwNQCEzW0MZBmGJ1Y=

可以参考之前写的基于OpenVPN实现子网路由的文章:使用Mikrotik的RouterOS搭建OpenVPN服务器,以及配置内网互连

最后修改:2022 年 08 月 20 日
如果觉得我的文章对你有用,请随意赞赏