WireGuard搭建与使用

WireGuard 简介

WireGuard 是一个利用现有社会最先进的加密技术而产生的非常简单和快捷的 VPN 工具。它的目标是比 IPsec 更快,更简单,更精简,更易用,同时避免大规模配置 IPsec 的麻烦事。同时 WireGuard 也打算比 OpenVPN 更高效。WireGuard 设计为通用 VPN,可在嵌入式设备和常见计算机上运行,适用于多种不同情况。WireGuard 最初是为 Linux 内核发布的,而现在 WireGuard 已经可广泛部署并且跨平台支持。WireGuard 目前正在大力发展,但 WireGuard 已经被认为是业内最安全,最易用和最简单的 VPN 解决方案。

官网链接 [ 链接 ]

Arch Wiki [ 链接 ]

WireGuard 基本概念

首先使用 WireGuard 你需要在系统中创建一块虚拟网卡,并配置好这个虚拟网卡的 IP 地址,掩码,网关不需要配置(可以使用 wg-quick@ 自动化)

然后你使用 WireGuard 连接另一台设备,两台互相 peer 对方并验证各自的公钥私钥是否正确,全部正确后成功建立 peer(可以使用 wg-quick@ 自动化)

建立成功后,所有前往虚拟网卡的流量都将被重新封装后发往另一台设备,由另一台设备解封装然后得到数据报文并在内部查找路由并匹配报文目的地。(可以使用 wg-quick@ 自动化)

以上为建立一个 WireGuard VPN 链接的过程,建立好后,A 设备与 B 设备互相需要保证虚拟网卡的 IP 在相同网络位的地址段中,并且这个地址段被 WireGuard 的配置文件 AllowedIPs 所允许通过

如果你试图从 A 设备访问 B 设备的对端子网,你需要在 A 设备上配置系统路由,将系统三层网络的路由目的地指向对端虚拟 IP 地址,出接口为虚拟网卡,并且这个地址段必须被 WireGuard 的配置文件 AllowedIPs 所允许通过

最后,在 WireGuard 中的所有数据报文,都采用 UDP 的方式发送。

WireGuard 安装

官方的安装教程为 [ 链接 ]

注意 windows 没有官方程序,暂时只能使用第三方制作的 TunSafe 程序 [ 链接 ]

TunSafe 在 Windows 环境中安装时,需要安装 TunSafe Client 与 TunSafe-TAP Ethernet Adapter (GPL) 两个程序
前者是 GUI 界面,后者是程序所必需的 TAP 网卡(并且需要翻墙下载安装包)

安装好后可以设置成自动开启,并配置为系统服务

如果是 IOS / Android 系统,可以使用应用商店主动获取,应用 WireGuard 的图标为官网图标,也可以使用 TunSafe 客户端。

CentOS 7 的安装步骤如下(注意默认内核版本不支持自定义网卡 type 所以必须升级)

yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum install yum-plugin-elrepo
yum install kmod-wireguard wireguard-tools

WireGuard 配置

关于如何配置,官方其实有快速安装说明 [ 链接 ]
但由于官方说明实在是很模糊,所以我还是重新强调一些关键点

首先你需要创建一个文件夹存放 WireGuard 的配置文件,本文路径为 /etc/wireguard/ 这个文件夹

然后你需要知道如何生成一份公钥与私钥,命令可以使用下面这个
(私钥为 privatekey 公钥为 publickey)

wg genkey | tee privatekey | wg pubkey > publickey && cat privatekey && cat publickey

以及本文的配置环境如下,括号中携带的是对应主机拥有的其他网段,假设服务端IP为172.168.11.1且客户端能与之通信(相当于服务端的公网IP)

服务端172.16.1.11:8001 ( 172.16.11.0/24 ) <—> 172.16.1.12( 172.16.12.0/24 )客户端

  1. WireGuard 的服务端配置

首先我们创建一个 WireGuard 配置文件

vim /etc/wireguard/wg0.conf
[Interface]
Address=172.16.1.11/24
ListenPort = 8001
PrivateKey = 填写本机的 privatekey 内容

[Peer]
PublicKey = 填写对端的 publickey 内容
AllowedIPs = 172.16.1.12/32,172.16.12.0/24
PersistentKeepalive = 15

然后我们需要允许本机的 NAT 转换,并允许系统进行 IPV4 转发

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
  1. WireGuard 的客户端配置

在客户端设备,我们依然需要创建一个 WireGuard 配置文件

vim /etc/wireguard/wg0.conf
[Interface]
Address = 172.16.1.12/24
PrivateKey = 填写本机的 privatekey 内容
DNS = 1.1.1.1  #强制本机使用 DNS 服务器,可选
MTU = 1420  #强制本机使用指定 MTU 值

[Peer]
PublicKey = 填写对端的 publickey 内容
AllowedIPs = 172.16.1.11/32,172.16.11.0/24 #如果想跟wireguard其他客户端内网互通则写172.168.1.0/24
Endpoint = 172.16.11.1:8001
PersistentKeepalive = 15

然后我们需要允许系统进行 IPV4 转发

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
  1. WireGuard 的自动启动

