1、WireGuard 简介

WireGuard 是一个利用现有社会最先进的加密技术而产生的非常简单和快捷的 VPN 工具。它的目标是比 IPsec 更快,更简单,更精简,更易用,同时避免大规模配置 IPsec 的麻烦事。同时 WireGuard 也打算比 OpenVPN 更高效。WireGuard 设计为通用 VPN,可在嵌入式设备和常见计算机上运行,适用于多种不同情况。WireGuard 最初是为 Linux 内核发布的,而现在 WireGuard 已经可广泛部署并且跨平台支持。WireGuard 目前正在大力发展,但 WireGuard 已经被认为是业内最安全,最易用和最简单的 VPN 解决方案。
官网链接 [ https://www.wireguard.com/ ]
Arch Wiki [ https://wiki.archlinux.org/index.php/WireGuard_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) ]

2、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 的方式发送。

3、WireGuard 安装

官方的安装教程为 [ https://www.wireguard.com/install/ ]

注意 windows 没有官方程序,暂时只能使用第三方制作的 TunSafe 程序 [ https://tunsafe.com/ ]
TunSafe客户端介绍以及下载点我转跳

TunSafe 在 Windows 环境中安装时,需要安装 TunSafe Client 与 TunSafe-TAP Ethernet Adapter (GPL) 两个程序
前者是 GUI 界面,后者是程序所必需的 TAP 网卡(安装包下载请自行想办法解决)

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

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

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

curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
yum install epel-release -y
yum install wireguard-dkms wireguard-tools -y

4、WireGuard 主端配置

关于如何配置,官方其实有快速安装说明 [ https://www.wireguard.com/quickstart/ ]
但由于官方说明实在是很模糊,所以我还是重新强调一些关键点

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

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

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

以及本文的配置环境如下,括号中携带的是对应主机拥有的其他网段

172.16.1.11:8001 ( 172.16.11.0/24 ) <—> 172.16.1.12:8002 ( 172.16.12.0/24 )

4.1、WireGuard 的主端配置

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

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

[Peer]
PublicKey = 填写对端的 publickey 内容
AllowedIPs = 172.16.1.12/32,172.16.12.0/24
Endpoint = another.domain.name:8002
PersistentKeepalive = 25

然后我们需要创建一个网卡配置文件(此配置等价于移动客户端的 Interface 配置)

vim /etc/sysconfig/network-scripts/ifcfg-wg0
DEVICE=wg0
TYPE=wireguard
IPADDR=172.16.1.11
NETMASK=255.255.255.0
ONBOOT=yes
NAME=wg0
ZONE=public

接着我们需要创建一个网卡路由文件(由于对方存在 172.16.12.0/24 这个 IP 地址段的前提下)

vim /etc/sysconfig/network-scripts/route-wg0
172.16.12.0/24 via 172.16.1.12 dev wg0

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

firewall-cmd --add-masquerade --zone=public --permanent
firewall-cmd --reload
sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

4.2、WireGuard 的对端配置

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

vim /etc/wireguard/wg0.conf
[Interface]
ListenPort = 8002
PrivateKey = 填写本机的 privatekey 内容
DNS = 1.1.1.1  #强制本机使用 DNS 服务器
MTU = 1300  #强制本机使用指定 MTU 值

[Peer]
PublicKey = 填写对端的 publickey 内容
AllowedIPs = 172.16.1.11/32,172.16.11.0/24
Endpoint = another.domain.name:8001
PersistentKeepalive = 25

然后我们需要创建一个网卡配置文件

vim /etc/sysconfig/network-scripts/ifcfg-wg0
DEVICE=wg0
TYPE=wireguard
IPADDR=172.16.1.12
NETMASK=255.255.255.0
ONBOOT=yes
NAME=wg0
ZONE=public

接着我们需要创建一个网卡路由文件(假设对方存在 172.16.11.0/24 这个 IP 地址段的前提下)

vim /etc/sysconfig/network-scripts/route-wg0
172.16.11.0/24 via 172.16.1.11 dev wg0

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

firewall-cmd --add-masquerade --zone=public --permanent
firewall-cmd --reload
sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

4.3、WireGuard 的自动启动

第一种方案你需要编辑并添加开机启动项(手动模式推荐)

vim /etc/rc.local
ip link add dev wg0 type wireguard
wg setconf wg0 /etc/wireguard/wg0.conf
systemctl restart network

注意 CentOS7 默认此文件没有执行权限,你需要赋予执行权限

chmod +x /etc/rc.local

做完操作后你可以使用开机启动项的三条命令直接启用 WireGuard 进程

第二种方案则是需要在 Interface 里写入以下信息(注意替换 eth0 为你的互联网出口网卡,并且如果使用 wg-quick 则不需要本例 PostUp 和 PostDown 两个 iptables 命令)

Address = 172.16.11.0/24
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

注意这样启动后网卡本身是没有防火墙区域的,你需要手动绑定一个区域

firewall-cmd --zone=work --add-interface=wg0 --permanent
firewall-cmd --reload

然后设置 systemd 自动启动即可

systemctl enable NetworkManager-wait-online.service
sed -i 's/--timeout=30/--timeout=10/g' /usr/lib/systemd/system/NetworkManager-wait-online.service && systemctl daemon-reload
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0

5、WireGuard 配置说明

[Interface]
ListenPort = 8002  #本机监听 WireGuard 端口
PrivateKey = 填写本机的 privatekey 内容  #本机加密私钥
DNS = 1.1.1.1  #强制本机使用 DNS 服务器
MTU = 1300  #强制本机使用指定 MTU 值
#Table = 100 #强制本机将注入系统的路由的 table 指定为 100 ( 系统默认为 255 和 254 )
#PostUp = ip rule add from 10.10.1.0/24 table 100 ; ip rule add from 10.10.2.0/24 table 100
#PreDown = ip rule delete from 10.10.1.0/24 table 100 ; ip rule delete from 10.10.2.0/24 table 100

[Peer]
PublicKey = 填写对端的 publickey 内容  #本机加密的对端公钥(加密后数据仅对端可以解密)
AllowedIPs = 172.16.1.11/32  #本机允许的对端设备的 IP 地址段,其实就是在本机中这个虚拟网卡对端都有哪些设备 IP 地址(多 peer 不可重复)
Endpoint = another.domain.name:8001  #对端 WireGuard 的外部 IP(可以有一侧的 IP 地址是虚假的公网 IP)
PersistentKeepalive = 25   #当会话存在一端 IP 地址为 NAT 地址或虚假公网 IP 地址时,由该方阶段性每 25 秒发送 keepalive 报文保持会话的可用性,防止被设备终止。

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

1、如果你存在多个 [Peer] ,则在下面直接增加一个新的 [Peer] 栏目

2、如果多个 Peer 存在不同的 IP,请不要让 AllowedIPs 存在重叠的 IP 地址段(比如配置多个相同/24 只有一个生效)

3、Endpoint 既支持以域名的方式访问,也支持以 IP 的方式访问。

4、会话链接的建立只要保证两端数据在一台设备上成功协商,即使有一端 IP 地址后期变更过也不会影响 VPN 的稳定性。

5、使用命令 wg 可以看到当前服务的运行情况。

6、如果你是本来打算连服务器的移动端,则在配置中你需要将移动端的 “AllowedIPs =” 补写一条内容 0.0.0.0/0,::0 以允许所有流量

7、前面标注 # 的三条内容,作为 iproute2 的使用方式,通过指定路由条目的 table 与 ip rule 联动控制策略流量转发。

8、PreUp,PostUp,PreDown,PostDown 这四个命令参数,是作为 wg-quick 快速设置/删除接口之前/之后由 bash(1)执行的四条命令,常用于配置自定义 DNS 或防火墙规则。 特殊字符串 %i 作为变量替代所控制的 INTERFACE 配置名。 每个命令参数都支持多条命令,参数内的多条命令将按前后顺序依次执行。

6、WireGuard 的快速启动配置文件

vim /etc/wireguard/myserver.conf
[Interface]
Address = 172.16.11.0/24
#PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 8000
PrivateKey = 填写一份 privatekey 内容

[Peer]
PublicKey = 填写一份 publicKey 内容
AllowedIPs = 172.16.11.1/32

此配置完毕后 配置文件名为 myserver ,可以直接输入 wg-quick up myserver 启动进程
(如果启动失败可以先 down 一次再 up 一次)
(如果你是 iptables 则使用两条 iptables 命令,去掉前面的#并记得修改 eth0 为当前系统公网网卡即可)

然后将新设备绑定到指定区域中,并配置好地址转换

firewall-cmd --zone=external --add-interface=myserver --permanent
firewall-cmd --zone=external --add-masquerade --permanent
firewall-cmd --reload

最后一样配置开机启动即可(注意命令加入的位置,在此将标准配置版的 WireGuard 进程予以注释,如果同时使用请删掉 # 字符。)

systemctl enable NetworkManager-wait-online.service
sed -i 's/--timeout=30/--timeout=10/g' /usr/lib/systemd/system/NetworkManager-wait-online.service && systemctl daemon-reload
systemctl enable wg-quick@myserver
systemctl start wg-quick@myserver
最后修改:2024 年 07 月 12 日
如果觉得我的文章对你有用,请随意赞赏