6W2H方法谈WireGuard

有一段时间了。笔者发现和尝试了一个好东西: Wireguard。

在思考如何表达和分析这个新技术或者软件的时候,觉得可以使用6W2H方法,也许更简单和具有逻辑,效果更好。

关于6W2H

6W2H是一种通用的事务和技术分析方法论,它可以帮助我们架构一个相对完善的认知框架,快速而完整的辅助我们进行概念和技术的学习、信息获取和分析等工作。

6W2H指的是:

  • What: 是什么
  • Why: 为什么
  • Who: 谁
  • When: 何时
  • Where: 何地
  • Weakness: 弱点和不足
  • How: 如何
  • HowMuch: 代价和收益

其实,这个方法论的构成和流程,在结合具体事物的分析过程中,也许没有那么严格。在具体不同的点上可能略有差异,但重要的是通过这个框架,我们可以进行调整来适应不同的场景。

What: WireGuard是什么

WireGuard,从名称的直观翻译来看,可以称为“线路卫士”。它在主页上的slogan这样说:Fast, Modern, Secure VPN Tunnel (图),即它是一个快速、现代、安全的VPN隧道。其产品图标应该是一个小龙的造型,可能代表快速、轻盈和强大吧。在其开发机构(Edge Security)的网站中还进一步提到其作为新一代安全网络隧道技术,其目的就是为了替代IPSec和OpenVPN这两种主流的VPN技术。

QQ截图20230629142639.png

Wireguard(以下简称WG)的主页和技术白皮书是:

www.wireguard.com/

www.wireguard.com/papers/wire…

是的,它是一个VPN软件。但VPN(Virtual Private Network,虚拟私有网络)这个单词,在现代高度发达的互联网网络时代,它的概念和范畴其实已经有了很大的扩展。笔者理解,它主要对标的软件系统,就是传统的基于硬件或者经典VPN协议的那些软硬件系统和实现。

一个更加令人兴奋的消息是,Wireguard已经在技术上证明了其性能、稳定和价值,已经内置到新版本的Linux内核中(2020年3月, Linux 5.6 Kernal),从而作为操作系统的一部分。这可能是一个战略性的演进,可以看到网络和互联网技术在向全面的SDN(Software Defined Network)的方向进行的发展。

Why: 有什么特点和优势

要理解Wireguard的特点和优势,首先需要先理解其设计和实现思路。

传统的VPN软件和硬件系统,一般使用PPTP,L2TP/IPSec等协议。这些技术本身其实没有太大的问题,但对于普通用户而言,这些技术的学习、部署和使用成本比较高(有些可能需要专用硬件),配套的相关软件使用体验和不太好,灵活性和可扩展性也不是很好,在很多情况下的安全性的实现代价也比较高。此外,业界也普遍承认,现有的VPN实现技术架构和代码有点老旧了,其实有点设计过度,导致性能不佳,占用资源过多,不适合在移动设备上的广泛应用。比如笔者以前常用的OpenVPN软件,安装和配置就比较麻烦,它通常使用用户名和密码认证的方式,但大家都使用一个账号,给系统安全带来了很大的隐患。在客户端,也需要安装和配置VPN客户端,使用虚拟拨号的方式来建立连接,很不方便。这就是普通机构使用VPN系统的现实场景。

针对这些情况和问题,WG在很多方面进行了重新的构思,结合了最新的技术发展和模式来进行架构和实现,达到了比较好的效果。在技术上,WG主要引入了下列技术和模式:

  • 连接协议

WG不基于标准的TCP协议,而是使用UDP协议。笔者猜想,这可能是从HTTP3协议的发展中获取的灵感。使用UDP协议,可以规避TCP协议在连接和传输上的一些缺陷和性能问题,从而在理论上提供更好的性能。

  • 密码学组件和技术

WG的核心密码学组件是Curve25519,Chacha20-Poly1305等比较新的密码学组件和技术。具体而言,WG使用热门的对称流加密算法ChaCha20进行加密,同时使用Poly1305进行消息身份验证来保证信息的完整性,这种组合可以在没有加密硬件加速的嵌入式CPU架构上提供比AES-GCM更高的性能;Curve25519用于椭圆曲线Diffie-Hellman(ECDH) 密钥协议;BLAKE2s用于哈希(比SHA-3更快);以及基于Noise框架,可以并提供前向保密性的1.5-RTT握手协议。这个框架还包括了针对密钥假冒、拒绝服务和重放攻击的内置保护,以及一些后量子密码学抗性的特性。

