Wireguard 搭建 VPN 并连接至公网

自从研究生搬到新地方之后,不仅实验室电脑有有线网,宿舍电脑也用上有线网了,不巧的是学校的网络通账号有使用限制,每次只能在一个地方的网口开通网络权限,也就是说宿舍或者实验室始终有一台电脑连不上公网。虽然用的时候开通网络权限也就是点一下的事,但是如果另一台电脑上挂着 PT 之类的程序就会受到影响,反复开关网络通权限也有点烦人。恰好看见学校 Linux 群里有人提出了相同的问题,有同学指出可以通过搭建 VPN 转发流量的方式实现多设备共享一个网络通账号上网,于是笔者便花了一天时间研究 Wireguard 并将其配置好。由于网络并非笔者的专业方向,因此写下本文来记录搭建过程,方便以后回顾重建。

一、Wireguard 简介

Wireguard 是一个用 C 语言编写的开源 VPN 协议,许多文章对 Wireguard 均有详细的介绍,笔者在此不再赘述。对于 Wireguard 的工作概览,可以直接参考其官网上的 Quick Start 示例以及 Conceptual Overview,非常详细直观。

二、需求模型

图 1 是在搭建 VPN 之前的校内网络设备拓扑图,实验室内分别有一台 NAS(DS720+) 和一台服务器(ESLAB)连接至一个路由器,路由器通过在实验室内的网口连接至校内网。在实验室外,宿舍有一台电脑(PC)直接通过宿舍网口连接至校内网。此外,移动设备(Mobile)也可以通过无线网络连接至校内网。实验室的网口如果开通了公网权限那么宿舍 PC 便无法上网,宿舍的 PC 如果开通了网络权限则实验室内的两台设备均无法上网。

Device Topology
图1. 校内网络设备拓扑图

由于宿舍的网络条件较好(千兆网口起飞,实验室才百兆),因此计划在宿舍的 PC 上开通网络通权限,即宿舍 PC 可以直接访问公网。实验室的两台设备通过 VPN 连接至在宿舍的 PC,并通过设置 NAT 转发实现对公网的访问。移动设备在任意可达网络环境下通过 VPN 访问实验室或者宿舍 PC 上的资源。

三、Wireguard 组网设计

图 2 是根据上述需求模型设计出的解决方案,因为实验室的服务器和 NAS 均为 NAT 后面的设备,外部设备无法直接连接他们,故需要他们自己主动发起并保持连接。为了方便组网,宿舍的 PC 作为中继服务器,并设置监听来自其他几个机器的连接。移动设备作为 IP 变化频繁的客户端,也通过中继服务器与其他机器连接。

Wireguard VPN Topology
图2. VPN 网络下的拓扑图

图 2 中,ESLAB、DS720+、以及 Mobile 均被指定只路由自身流量,只暴露一个私网 IP(图中 Address 项)。宿舍 PC 作为中继服务器,路由整个 VPN 网络的流量(Address 掩码为 255.255.255.0),并且在指定端口上监听传入连接(ListenPort)。ESLAB、DS720+、Mobile 作为客户端设备,通过中继服务器互联,因此需要告诉客户端中继服务器的公网 IP 及中继服务器监听的端口([Peer] 下的 Endpoint 项)。此外,由于 ESLAB、DS720+ 位于NAT 后,因此需要额外添加 PersistentKeepalive 项,每 25 秒发送一个心跳包来保持连接。

每个 [Peer] 项下还有一个 AllowedIPs 项,该项指定了允许其他机器在 VPN 中发送过来数据包的源地址范围,同时也会作为本机路由表中 VPN 对应的接口绑定的 IP 地址范围。该项是将实验室机器流量转发至宿舍 PC 的关键之一。为了将实验室机器的流量转发至宿舍 PC 处理,实验室两台机器(ESLAB、DS720+)的 AllowedIPs 被设置为 0.0.0.0/0,表示转发所有流量,包括公网流量和 VPN 流量。(在实际配置中,为了让实验室机器能够直接访问校内网络,USTC 校内 IP 的流量不会走 VPN 接口转发。为了方便编写该项策略,可以使用 IP 地址计算器

对于 Mobile 和 中继服务器 PC, AllowedIPs 配置就很简单了,中继服务器只允许来自每个机器被分配的私网 IP 地址的流量传入。Mobile 只允许私网 IP 地址范围内的流量。

图 2 中基本涵盖了每个机器的 Wireguard 配置。除了图中的配置项外,分别为每台机器下的每个 [Peer] 指定其公钥即为完整的 Wireguard 配置。

四、配置 NAT 转发

使用上述配置在每台机器上配置好 Wireguard 并启动后,笔者发现实验室的机器仍无法访问公网。经检查,Wireguard VPN 通信正常,但是到达宿舍 PC 的流量没有转发。到达宿舍 PC 的流量为私网流量,因此需要在中继服务器设置 NAT 转发。

Linux 下的转发笔者尚未实践,因此就不在这里班门弄斧了。这里主要介绍 Windows 下的 NAT 转发。主要步骤来自于微软文档。注意,进行下述操作前必须在 Windows 功能中开启 Hyper-V 虚拟化

首先,如果已经安装 Wireguard 并启用了配置好的 VPN,使用管理员权限打开 Windows PowerShell,并执行 Get-NetAdapter,可以看到一个 Wireguard Tunnel,接口名称为 Wireguard 配置时的接口名称。找到该项并记住其 ifIndex

get ifIndex
图3. 查看 ifIndex

如图,此处接口名为 wg0,ifIndex 为 90,记下这个值。

接着,设置该接口上的网关,使用如下命令:

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

其中,<NAT Gateway IP> 为网关的 IP,这里即为中继服务器在私网中的 IP。<NAT Subnet Prefix Length> 为子网掩码长度,与 Wireguard 配置时保持一致(这里为24)。<ifIndex> 为接口编号,即为上述记下的值(90)。(注,该步骤非必须,如果执行后提示之前已经绑定 IP 的错误则说明网关已经自动设置,直接进行下一步即可)

最后使用下述命令新建一个 Nat 网络:

New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>

<NATOutsideName> 为该 NAT 网络的名称,取一个自己喜欢的就行。<NAT subnet prefix> 表示子网的前缀,同样与 Wireguard 配置保持一致,这里为 192.168.X.0/24。

配置完后,登陆实验室服务器,等一会儿 DNS 更新之后即可正常上网了。大功告成~。

五、参考资料

《Wireguard 搭建 VPN 并连接至公网》上有1条评论

发表回复

您的电子邮箱地址不会被公开。