可以通过 Systemctl 管理 wg 进程:

  • 设置为自动启动 wg0:systemctl enable wg-quick@wg0
  • 禁用服务:systemctl disable wg-quick@wg0
  • 启动服务:systemctl start wg-quick@wg0
  • 重启服务:systemctl restart wg-quick@wg0
  • 查看服务状态:systemctl status wg-quick@wg0
  1. WireGuard 的配置说明

[Interface]
# 服务端监听端口,可以自行修改
ListenPort = 8002

# 服务器的私匙,对应客户端配置中的公匙(自动读取上面刚刚生成的密匙内容)
PrivateKey = $(cat sprivatekey)

# 强制本机使用 DNS 服务器
DNS = 1.1.1.1

#强制本机使用指定 MTU 值
MTU = 1420

# 运行 WireGuard 时要执行的 iptables 防火墙规则,用于打开NAT转发之类的,也可写成PreUp
# 如果你的服务器主网卡名称不是 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转发之类的,也可写成PreDown
# 如果你的服务器主网卡名称不是 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

也可以使用linux策略路由控制策略流量转发,如下
# 强制本机将注入系统的路由的 table 指定为 100 ( 系统默认为 255 和 254 )
#Table = 100
#PostUp = ip rule add from 10.10.1.0/24 table 100 ; ip rule add from 10.10.2.0/24 table 100
#PostDown = ip rule delete from 10.10.1.0/24 table 100 ; ip rule delete from 10.10.2.0/24 table 100

# [Peer] 代表客户端配置,每增加一段 [Peer] 就是增加一个客户端账号
[Peer]
# 该客户端账号的公匙,对应客户端配置中的私匙(自动读取上面刚刚生成的密匙内容)
PublicKey = 填写对端的 publickey 内容

# 该客户端账号的内网IP地址
AllowedIPs = 172.16.1.11/32  #本机允许的对端设备的 IP 地址段,其实就是在本机中这个虚拟网卡对端都有哪些设备 IP 地址(多 peer 不可重复)

#当会话存在一端 IP 地址为 NAT 地址或虚假公网 IP 地址时,由该方阶段性每 15 秒发送 keepalive 报文保持会话的可用性,防止被设备终止。
PersistentKeepalive = 15

在上方基础上,额外要注意的是

  • 如果你存在多个 [Peer] ,则在下面直接增加一个新的 [Peer] 栏目
  • 如果多个 Peer 存在不同的 IP,请不要让 AllowedIPs 存在重叠的 IP 地址段(比如配置多个相同/24 只有一个生效)
  • Endpoint 既支持以域名的方式访问,也支持以 IP 的方式访问。
  • 会话链接的建立只要保证两端数据在一台设备上成功协商,即使有一端 IP 地址后期变更过也不会影响 VPN 的稳定性。
  • 使用命令 wg 可以看到当前服务的运行情况。
  • PreUp,PostUp,PreDown,PostDown 这四个命令参数,是作为 wg-quick 快速设置/删除接口之前/之后由 bash(1)执行的四条命令,常用于配置自定义 DNS 或防火墙规则。 特殊字符串 %i 作为变量替代所控制的 INTERFACE 配置名。 每个命令参数都支持多条命令,参数内的多条命令将按前后顺序依次执行。

新增客户端

  1. 服务端配置

重新生成一对客户端密匙,cprivatekey1 为客户端私匙,cpublickey1 为客户端公匙

wg genkey | tee cprivatekey1 | wg pubkey > cpublickey1

分为动态配置和静态配置两种方法

  • 静态配置(不推荐)

编辑Wireguard配置文件

vim /etc/wireguard/wg0.conf

新增一个Peer

[Peer]
PublicKey = $(cat cpublickey1)
AllowedIPs = xxx.xxx.xxx.xxx/32 # 分配给新客户端的IP地址,如果要跟客户端拥有的其他网段互通就写上客户端拥有的其他内网网段
PersistentKeepalive = 15 #设定Keepalive

重启Wireguard服务,客户端连接会中断,但是设置了Keepalive,最慢15秒后会重新连接上来

systemctl restart wg-quick@wg0
  • 动态配置(推荐)

使用动态配置服务端可以不用重启,不会导致与别的客户端中断连接

使用命令方式增加一个Peer

wg set wg0 peer $(cat cpublickey1) allowed-ips xxx.xxx.xxx.xxx/32 persistent-keepalive 15

然后查看wireguard状态

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

如果显示正常,那么我们就保存到配置文件

wg-quick save wg0
  1. 客户端配置
[Interface]
PrivateKey = $(cat cprivatekey1)
Address = 192.168.23.2/24
DNS = 8.8.8.8 # 设定DNS服务器,也可不设置
MTU = 1420 # 设置MTU值,与服务端一致
[Peer]
PublicKey = 服务端公钥
Endpoint = 服务端地址和端口
AllowedIPs = 要走wireguard的ip地址段
PersistentKeepalive = 15 # 设定Keepalive
  1. 启动wireguard服务
systemctl start wg-quick@wg0

转载请注明来源