和其前辈相比,WG取消了密码学组件的可选择性,虽然表面上,牺牲了算法协商的灵活性,但实际上其使用的加密算法已在不同的模型和广泛的使用中得到了专业和实际应用场景的充分检验,可以证明其安全性。而且精简的代码减少了可能的安全漏洞和可能的配置或者不当应用。反而提供了更高的安全性。

这样在技术基础选型和具体实现上,相比老旧的VPN技术,WG显然能够更好的适应网络安全形势和要求的发展。

  • 虚拟网络接口

WG可以以服务的方式,在系统中创建虚拟的网络接口,这样对于普通系统和应用的网络应用提供了很好的兼容性,同时提供了最高等级的网络通信的安全性。

而且不同于通常VPN软件工作在用户态,内置在Linux内核的WG可以工作在系统态,可以大幅度提高网络流量处理的性能。

  • 点对点模式和端点认证

WG的部署,不是简单的客户端/服务器模式,而是类似于P2P网络的可配置端点的通讯模式(其称之为Endpoint,端点)。WG还支持动态路由,这样可以极大的提高网络规划和架构的灵活性和可扩展性。

在WireGuard协议中,每个端点都通过短公钥向其他端点进行标识,其方式类似于OpenSSH中基于密钥的身份验证的工作方式。公钥还用于确定将哪些IP地址分配给隧道内的每个对等点,这是WireGuard开发人员称为加密密钥路由的新概念的一部分。而且,这一过程也是隐秘和安全的,因为它不会响应来自它无法识别的对等点的任何数据包,因此网络扫描不会显示WG正在计算机上运行。此外,当没有数据交换时,可以同时充当客户端和服务器的对等点之间的连接会保持沉默。

  • 容器支持

作为云计算时代的产品,WG设计之初就考虑了对云计算技术的支持,可以很好的支持在容器中的部署和应用。这显然时一个与时俱进的决定和选择。

  • 端点可漫游

如果服务端能够相对固定的话,不要求客户端具有固定的地址或者配置。特别适合像移动办公或者手机应用这种现代化的网络应用的场景。

  • 开源开放

WG是一个开源的软件和技术,从而提供了可以验证的安全性、技术实现、可移植性和可扩展性。通过简洁精巧的设计(据称WG的核心代码不超过4000行),配合新型的密码学套件,WG运行时对系统资源的消耗非常低,这使得它适用于各种设备,包括嵌入式系统和移动设备。

  • 简化部署和应用

在WG中,不需要分配和管理用户。而是对于每个端点,都使用公钥进行管理。WG软件提供了相关的工具可以方便的创建、配置和管理相关的密钥。正确的配置完成后,WG软件可以作为服务启动和连接,并且自动维持其连接状态,对于普通用户是完全透明的(想象成一个网卡),管理和配置多个WG网络,也是没有问题的。

WG可在多个操作系统上运行,包括Linux、Windows、macOS、Android和iOS等,实现了异构系统的互操作性, 也能够大大简化技术支持和运维的工作。

理解了上述设计、实现和使用的思路,我们就可以很容易理解WG在其其slogan和icon中宣称的那样:

快速、现代、安全

Who: 谁创建了WG?

按照其官方网站的说法。其主要开发者是Jason A. Donenfeld(注册商标持有人,下图)。

kr-donenfeld.jpg

WG的相关主要开发机构是Edge Security。它这样介绍自己:

Edge Security is an information security research and consulting firm of expert hackers. With fifteen years of experience and industry-wide recognition, we are extremely capable.

Edge Security是一家提供信息技术安全研究和咨询的专业黑客公司,具有15年的行业认知和经验,能力非常强。

When: WG如何和怎样进入Linix

WG的主要作者Donenfeld自2018年以来一直致力于将WireGuard整合到主要的Linux内核中。开始时进展缓慢,因为合并它需要对Linux内核的加密API和网络堆栈进行重大更改,但是很快它就得到了Linus Torvalds本人的积极支持,他如是高度评价WG:

“我看到Jason实际上发出了请求,将WireGuard包含在内核中,” Torvalds在2018年的Linux内核邮件列表上说道。”我再次表达我对它的喜爱,并希望它能尽快合并。也许代码还不完美,但我已经浏览过了,与OpenVPN和IPSec等可怕的东西相比,它是一项艺术品。”

