简介

轻量级,高效的, 官网地址:https://www.wireguard.com

相比于 OpenVPN 、 IPSec 的几十万行代码,WireGuard 只有短短的四千行

安全性

  • Curve25519 目前最高水平的秘钥交换算法。
  • ChaCha20 对称加解密算法,比 AES 更快更高效。
  • Poly1305 是一种 MAC (Message Authentication Code) 标准,用于验证数据的完整性和消息的真实性。
  • BLAKE2 一种更安全的 HASH 算法(类似的有 SHA1, SHA256, MD5)
  • SipHash24 另一种 HASH 算法。
  • HKDF 一种秘钥衍生算法

Linux之父评价

Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn’t perfect, but I’ve skimmed it, and compared to the horrors that are OpenVPN and IPSec, it’s a work of art(它是一件艺术品).

环境要求

服务器要求:OpenVZ 虚拟化的服务器不支持安装该VPN,其他虚拟化均可。

安装

$ yum update -y
$ reboot # unless there were no updates
$ sudo curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
$ sudo yum -y install epel-release
$ sudo yum -y install wireguard-dkms wireguard-tools

验证是否安装成功
[root@localhost ~]# modprobe wireguard && lsmod | grep wireguard
wireguard             204791  0 
ip6_udp_tunnel         12755  1 wireguard
udp_tunnel             14423  1 wireguard

配置说明

WireGuard的多用户配置特别简单,只需要生成一对客户端密匙(公匙+私匙),在服务端配置文件中新增一段 [Peer] 写上新的客户端公匙和客户端的内网IP地址即可。(当然我们可以用命令快捷添加,或者手动修改服务端配置文件也行。)

而各客户端账号配置文件的区别也只是 [Interface] 中的客户端私匙和客户端内网IP地址不同罢了。

另外我们需要明白一个对等原则:

  • 服务端配置文件中的 [Interface] 是保存自己的服务端私匙,而客户端配置文件中的 [Interface] 同样保存自己的客户端私匙。
  • 服务端配置文件中的 [Peer] 是保存客户端的公匙,而客户端配置文件中的 [Peer] 是保存服务端的公匙。
  • 服务端与客户端都是互相保存自己的私匙在 [Interface] 中,互相保存对方公匙在 [Peer] 中。

配置

# 首先进入配置文件目录,如果该目录不存在请先手动创建:mkdir /etc/wireguard
cd /etc/wireguard

# 然后开始生成 密匙对(公匙+私匙)。
wg genkey | tee sprivatekey | wg pubkey > spublickey
wg genkey | tee cprivatekey | wg pubkey > cpublickey

# 打开防火墙转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p


# 生成服务端配置文件

------------------------------------------

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 = 443
# 服务端请求域名解析 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 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 = 0.0.0.0/0, ::0/0
# 保持连接,如果客户端或服务端是 NAT 网络(比如国内大多数家庭宽带没有公网IP,都是NAT),那么就需要添加这个参数定时链接服务端(单位:秒),如果你的服务器和你本地都不是 NAT 网络,那么建议不使用该参数(设置为0,或客户端配置文件中删除这行)
PersistentKeepalive = 25"|sed '/^#/d;/^\s*$/d' > client.conf

多用户

前提:你已经配置过 WireGuard 配置文件并启动了.

你也可以手动修改配置文件 [/etc/wireguard/wg0.conf],记得修改完重启一下。以下动态添加无需重启。

# 重新生成一对客户端密匙
# cprivatekey1 为客户端私匙,cpublickey1 为客户端公匙
wg genkey | tee cprivatekey1 | wg pubkey > cpublickey1

# 服务器上执行添加客户端配置代码(新增一个 [peer]):
# $(cat cpublickey1) 这个是客户端公匙,10.0.0.3/32 这个是客户端内网IP地址,按序递增最后一位(.3),不要重复
wg set wg0 peer $(cat cpublickey1) allowed-ips 10.0.0.3/32

# 查看wg状态
wg
# 执行命令后输出内容如下(仅供参考,下面的不是让你执行的命令):
interface: wg0
  public key: xxxxxxxxxxxxxxxxx #服务端私匙
  private key: (hidden)
  listening port: 443
 
peer: xxxxxxxxxxxxxxxxxxxx #旧客户端账号的公匙
  allowed ips: 10.0.0.2/32 #旧客户端账号的内网IP地址
 
peer: xxxxxxxxxxxxxxxxxxxx #新客户端账号的公匙
  allowed ips: 10.0.0.3/32 #新客户端账号的内网IP地址
# 以上内容仅为输出示例(仅供参考)

# 如果显示正常,那么我们就保存到配置文件:
wg-quick save wg0
生成对应客户端配置文件
新客户端配置文件,和其他客户端账号的配置文件只有 [Interface] 中的客户端私匙、内网IP地址参数不一样。

echo "[Interface]
# 客户端的私匙,对应服务器配置中的客户端公匙(自动读取上面刚刚生成的密匙内容)
PrivateKey = $(cat cprivatekey1)
# 客户端的内网IP地址(如果上面你添加的内网IP不是 .3 请自行修改)
Address = 10.0.0.3/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 = 0.0.0.0/0, ::0/0
# 保持连接,如果客户端或服务端是 NAT 网络(比如国内大多数家庭宽带没有公网IP,都是NAT),那么就需要添加这个参数定时链接服务端(单位:秒),如果你的服务器和你本地都不是 NAT 网络,那么建议不使用该参数(设置为0,或客户端配置文件中删除这行)
PersistentKeepalive = 25"|sed '/^#/d;/^\s*$/d' > client1.conf
 
# 上面加粗的这一大段都是一个代码!请把下面几行全部复制,然后粘贴到 SSH软件中执行,不要一行一行执行!
要删除呢也很简单,首先你需要知道你要删除用户的客户端公匙(例如上面刚刚生成的 cpublickey1)。
当然,你也可以手动打开配置文件删除,记得修改后重启。下面的动态删除无需重启。

wg set wg0 peer $(cat cpublickey1) remove
# 如果客户端公匙文件还在,那么可以执行这个命令删除。
# 注意:该命令执行后,就可以跳过下面这段命令了,直接保存配置文件即可。
 
——————————————
 
# 如果客户端公匙文件已删除,那么可以通过 wg 命令看到客户端的公匙:
wg
 
# 执行命令后输出内容如下(仅供参考,下面的不是让你执行的命令):
interface: wg0
  public key: xxxxxxxxxxxxxxxxx #服务端私匙
  private key: (hidden)
  listening port: 443
 
peer: xxxxxxxxxxxxxxxxxxxx #客户端账号的公匙
  allowed ips: 10.0.0.2/32 #客户端账号的内网IP地址
 
peer: xxxxxxxxxxxxxxxxxxxx #客户端账号的公匙
  allowed ips: 10.0.0.3/32 #客户端账号的内网IP地址
# 以上内容仅为输出示例(仅供参考)
 
# 复制你要删除的客户端账号的公匙(peer 后面的字符),替换下面命令中的 xxxxxxx 并执行即可
wg set wg0 peer xxxxxxx remove
# 执行后,我们在用 wg 命令查看一下是否删除成功。

如果删除成功,那么我们就保存到配置文件:
wg-quick save wg0

服务管理

# 启动Wireguard
wg-quick up wg0
 
#关闭WIreguard
wg-quick down wg0
 
# 查看Wireguard状态
wg

# 设置开机启动
systemctl enable wg-quick@wg0

# 取消开机启动
systemctl disable wg-quick@wg0
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