下一代VPN代表WireGuard介绍与部署测试


wireguard是下一代linux内核级VPN,更加安全、性能更好并且更方便配置使用,是系统运维人员、网络运维人员的好帮手。

介绍

WireGuard是一个非常简单而且快速,又现代化的一个安全的3层加密隧道网络软件,主要工作在内核里面。
使用了最先进的加密技术,工作在3层。
基于linux内核虚拟网络接口实现。
出现的目的是替换ipsec以及流行在用户态运行的基于tls的解决方案,比如openvpn这类vpn。
同时wireguard比这些vpn更加安全、性能更好并且更方便配置使用,是系统运维人员、网络运维人员的好帮手。
WireGuard是基于UDP协议传输的。
Key交换加密使用Noise_IK。

安装(基于ubuntu server)

apt install software-properties-common -y
add-apt-repository ppa:wireguard/wireguard
apt update
apt install wireguard -y
modprobe wireguard && lsmod | grep wireguard

配置

cd /etc/wireguard
wg genkey | tee sprivatekey | wg pubkey > spublickey
wg genkey | tee cprivatekey | wg pubkey > cpublickey

生成服务端配置文件

echo "[Interface]
# 服务器的私匙,对应客户端配置中的公匙(自动读取上面刚刚生成的密匙内容)
PrivateKey = $(cat sprivatekey)
# 本机的内网IP地址,一般默认即可,除非和你服务器或客户端设备本地网段冲突
Address = 10.0.0.1/24 
# 运行 WireGuard 时要执行的 iptables 防火墙规则,用于打开NAT转发之类的。
# 如果你的服务器主网卡名称不是 eth0 ,那么请修改下面防火墙规则中最后的 eth0 为你的主网卡名称。
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 停止 WireGuard 时要执行的 iptables 防火墙规则,用于关闭NAT转发之类的。
# 如果你的服务器主网卡名称不是 eth0 ,那么请修改下面防火墙规则中最后的 eth0 为你的主网卡名称。
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 服务端监听端口,可以自行修改
ListenPort = 41414
# 服务端请求域名解析 DNS
DNS = 8.8.8.8
# 保持默认
MTU = 1420
# [Peer] 代表客户端配置,每增加一段 [Peer] 就是增加一个客户端账号,具体我稍后会写多用户教程。
[Peer]
# 该客户端账号的公匙,对应客户端配置中的私匙(自动读取上面刚刚生成的密匙内容)
PublicKey = $(cat cpublickey)
# 该客户端账号的内网IP地址
AllowedIPs = 10.0.0.2/32"|sed '/^#/d;/^\s*$/d' > wg0.conf

---
echo "[Interface]
PrivateKey = $(cat sprivatekey)
Address = 10.0.0.1/24 
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 41414
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = $(cat cpublickey)
AllowedIPs = 10.0.0.2/32"|sed '/^#/d;/^\s*$/d' > wg0.conf
---
生成客户端配置文件
echo "[Interface]
# 客户端的私匙,对应服务器配置中的客户端公匙(自动读取上面刚刚生成的密匙内容)
PrivateKey = $(cat cprivatekey)
# 客户端的内网IP地址
Address = 10.0.0.2/24
# 解析域名用的DNS
DNS = 8.8.8.8
# 保持默认
MTU = 1420
[Peer]
# 服务器的公匙,对应服务器的私匙(自动读取上面刚刚生成的密匙内容)
PublicKey = $(cat spublickey)
# 服务器地址和端口,下面的 X.X.X.X 记得更换为你的服务器公网IP,端口请填写服务端配置时的监听端口
Endpoint = X.X.X.X:443
# 因为是客户端,所以这个设置为全部IP段即可,也可以根据需要设置目标网络。比如AllowedIPs = 10.10.1.0/24,xxxx/xx等
AllowedIPs = 0.0.0.0/0, ::0/0
# 保持连接,如果客户端或服务端是 NAT 网络(比如国内大多数家庭宽带没有公网IP,都是NAT),那么就需要添加这个参数定时链接服务端(单位:秒)。
#如果你的服务器和你本地都不是 NAT 网络,那么建议不使用该参数(设置为0,或客户端配置文件中删除这行)
PersistentKeepalive = 25"|sed '/^#/d;/^\s*$/d' > client.conf
---
echo "[Interface]
PrivateKey = $(cat cprivatekey)
Address = 10.0.0.2/24
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = $(cat spublickey)
Endpoint = a.b.c.d:41414
AllowedIPs = 0.0.0.0/0, ::0/0    
PersistentKeepalive = 25"|sed '/^#/d;/^\s*$/d' > client.conf

a.b.c.d是发布到公网的ip 41414是udp协议
AllowedIPs 目标路由网段,上面8个0表示所有出口都走abcd出去,这里可以自定义目标网络。


客户端和服务器端是双向对等体关系,在AllowedIPs可以互相指向内部网段,做好MASQUERADE即可。

启动

wg-quick up wg0

设置开机启动

systemctl enable wg-quick@wg0

取消开机启动

systemctl disable wg-quick@wg0

查询WireGuard状态

wg

停止WireGuard

wg-quick down wg0

我们在阿里云海外到aws之间,由于存在数据库主从数据同步业务需求。
我们在老的openvpn和新的WireGuard之间做了网络性能对比测试。

由于有不要脸的脚本小子刷本站流量,我已将图片屏蔽!

中间是Openvpn的网络,可以看见延迟较高,而且波动范围较大,WireGuard是左和右之间一直稳定在259ms-260ms之间。

安全