Donenfeld原本计划将一个新的、更简单的加密API合并到Linux内核中,称之为Zinc。据他介绍,与使用内核现有的加密API相比,Zinc可以让开发人员更轻松地在应用程序中执行加密操作,而相比而言,内核现有的加密API对于大多数用例来说都过于复杂。被他描述为“超级疯狂的企业API,非常容易出现故障,而且极其难以使用。”(有点老旧VPN的味道了)。

但是,他合并Zinc的尝试得到了其他内核开发人员的不同反应,他们对功能重复和必要性提出了各种担忧,而不是解决现有API的问题。关于Zinc补丁提交的邮件列表讨论于2019年4月停止,但另一位内核开发人员后来承担了将大部分 Zinc功能集成到现有API中的任务,并于11月将更改合并到内核中。

Donenfeld接受了妥协方案,并对结果基本满意。“它不再被称为Zinc了,而且我喜欢的一些设计决策也不在那里,但我认为我们所追求的大部分内容都在那里,而且其他一些部分应该可以立即加入到其中。是时候了”。他当时如此表述。
Zinc加密API的集成标志着将WireGuard加入到Linux网络子系统过程中的重要一步。从那时起,事情进展得相对较快,并在稳定版本发布前的几个月内进行了多次审查、错误修复和更改。

终于,在2020年3月29日发布的Linux Kernel5.6版中,WG正式作为其正式的一个组件,它的版本也正式的升级成为1.0.0。

Where: 何处可以使用

理论上而言,WG在企业和机构中的应用可以有几种部署模式。大致如下:

  • 总部-分支-个体模式

以总部网络为核心。总部网络提供互联网公网IP地址和足够的带宽,并作为服务端点。分支机构可以作为总体子网络接入VPN网络;移动办公或者家庭办公,作为个体接入总部网络。

这种模式之下,需要很好的规划和配置相关的子网络路由关系,来保证相关的网络访问需求得到满足。笔者现在使用的WG网络就是这个模式(图)。

WG VPN网络.jpg

简单说明一下:

笔者所在公司,通过企业宽带接入了互联网。运营商分配了一个性能尚可的固定IP地址,我们也申请了域名进行了配置和关联,所以可以通过域名来访问公司网络。公司内部局域网通过NAT对外部进行访问。我们安装了一台虚拟机系统作为WG接入的服务器,在其上安装了WG软件并作为服务端配置,WG端点端口通过NAT的端口映射,发布到互联网。这里需要使用iptables配置NAT转发规则,来支持外部VPN接入的系统访问公司内部的网络和系统(业务服务器、开放桌面等等)。笔者已经成功的在手机和家里的PC上,安装并配置了WG端点,顺利的通过发布域名+端口的方式找到了WG接入服务端点,并建立了连接。并通过正确的NAT和子网配置,使用手机和家用电脑,可以以在公司网络中相同的方式,访问相关的业务系统和开发用的桌面系统,包括内部开发测试环境和应用,远程桌面,文件服务等等。

现在公司没有远程分支的场景,这一部分暂时还没有条件测试,笔者猜想其难点在于分支机构的端点服务器的配置,因为也需要做NAT配置,这样相关规则和路由配置是比较麻烦的,很可能还需要在非WG电脑上,做一些特别的网络配置(如设置特别的路由等等)。

  • 汇聚点-分支-个体接入模式
    对于小型的分布式企业,有多个分支机构或办公室,同时有移动办公的,可以使用这种模式。需要一个具有公网地址的主机作为汇聚点,通常可以使用一个公用云系统。在这里主要充当WG路由器来使用,所以主机的配置可以不用很高,网络配置按需求和内部网络拓扑而定。

汇聚点作为WG服务端,其他作为客户端都接入这个WG网络,然后通过WG路由进行联网和通讯。

  • 点对点模式

在两个公网节点,或者一个公网节点和普通节点之间建立VPN连接。适合个人或者专门的应用场景使用。

  • 业务安全应用网络

这是一个完全开放的体系,可以用于对安全性比较高的业务应用类型的系统。业务应用模式,可以是Intranet的BS架构,也可以是使用基于TCP协议的专用协议的CS架构系统或者数据交互系统。WG为这种场景提供了非常灵活简便的部署和管理。

