Bootstrap

记录 | 通过WireGuard实现异地组网

前言

由于我管理着几台不同地域,不同网络,网络类型并不相同( NAT端口转发 / 公网独立IP )的云服务器,以及我需要将家中的服务器的服务映射至公网以供其他人进行访问,所以我需要一个异地组网方案解决该问题。

网络环境

名称网络类型地域
家里网络无公网IP广州
服务器1有公网IP(大带宽)宁波
服务器2有公网IP香港
服务器3有公网IP香港
服务器4NAT端口转发宿迁

解决方案:WireGuard

为什么选择WireGuard

听说很好用,然后部署十分简单,此前用过OPENVPN,觉得部署稍微麻烦了一些,因此决定选择WireGuard进行异地组网,结果也是确实十分的好用,部署很快,很方便。

WireGuard是通过UDP进行通信的且具有不错的安全性。

服务端部署

服务端我选择部署在服务器1上,因为它是一个大带宽的机型,上下行对等300M足以应付我的日常需求

在服务器上安装相应的软件

服务器1 安装的是 Ubuntu 20.0.4 操作系统 通过 apt 直接安装wireguard即可

sudo apt install wireguard

生成公钥与私钥并保存

WireGuard通过wg genkey 生产秘钥,然后在通过wg pubkey生成公钥。

wg genkey > privatekey
wg pubkey < privatekey > publickey

开启内核IP转发

由于WireGuard是通过系统内核进行数据包转发的,因此你需要打开IPV4地址转发才能正常工作!!!

echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
/etc/init.d/procps restart

撰写配置文件

切换进WireGuard目录下(/etc/wireguard),创建一个配置文件wg0.conf

cd /etc/wireguard
vim wg0.conf

wg0.conf文件内容如下:

[Interface]
# 本机密钥
PrivateKey = gAyQXM5w/b2vaWB3Dn84uZlFrsuUj7Gz+/doJYv07FY=
# 本机地址
Address = 172.20.20.1/24
# 监听端口
ListenPort = 57760
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens18 -j MASQUERADE

# 客户端配置
# Client-1-172.20.20.11
[Peer]
PublicKey = 客户端1公钥
AllowedIPs = 172.20.20.11/32

# Client-1-172.20.20.12
[Peer]
PublicKey = 客户端2公钥
AllowedIPs = 172.20.20.12/32

1.文件中的客户端公钥在稍后客户端配置时会获得,获得后需要填入对应位置
2.AllowedIPs 的地址 是分配给客户端的IP地址: 172.20.20.11/32

完成后按下esc 输入wq 保存文件

配置客户端配置

由于我是Windows客户端 因此 此处以windows客户端举例

安装Wireguard

在WireGuard官方网站(https://www.wireguard.com/install/)上可以直接找到对应系统的安装包

Windows安装包下载

下载完成后,正常运行安装程序,即可安装成功,便不再赘述

创建客户端配置文件

WireGuard的配置文件是通用的,如果需要部署在Linux系统下 只需与服务端一样,使用aptyum 等工具 安装wireguard,并将配置文件放入对应位置,使用与服务端相同命令启动即可。

在隧道列表的左下角你可以看见新建隧道按钮,点击旁边的三角按钮展开,选择新建空隧道,点击即可创建新配置文件

新建空隧道

创建新隧道配置文件

在新隧道配置文件中你可以看到公钥(将他填入服务端的配置文件中)以及私钥。

以下,是一个客户端配置文件实例

[Interface]
PrivateKey = 4Fg7VJJnvt3iZwu5bYrmeDZoAz3BD7y1hq0+jFACMmo=
# IP地址
Address = 172.20.20.26/24

[Peer]
PublicKey = hZyrKY1pQ+0Y45okw+IwTAOENA9pIhJ2dRJUubxCpDo=
# IP地址段
AllowedIPs = 172.20.20.0/24
# 对应的WireGuard服务器地址与端口
Endpoint = wg.********.top:57760
# 心跳频率
PersistentKeepalive = 25

配置完成后点击保存即可,至此服务端配置完成。其他客户端只需要对

启动与停止

在完成Wireguard安装、撰写配置文件完成后,我们可以通过命令启动我们的WireGuard

Linux系统

方式一:wg-quick命令
# 启动
wg-quick up wg0
# 停止
wg-quick down wg0
方式二:systemctl 服务启动

此种方式有一个优势,可以实现开机自启动

# 启动
systemctl start wg-quick@wg0
# 设置开机自启动
systemctl enable wg-quick@wg0
# 停止
systemctl stop wg-quick@wg0
# 关闭开机自启动
systemctl disable wg-quick@wg0
使用wg命令查看当前Wireguard链接情况
wg

查看链接情况

已被连接过的IP与未被启用的IP对比

Windows系统

在windows系统下,您只需正确安装Wireguard的软件,将配置导入软件当中

软件界面

点击右侧面板链接按钮,当看到状态为已连接,且下方的节点中的上次握手时间会自动刷新即为连接成功

已经成功连接的软件界面

检验链接情况

使用ping命令,测试连接情况

请务必确保测试的节点防火墙不会拦截ICMP数据包,否则将无法正常测试

PING通!

如果可以正常ping通,即证明链路已建立,异地组网已完成。

Cheers!

;