前言

WireGuard是一个免费的网络通信隧道,它可以让您的私有网络和公共网络之间通过一个隧道,让您的私有网络不会被窃听。一般情况下,我们选择使用Linux服务器自带的iptables实现路由转发,实现私有网络和公共网络之间的通信。但是,在Windows上,尤其是个人Windows计算机上,我们缺乏有效的工具实现路由转发,因此我们很难实现私有网络和公共网络之间的通信。搭建出的WireGuard隧道毫无意义。此教程主要讲解如何使用Windows的NAT实现路由转发,并进一步实现私有网络和公共网络之间的通信。

环境搭建

安装WireGuard

由于本文主要涉及到Windows的NAT实现路由转发,所以我们仅介绍Windows下的安装方法。此过程较为简单,可自行可以参考WireGuard安装中的介绍。

生成WireGuard服务器端配置文件

在后文描述中,我们假定计算机A为服务端,计算机B为客户端。我们需要生成服务端的配置文件,以便计算机B能够连接到服务端后访问公共网络。

我们需要生成服务端的公钥和私钥。打开WireGuard软件,使用 Ctrl+N 快捷键创建新的隧道。

将隧道名称设置为 wg0 ,将公钥复制保存到本地。

然后,输入以下配置内容

ListenPort = 55555
Address = 10.254.0.1/24

其中,ListenPort为隧道监听端口,Address为隧道的IP地址和子网掩码。此处选择端口55555进行监听,使用了10.254.0.1/24的IP地址作为内网IP地址。

/24表示子网掩码为24,即255.255.255.0

最终效果如下图所示:

服务端基础配置

生成WireGuard客户端配置文件

在计算机B上,我们需要生成客户端的配置文件。与上述服务端配置文件相同,我们需要生成客户端的公钥和私钥,并保存公钥钥到本地。该隧道命名为 wg1

然后,输入以下配置内容

Address = 10.254.0.2/32

其中,Address为客户端的IP地址和子网掩码。

注意此处设置IP地址需要与服务器端的IP处于同一网段。

客户端基础配置

完善WireGuard服务端配置文件

编辑服务端配置文件 wg1 ,键入以下内容

[Peer]
PublicKey = w1bok71zGcFWSAmWCZIE3+ZijCZbrnpzJwrNm7RXqFg=
AllowedIPs = 10.254.0.2/32

注意替换PublicKey为计算机B的公钥,AllowedIPs为计算机B的IP地址。

AllowIPs为路由的IP地址段,可以设置多个,用逗号分隔。其含义为若服务器接收到此IP地址的数据包,则转发给私有网络。通常是该 Peer 的隧道 IP 地址和通过隧道的路由网络。

完善WireGuard客户端配置文件

编辑客户端配置文件 wg1 ,键入以下内容

[Peer]
PublicKey = QwiiphIK/UBvbV+n8L4/VOmBlLwSqXt2g0PoY0oJBhY=
AllowedIPs = 0.0.0.0/0
Endpoint = 
PersistentKeepalive = 25

注意替换PublicKey为计算机A的公钥,Endpoint为计算机A的IP地址,PersistentKeepalive为保持连接的时间,单位为秒。

AllowedIPs设置为0.0.0.0/0的含义为路由此计算机的所有流量至私有网络。

PersistentKeepalive该参数可不设置,但设置了该参数,则客户端会在每次连接后发送心跳包,保持连接。

测试连接

打开WireGuard客户端,选定wg2为连接的隧道,再点击连接按钮。

如果连接成功,可以看到对端以及上次握手时间。

如下图:

连接测试

设置服务端NAT转发

即使测试连接成功,我们发现客户端仍无法连接入公共网络。原因在于Windows服务端没有流量转发设置。在Liunx上,我们可以通过iptable等设置流量转发,但在Windows 10上我们缺乏响应的工具。经过测试,我们发现,如果我们设置了NAT转发,则客户端可以连接公共网络。

以下主要内容主要来自微软,如果您的英语水平较高,可以自行查阅。

主要分为以下几个步骤:

  1. 管理员 身份打开PowerShell

  2. 首先找到需要设置NAT转发的网络接口,键入以下命令Get-NetAdapter,可以找到所有的网络接口,并记录wg0ifIndex。如下图: get-NetAdapter

  3. 配置NAT网关IP,我们一般使用命令New-NetIPAddress,完整命令如下:

New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>

<NAT Gateway IP>替换为NAT网关IP地址,在上述操作中为10.254.0.1

<NAT Subnet Prefix Length>为NAT网关的子网掩码长度,在上述操作中为24

<ifIndex>wg0ifIndex

  1. 创建NAT网关,使用命令:
New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>

<NATOutsideName>为NAT网关的名称,可随意命名

<NAT subnet prefix>为NAT网关的子网掩码长度,在上述操作中为10.254.0.0/24

完整命令执行图如下:

NAT

测试

使用客户端连接服务端,访问任一外部网络资源,如可成功访问则证明NAT转发成功。

以安卓客户端为例,展示效果: 使用 Wireguard 前,网络 IP 为中国移动,如下图

Before

使用 Wireguard 链接 windows 客户端后,网络 IP 显示为 windows 的联通 IP ,如下图

After