具体部署方式和总部-分支模式类似,中央服务系统部署在总部网络,总部提供接入端点。各个客户端系统,通过预配置的密钥接入系统,这样就构造一个专有的内部业务网络了。

Weakness 弱点、缺陷或者不足

前面讲的都是WG的优势和功能,下面是一些,现在WireGuard不能做或者尚未实现的功能:

  • 类似 gossip 协议实现网络自愈。
  • 通过信令服务器突破双重 NAT。
  • 通过中央服务器自动分配和撤销密钥。
  • 发送原始的二层以太网帧。

How: 如何实现和使用

简单的原理和流程说明

这里先简单的明确一下WG工作的一些原理和特点。首先当然就是WG不是经典的客户端/服务器的工作模式,而是更接近于点对点的工作方式,它们都使用一套程序,根据配置信息的不同来实现相应的角色。所以在所有节点上,其安装和配置模式都是一样的。

其次,WG在系统中是以服务的形式运行的。WG程序启动后,会在系统中创建一个虚拟的网络接口,然后通过这个网络接口进一步配置来完成VPN联网。

第三,WG是通过公私钥来完成节点的识别和配置,以及后续通信加密的保证的。所以密钥是WG系统管理的一个核心和重要内容。

最后,WG VPN连接建立的基本流程是,服务端(通常有公网固定的IP和端口)节点WG程序启动,侦听配置好的端口,准备接收连接;然后客户端节点WG程序可以启动,使用节点的公钥和配置好的端点地址试图连接服务端;服务端从配置信息中检查公钥,验证通过后建立连接和加密机制;完成后客户端和服务端就可以通讯了。通讯过程中还可以使用配置好的路由信息,转发和传递不同网段的数据报,从而实现VPN的路由,从而可以将通讯从VPN子网扩展到现有已经存在的网络中。

规划和准备

作为一个最佳实践,在部署WG网络前,应当进行一个相对完整和合理的规划。起码要明确相对而言,这些节点之间的关系,那些是服务器,那些是客户端,在那些系统上安装,IP网段如何规划和设置等等问题,最后可以出一个简单的网络拓扑来指导整个系统的部署和配置。

其他的准备,主要就是外部网络和支撑环境,如包括考虑如何使用公网的IP地址和端口,打开相关的安全防火墙,进行网络端口映射等工作。

WG的安装和配置非常简单。在Linux、Windows和Android系统上,都有相应的支持。我们分别说明。

Linux系统安装

Linux系统是WG的默认和主要平台,我们也建议使用Linux作为主要的VPN接入和服务节点。在Linux系统上安装和配置WG的流程如下:

  • WG软件安装

在Linux系统上可以直接使用软件包管理工具进行安装(以debian为例)。

apt install wireguard

安装完成之后,主要提供wg(用于显示状态、生成密钥…)和wg-quick(用于启动和管理wg服务程序)两个命令和工具来实现后续的操作和配置。

  • 打开路由允许

如果VPN使用的网络段,和系统原始网络段不同,又需要进行通信的话,则在系统上配置允许网络包的转发(路由)。
这个可以通过编辑 /ewtc/sysctl.conf 来实现:

net.ipv4.ip_forward=1

也可以通过执行一个配置命令完成(可以不重启系统):

sudo sysctl -w net.ipv4.ip_forward=1

  • 密钥对生成

前面已经提到,WG没有明确的服务器和客户端的概念,每个节点都可以作为服务器和客户端,在进一步配置之前,都需要为当前节点生成节点的密钥对。可以使用如下指令:

wg genkey | tee privatekey | wg pubkey > publickey

这个命令可以同时生成节点私钥和公钥。它其实只是生成私钥,然后使用另一个命令,可以从私钥中计算出公钥。这样我们就有了节点的密钥对。WG不使用证书的格式,如果查看这两个密钥文件,发现它们就是简单的base64编码的密钥信息,可以直接使用在配置文件或者命令参数当中。

无论是服务端,还是客户端节点,在密钥生成后,都需要将公钥交给对方来配置(在本方需要私钥)。如果是集中管理和配置,管理员可以考虑先生成大量密钥对,然后使用密钥或者配置信息分发的方式给客户端节点来进行配置,节省工作组织和构成成本。(在管理员这里有经手私钥的安全风险)

  • 客户端配置文件和信息

