安装
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=
Table = off
PostUp = ip route add 192.168.20.5/32 via 10.0.9.2 dev %i
PostDown = ip route del 192.168.20.5/32 via 10.0.9.2 dev %i
[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服务器,以及配置内网互连
参考:
https://github.com/pirate/wireguard-docs#NAT-to-NAT-Connections