默认情况下,wg启动时,需要读取并且应用配置文件中的信息。Linux系统中,配置文件在 /etc/wireguard文件夹中,文件名为: 接口名称.conf,如wg0.conf,系统在WG启动时,需要指定启动的接口名称,就会读取对应配置信息中的内容,并创建一个同名的虚拟网络接口。

由于在客户端和服务端,其配置的方式和内容有一定的通用性,我们先讨论客户端配置。

下面是一个客户端节点接口配置文件的样例(/etc/wireguard/wg0.conf):

## 客户端配置
[Interface]
PrivateKey = gI6EdUSYvn8ugXOt8QQD6Yc+JyiZxIhp3GInSWRfWGE=
ListenPort = 21841
[Peer]
PublicKey = HIgo9xNzJMWLKASShiTqIybxZ0U3wGLiUeJ1PKf8ykw=
Endpoint = 192.95.5.69:51820
AllowedIPs = 0.0.0.0/0
## 客户端配置 
[Interface]
PrivateKey = gI6EdUSYvn8ugXOt8QQD6Yc+JyiZxIhp3GInSWRfWGE=
ListenPort = 21841



[Peer]
PublicKey = HIgo9xNzJMWLKASShiTqIybxZ0U3wGLiUeJ1PKf8ykw=
Endpoint = 192.95.5.69:51820
AllowedIPs = 0.0.0.0/0
## 客户端配置 [Interface] PrivateKey = gI6EdUSYvn8ugXOt8QQD6Yc+JyiZxIhp3GInSWRfWGE= ListenPort = 21841 [Peer] PublicKey = HIgo9xNzJMWLKASShiTqIybxZ0U3wGLiUeJ1PKf8ykw= Endpoint = 192.95.5.69:51820 AllowedIPs = 0.0.0.0/0

这里可以看出来WG配置文件的标准格式。 首先可以定义两个大的区段: Interface是网络接口(本节点)的定义;Peer是连接目标信息。

在客户端配置的网络接口区段,配置信息包括了本节点的私钥(在前面已经生成),和本地节点要监听的端口。这里不需要定义公钥(这个信息是在对端配置的,而且在节点内可以由私钥计算得来),也不需要定义IP地址,因为可能其在连接成功后才进行分配。

对端信息区段中,定义了对端的公钥,对端的IP地址和端口,这里可以使用DNS名称。和允许访问哪个对端所在的网段,一般没有特别要求的话,可以配置为所有网段。

  • 服务端配置文件和信息

在相对静态的VPN网络中,服务端配置信息可以如下(同样是 /etc/wireguard/wg0.conf):

// 服务端配置 wg0.conf
[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
PostUp = /etc/wireguard/wg_add_nat.sh
PostDown = /etc/wireguard/wg_remove_nat.sh
[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 10.192.122.3/32, 10.192.124.1/24
[Peer]
PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
AllowedIPs = 10.192.122.4/32, 192.168.0.0/16
[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
AllowedIPs = 10.10.10.230/32
// 服务端配置 wg0.conf
[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
PostUp   = /etc/wireguard/wg_add_nat.sh
PostDown = /etc/wireguard/wg_remove_nat.sh



[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 10.192.122.3/32, 10.192.124.1/24



[Peer]
PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
AllowedIPs = 10.192.122.4/32, 192.168.0.0/16




[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
AllowedIPs = 10.10.10.230/32
// 服务端配置 wg0.conf [Interface] PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk= ListenPort = 51820 PostUp = /etc/wireguard/wg_add_nat.sh PostDown = /etc/wireguard/wg_remove_nat.sh [Peer] PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg= AllowedIPs = 10.192.122.3/32, 10.192.124.1/24 [Peer] PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0= AllowedIPs = 10.192.122.4/32, 192.168.0.0/16 [Peer] PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA= AllowedIPs = 10.10.10.230/32

在接口配置区段,服务端配置本节点的私钥和侦听端口。

在对端配置区段中,可以依次配置接入的客户端节点信息,包括公钥,给对端分配的IP地址,和可以访问的网段等等。

注意,和客户端配置不同的是,这里还在接口区段定义了两个脚本(位于/etc/wireguard中),分别对应在服务启动和关闭后,可以执行的操作或者脚本,这里是用于开启和关闭相关iptables的规则和NAT设置。具体内容如下:

#!/bin/bash
IPT="/sbin/iptables" # iptables excute binary
IN_FACE="ens18" # NIC connected to the internet
WG_FACE="wg0" # WG NIC
SUB_NET="10.8.0.0/24" # WG IPv4 sub/net aka CIDR
WG_PORT="51194" # WG udp port
SUB_NET_6="fd42:42:42:42::/112" # WG IPv6 sub/net not use
## IPv4 ##
$IPT -t nat -I POSTROUTING 1 -s $SUB_NET -o $IN_FACE -j MASQUERADE
$IPT -I INPUT 1 -i $WG_FACE -j ACCEPT
$IPT -I FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT
$IPT -I FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT
$IPT -I INPUT 1 -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT
#!/bin/bash

IPT="/sbin/iptables"             # iptables excute binary
 

IN_FACE="ens18"                  # NIC connected to the internet
WG_FACE="wg0"                    # WG NIC 

SUB_NET="10.8.0.0/24"            # WG IPv4 sub/net aka CIDR

WG_PORT="51194"                  # WG udp port

SUB_NET_6="fd42:42:42:42::/112"  # WG IPv6 sub/net not use
 

## IPv4 ##

$IPT -t nat -I POSTROUTING 1 -s $SUB_NET -o $IN_FACE -j MASQUERADE
$IPT -I INPUT 1 -i $WG_FACE -j ACCEPT
$IPT -I FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT
$IPT -I FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT
$IPT -I INPUT 1 -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT
#!/bin/bash IPT="/sbin/iptables" # iptables excute binary   IN_FACE="ens18" # NIC connected to the internet WG_FACE="wg0" # WG NIC SUB_NET="10.8.0.0/24" # WG IPv4 sub/net aka CIDR WG_PORT="51194" # WG udp port SUB_NET_6="fd42:42:42:42::/112" # WG IPv6 sub/net not use   ## IPv4 ## $IPT -t nat -I POSTROUTING 1 -s $SUB_NET -o $IN_FACE -j MASQUERADE $IPT -I INPUT 1 -i $WG_FACE -j ACCEPT $IPT -I FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT $IPT -I FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT $IPT -I INPUT 1 -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT

这里配置的含义是(这里原始接口为ens18,WG虚拟接口是wg0):

  • 在前路由链中,插入一个nat类型的规则, 来源是当前节点的子网络,目标是原始接口
  • 在输入链中,加入接受来自WG虚拟接口的流量规则
  • 在转发链中,加入接受原始接口到WG虚拟接口的流量规则
  • 在转发链中,加入接受WG虚拟接口到原始接口的流量规则
  • 在输入链中,加入原始接口,接受UDP协议,并且来自特定端口的流量规则

移除规则

#!/bin/bash
IPT="/sbin/iptables"
IN_FACE="ens18" # NIC connected to the internet
WG_FACE="wg0" # WG NIC
SUB_NET="10.8.0.0/24" # WG IPv4 sub/net aka CIDR
WG_PORT="51194" # WG udp port
SUB_NET_6="fd42:42:42:42::/112" # WG IPv6 sub/net
## IPv4 ##
$IPT -t nat -D POSTROUTING 1 -s $SUB_NET -o $IN_FACE -j MASQUERADE
$IPT -D INPUT 1 -i $WG_FACE -j ACCEPT
$IPT -D FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT
$IPT -D FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT
$IPT -D INPUT 1 -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT
#!/bin/bash

IPT="/sbin/iptables"
 

IN_FACE="ens18"                   # NIC connected to the internet
WG_FACE="wg0"                    # WG NIC 

SUB_NET="10.8.0.0/24"            # WG IPv4 sub/net aka CIDR

WG_PORT="51194"                  # WG udp port

SUB_NET_6="fd42:42:42:42::/112"  # WG IPv6 sub/net
 

## IPv4 ##

$IPT -t nat -D POSTROUTING 1 -s $SUB_NET -o $IN_FACE -j MASQUERADE
$IPT -D INPUT 1 -i $WG_FACE -j ACCEPT
$IPT -D FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT
$IPT -D FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT
$IPT -D INPUT 1 -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT
#!/bin/bash IPT="/sbin/iptables"   IN_FACE="ens18" # NIC connected to the internet WG_FACE="wg0" # WG NIC SUB_NET="10.8.0.0/24" # WG IPv4 sub/net aka CIDR WG_PORT="51194" # WG udp port SUB_NET_6="fd42:42:42:42::/112" # WG IPv6 sub/net   ## IPv4 ## $IPT -t nat -D POSTROUTING 1 -s $SUB_NET -o $IN_FACE -j MASQUERADE $IPT -D INPUT 1 -i $WG_FACE -j ACCEPT $IPT -D FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT $IPT -D FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT $IPT -D INPUT 1 -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT
  • 服务端启动

基本配置完成后,就可以使用wg-quick来启动服务了。

sudo wg-quick up wg0

这里wg0为可自定义的虚拟接口的名称,启动时系统会查询对应的配置信息,并创建以此为名的虚拟接口。

启动完成后,可以使用wg命令查看启动和连接的状态,如果一切正常,将会显示以下一些信息:

root@db11-network:~# wg
interface: wg0
public key: r2UcZ/GBbdF9NVRmuvw/i+mIDVjIamfVxurqJ42ZiQo=
private key: (hidden)
listening port: 51820
peer: imAg4vRPYpSG703kT+1ypjLRXAFXOdmEUcBkWE9fsUI=
endpoint: 18.221.16.120:25571
allowed ips: 172.16.99.52/32
latest handshake: 3 seconds ago
transfer: 33.29 GiB received, 588.18 GiB sent
peer: R+E7LbDPYiGfEi0Op9kSFsQUvDUnc3XcM9U+HqM06n4=
allowed ips: 172.16.99.81/32
...
root@db11-network:~# wg
  interface: wg0
  public key: r2UcZ/GBbdF9NVRmuvw/i+mIDVjIamfVxurqJ42ZiQo=
  private key: (hidden)
  listening port: 51820

peer: imAg4vRPYpSG703kT+1ypjLRXAFXOdmEUcBkWE9fsUI=
  endpoint: 18.221.16.120:25571
  allowed ips: 172.16.99.52/32
  latest handshake: 3 seconds ago
  transfer: 33.29 GiB received, 588.18 GiB sent




peer: R+E7LbDPYiGfEi0Op9kSFsQUvDUnc3XcM9U+HqM06n4=
  allowed ips: 172.16.99.81/32




...    
root@db11-network:~# wg interface: wg0 public key: r2UcZ/GBbdF9NVRmuvw/i+mIDVjIamfVxurqJ42ZiQo= private key: (hidden) listening port: 51820 peer: imAg4vRPYpSG703kT+1ypjLRXAFXOdmEUcBkWE9fsUI= endpoint: 18.221.16.120:25571 allowed ips: 172.16.99.52/32 latest handshake: 3 seconds ago transfer: 33.29 GiB received, 588.18 GiB sent peer: R+E7LbDPYiGfEi0Op9kSFsQUvDUnc3XcM9U+HqM06n4= allowed ips: 172.16.99.81/32 ...

这里面会显示,本节点接口信息,使用的虚拟网络端口,公钥,侦听端口等;还包括已配置和已经连接的对端信息,包括公网IP、端口、VPN ip、网段,如果连接活跃,还会显示握手时间、传输流量等信息。

  • 服务端加载节点脚本

除了使用配置文件和信息之外,其实WG是可以动态配置的。也就是说,在WG运行的时候,是可以使用命令来动态的增加、配置和删除节点的。 这样,我们其实可以不在默认配置文件中配置,而使用一个脚本程序来管理WG服务和节点。

#!/bin/bash
## start wg service
wg-quick up wg0
## add some wg pear
wg set wg0 peer 10xpZrx964OArOoLWhufksskNt4AbLLUch66gwA9nSw= allowed-ips 172.16.99.51/32
wg set wg0 peer R+E7LbDPYiGfEi0Op9kSFsQUvDUnc3XcM9U+HqM06n4= allowed-ips 172.16.99.81/32
wg set wg0 peer imAg4vRPYpSG703kT+1ypjLRXAFXOdmEUcBkWE9fsUI= allowed-ips 172.16.99.52/32
wg set wg0 peer OEQwqE/lJcjn4xchaf0CyRUJRRdly8VrRftmD5IKXEA= allowed-ips 172.16.99.55/32
wg set wg0 peer R5hMTTV0GUr++m8LOe4Qp+249j0JYoBYPD05wNdyABY= allowed-ips 172.16.99.56/32
## show wg status
wg
#!/bin/bash

## start wg service
wg-quick up wg0


## add some wg pear 
wg set wg0 peer 10xpZrx964OArOoLWhufksskNt4AbLLUch66gwA9nSw= allowed-ips 172.16.99.51/32
wg set wg0 peer R+E7LbDPYiGfEi0Op9kSFsQUvDUnc3XcM9U+HqM06n4= allowed-ips 172.16.99.81/32


wg set wg0 peer imAg4vRPYpSG703kT+1ypjLRXAFXOdmEUcBkWE9fsUI= allowed-ips 172.16.99.52/32
wg set wg0 peer OEQwqE/lJcjn4xchaf0CyRUJRRdly8VrRftmD5IKXEA= allowed-ips 172.16.99.55/32
wg set wg0 peer R5hMTTV0GUr++m8LOe4Qp+249j0JYoBYPD05wNdyABY= allowed-ips 172.16.99.56/32



## show wg status
wg
#!/bin/bash ## start wg service wg-quick up wg0 ## add some wg pear wg set wg0 peer 10xpZrx964OArOoLWhufksskNt4AbLLUch66gwA9nSw= allowed-ips 172.16.99.51/32 wg set wg0 peer R+E7LbDPYiGfEi0Op9kSFsQUvDUnc3XcM9U+HqM06n4= allowed-ips 172.16.99.81/32 wg set wg0 peer imAg4vRPYpSG703kT+1ypjLRXAFXOdmEUcBkWE9fsUI= allowed-ips 172.16.99.52/32 wg set wg0 peer OEQwqE/lJcjn4xchaf0CyRUJRRdly8VrRftmD5IKXEA= allowed-ips 172.16.99.55/32 wg set wg0 peer R5hMTTV0GUr++m8LOe4Qp+249j0JYoBYPD05wNdyABY= allowed-ips 172.16.99.56/32 ## show wg status wg
  • 客户端启动

客户端启动的方式和服务端类似,也是使用wg-quick命令。稍有不同的是明确配置了对端的连接信息,它将会作为客户端的角色,使用对端IP地址、端口和公钥,尝试与对端建立安全的连接。连接完成后,它还可以获得服务端分配的IP地址和路由,从而可以透明正常的使用网络。

在Windows系统上的安装和配置

我们一般将Windows系统作为VPN的客户端来接入VPN网络。在Windows系统上,需要安装一个独立的软件包,推荐在Wireguard官方网站上下载。安装完成,运行软件的界面如下:

QQ图片20230630135606.png

配置的内容其实和Linux相同。 先创建一个通道,程序会自动计算一个密钥对;然后编辑通道信息,主要就是己方的私钥,连接对端的地址、端口和公钥等等,格式和形式和Linux相同。

所有配置工作完成后,可以点击激活来测试VPN连接能否正常建立和使用。

在Android系统上的配置和使用

作为一个基础性的安全网络软件,除了Linux和Windows这种标准通用操作系统之外,其实WG支持几乎所有主流操作系统和移动操作系统如iOS和Android ,以及部分嵌入式操作系统如OpenWRT等等。这个列表可以在其主页的installation页面中看到(图)。

wa.png

在Android上,可以通过Play Store或者直接下载apk文件的方式来安装(iOS应该只支持App Store)。安装完成启动后,WG的使用是和普通的VPN软件类似的,配置方式、内容和逻辑也和Windows一样,基本上只不过是把Linux配置文件的文本内容GUI化了而已。 相关的配置界面如下:

a2.png

How Much: 成本和收益

Wireguard是开源免费技术,对于用户而言,无需购买任何多余的软件和硬件产品,只有认知、部署、配置、迁移、培训的学习和时间成本。

而从功能来看,可以大幅度降低日常维护VPN网络的工作量,而可以将VPN作为业务系统的一个低成本基础设施。而从简化的配置管理,简化的使用操作和提升的安全机制方面,可以获得很多无形的收益。

基于Wireguard,可以解决很多业务网络的问题,可以用于扩展到基于互联网,但需要专用的网络应用场景。

和传统的解决方案相比,除了更容易配置和使用之外,WG还能够提供更好的安全性和性能。安全性主要来自选择的先进密码学组件,而性能主要来自UDP协议,高效的架构和代码实现,下图有一个简单的对比(来自WG官网),让我们能够初步的了解其性能差异:

QQ图片20230630145350.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYR8QJSw' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片