找回密码
 立即注册
搜索
查看: 252|回复: 0

WireGuard®:最先进、跨平台的现代VPN解决方案,超越IPsec和OpenVPN

[复制链接]

2万

主题

0

回帖

6万

积分

管理员

积分
62212
发表于 2024-12-7 19:09:30 | 显示全部楼层 |阅读模式
® 是一款非常简单、快速且现代化的 VPN,采用最先进的加密技术。它的设计比 IPsec 更快、更简单、更精简、更有用,同时避免了巨大的麻烦。它的性能比 .它被设计为在嵌入式接口和超级计算机上运行的通用 VPN,适用于许多不同的情况。它最初是针对 Linux 内核发布的,现在是跨平台的(macOS、BSD、iOS)并且可广泛部署。它目前正在大量开发中,但它已被认为是业内最安全、最易于使用且最简单的 VPN 解决方案。

截至 2020 年 1 月,它已合并到 5.6 版本的 Linux 内核中,这意味着大多数 Linux 发行版的用户都将拥有一个开箱即用的版本。

优点:简单易用

设计为像 SSH 一样易于配置和部署。 VPN 连接是通过交换非常简单的公钥来建立的——就像交换 SSH 密钥一样——其他一切都是透明处理的。它甚至可以在 IP 地址之间漫游,就像 Mosh 一样。无需管理连接、关注状态、管理守护进程或担心幕后发生的事情。提供一个非常基本但功能强大的界面。

密码学上健全

使用最先进的加密技术,例如噪声协议框架、HKDF 和安全可信结构。它做出了保守合理的选择,并经过了密码学家的审查。

最小攻击面

设计时考虑到易于实施和简单性。这意味着只需几行代码即可轻松实现,并且可以轻松审核安全漏洞。与 *Swan/IPsec 或 /etc 等庞然大物相比,即使对于大型安全专家团队来说,审计庞大的代码库也是一项艰巨的任务,这意味着一个人就可以完成全面的审查。

高性能

极高速的加密原语的结合以及它们存在于 Linux 内核中的事实意味着安全网络可以非常高速。它适用于小型嵌入式设备,例如智能手机和满载骨干路由器。

与其他VPN协议的性能测试对比:

与其他VPN协议的性能测试对比

明确定义和深思熟虑

是经过长期、深思熟虑的学术过程的结果,最终形成了一份技术白皮书、一份学术研究论文,其中明确定义了协议以及每个决定的深入考虑。

通过 UDP 安全封装 IP 数据包。您添加一个接口,使用您的私钥和对等方的公钥对其进行配置,然后通过它发送数据包。所有与密钥分发和推送配置有关的问题都不在讨论范围内;这些最好留给其他层,以避免像 IKE 或 .相比之下,它更接近于模仿SSH和Mosh的模型;双方都有对方的公钥,然后他们可以开始交换数据包。

简单的网络接口()

这是通过添加一个(或多个)网络接口(或多个接口)来实现的,例如 eth0 或 wlan0,称为 wg0(或 wg1、wg2、wg3 等)。然后,您可以正常使用(8)或ip-(8)配置网络接口(),使用route(8)或ip-route(8)为网络接口()添加或删除路由,依此类推,使用所有正常的网络实用程序。该接口的特定方面是使用 wg(8) 工具配置的。这个接口就相当于一个接口。

将隧道 IP 地址与公钥和远程端点相关联。当接口向对等方发送数据包时,它会执行以下操作:

该数据包用于 192.168.30.8。那是哪位同辈啊?让我看看...找到了,这是给同行的。 (或者,如果不适合任何已配置的对等方,则丢弃该数据包。)整个 IP 数据包使用对等方的公钥进行加密。对等点的远程端点是什么?让我看看...找到了,端点是主机 216.58.211.110 上的 UDP 端口 53133。使用 UDP,将步骤 2 中的加密字节发送到 216.58.211.110:53133。

当接口收到数据包时会发生这种情况:

我刚刚从主机 98.139.183.24 上的 UDP 端口 7361 收到一个数据包。让我们来解密吧!对等方执行正确的解密和验证。好的,让我们记住对等点的最新互联网端点是 98.139.183.24:7361,使用 UDP。解密后,明文数据包来自192.168.43.89。是否允许对等方以 192.168.43.89 向我们发送数据包?如果是,请接受界面上的消息。如果没有,就放弃吧。

在幕后,采用最先进的加密技术来提供适当的隐私性、真实性和完美的前向保密性。

加密密钥路由

其核心是一个称为 的概念,其工作原理是将公钥与隧道中允许的隧道 IP 地址列表相关联。每个网络接口()都有一个私钥和一个对等列表。每个对等点都有一个公钥。公钥短小且简单,供对等体用来相互验证。它们可以通过任何带外方法传入配置文件,类似于将 SSH 公钥发送给朋友以访问 shell 服务器。

例如,服务器计算机可能具有以下配置:

<p><pre class="cm-s-default">    <span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content">[Interface]
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content">PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content">ListenPort = 51820
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content">[Peer]
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content">PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content">AllowedIPs = 10.192.122.3/32, 10.192.124.1/24
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content">[Peer]
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content">PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content">AllowedIPs = 10.192.122.4/32, 192.168.0.0/16
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">[Peer]
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">AllowedIPs = 10.10.10.230/32
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">INI</span></span></pre></p>


客户端计算机可能具有以下更简单的配置:

<p><pre class="cm-s-default">    <span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">[Interface]
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">PrivateKey = gI6EdUSYvn8ugXOt8QQD6Yc+JyiZxIhp3GInSWRfWGE=
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">ListenPort = 21841
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">[Peer]
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">PublicKey = HIgo9xNzJMWLKASShiTqIybxZ0U3wGLiUeJ1PKf8ykw=
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">Endpoint = 192.95.5.69:51820
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">AllowedIPs = 0.0.0.0/0
</span></span><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content">INI</span></span></pre></p>
在服务器配置中,每个对等点(客户端)将能够将数据包发送到其源 IP 与相应允许的 IP 列表匹配的网络接口 ()。例如,当服务器收到来自peer...的消息时,经过解密和验证,如果其源IP是10.10.10.230,则允许进入该界面;否则将被丢弃。

在服务器配置中,当网络接口()想要将数据包发送到对等方(客户端)时,它会查看数据包的目标 IP,并将其与每个对等方允许的 IP 列表进行比较,以确定将其发送到哪个 IP 地址。发送给哪个对等点。例如,如果要求此网络接口()发送目标 IP 为 10.10.10.230 的数据包,它将使用对等方的公钥对其进行加密,然后将其发送到节点最近的端点。

在客户端配置中,其单个对等点(服务器)将能够将数据包发送到网络接口的任何源 IP(因为 0.0.0.0/0 是通配符)。例如,当从对等方接收到数据包时...如果对任何源 IP 都正确解密并验证了该数据包,则它可以进入该接口;否则它会被丢弃。

在客户端配置中,当网络接口 () 想要将数据包发送到其单个对等方(服务器)时,它将使用任何目标 IP 地址(因为 0.0.0.0/0 是通配符)对该单个对等方的数据包进行加密。例如,如果要求网络接口()发送具有任意目标IP的数据包,它将使用单个对等点的公钥对其进行加密......然后将其发送到距离该对等点最近的端点。

换句话说,当发送数据包时,允许的 IP 列表的行为类似于路由表,而当接收数据包时,允许的 IP 列表的行为类似于访问控制列表。

这就是我们所说的加密密钥路由表(Table):公钥和允许的 IP 的简单关联。

对于任何领域,都可以使用 IPv4 和 IPv6 的任意组合。如果需要的话,完全有可能将一个封装在另一个内部。

因为在接口上发送的所有数据包都经过加密和身份验证,并且因为对等方的身份和对等方允许的 IP 地址之间存在紧密耦合,所以系统管理员不需要复杂的防火墙扩展(例如在 IPsec 的情况下),而是可以只需匹配“是否来自此 IP?在此接口 () 上?”并确保它是安全且真实的数据包。这极大地简化了网络管理和访问控制,并提供了更多保证,确保您的规则实际上正在执行您希望它们执行的操作。

内置漫游()

客户端配置包含其单个对等点(服务器)的初始端点 (),以便它在接收加密数据之前知道将其发送到何处。服务器配置没有任何对等方(客户端)的初始端点 ()。这是因为服务器通过检查数据的来源以进行正确的身份验证来发现其对等点的端点 ()。如果服务器本身更改了自己的端点()并向客户端发送数据,则客户端将发现新的服务器端点()并更新相同的配置。客户端和服务器都将加密数据发送到他们实际解密数据的最新 IP 端点 ()。因此,两端都有完整的IP漫游。

容器准备就绪

使用最初创建接口的网络命名空间发送和接收加密数据包。这意味着您可以在主网络命名空间(可访问的位置)中创建一个接口,然后将其移动到属于容器的网络命名空间作为容器的唯一接口。这确保了容器访问网络的唯一可能方式是通过安全、加密的隧道。

优势总结 术语表 对等/节点/

Peer:对等节点。

连接到 VPN 并使用 VPN 子网地址(例如 10.4.1.3)注册自己的主机。您还可以通过使用逗号分隔的 CIDR 指定子网范围来路由您自己以外的 IP 地址。

中继服务器 ( )

本质上,它仍然是一个对等点,但该对等点可以通过公共网络访问,并且可以将流量中继到 NAT 后面的其他对等节点(例如家庭计算机、NAS)。它不是一个特殊的节点。与其他对等节点相同。唯一的区别是它有一个公共IP并且启用了内核级IP转发,可以将VPN流量转发到其他客户端。

子网()

一组私有 IP,例如 10.4.1.1-255 或 192.168.1.1/24,通常位于 NAT 后面,例如办公室 LAN 或家庭网络。

网络地址转换

子网的私有IP地址由路由器提供。私有子网设备无法通过公网直接访问,需要通过NAT进行网络地址转换。路由器跟踪传出连接并将响应转发到正确的内部 IP。

公共端点( )

节点的公网IP地址:端口,如123.124.125.126:1234,或者直接使用域名some..tld:1234。如果对等节点不在同一子网上,则该节点的公共端点必须使用公共 IP 地址。

私钥

单节点私钥,生成方式为:wg &gt; .key。

公钥

单个节点的公钥使用以下方式生成:wg &lt; .key &gt; .key.pub。

域名系统



域名服务器用于将域名解析为VPN客户端的IP,防止DNS请求泄露到VPN之外。

工作原理 中继服务器工作原理

中继服务器 ( ) 的作用类似于普通对等节点,充当 NAT 后面的 VPN 客户端之间的中继服务器,将任何收到的 VPN 子网流量转发到正确的对等节点。事实上,流量如何转发并不重要。这是由系统内核和规则处理的。

如果所有对等节点均可从公网可达,则无需考虑中继服务器。仅当 NAT 后面有对等节点时才需要考虑它。

在这里,客户端和服务器基本上是平等的,唯一的区别在于谁主动连接谁。双方都会监听一个UDP端口,谁主动连接就是客户端。主动连接的客户端需要指定对端的公网地址和端口,被动连接的服务器不需要指定其他对端节点的地址和端口。如果客户端和服务器都位于NAT后面,则需要添加中继服务器。客户端和服务器都指定中继服务器作为对端节点。它们的通信流量会首先进入中继服务器,然后转发给对端。 。

它支持漫游,也就是说,无论谁的地址发生变化,对方看到对方从新地址通话时都会记住自己的新地址(与mosh相同,但双向)。因此,如果双方一直保持在线,并且通讯足够频繁(比如配置-),就不会因为双方IP地址不固定而受到影响。

如何疏导交通

它可用于构建非常复杂的拓扑。以下是一些典型的拓扑结构:

点对点

这是最简单的拓扑。所有节点要么在同一个局域网内,要么通过公网直接访问,这样就可以直接连接到对端,无需中继跳转。

轮辐式

一端位于NAT后面,另一端通过公网直接暴露

这种情况,最简单的解决办法是:通过公网暴露的一端作为服务器,另一端指定服务器的公网地址和端口,然后通过--选项保持长连接,让NAT记住对应的映射关系。

两端均位于 NAT 后面并通过中继服务器连接

大多数情况下,当通信双方都位于 NAT 之后时,NAT 会进行源端口随机化,直接连接可能会很困难。您可以添加中继服务器。通信双方都会使用中继服务器作为对端,然后保持长连接,流量会通过中继服务器进行转发。

概括

在世界上,没有同侪与同侪之分。所有节点都是对等的。大家常用的方法就是找一个节点作为中转节点,这个节点就是VPN网关,然后所有节点都连接到这个网关,所有节点都通过这个网关进行通信。在该架构中,为了方便理解,我们可以将网关视为 ,将其他节点视为 ,但实际上,它们并不区分。该架构的示例如下所示:

轮辐式

这种架构的缺点非常明显:

全网状

✔️要点:

本次后续实战的重点是实现Full mesh网络。

无论是VPN网络还是K8S网络。

接上文,全互联模型的架构是怎样的?假设有5个节点,每个节点与其他节点建立隧道,架构如下:

全网状

这种架构的直接优势就是速度快!任何 Peer 都直接连接到所有其他 Peer,无需传输流量。那么场景下如何实现全互联模式呢?其实这个问题并不难。困难在于配置的复杂性。不过,已经有很多开源工具可以帮助自动实现Full Mesh的配置。后面我会详细介绍我通过这样的工具实现的Full Mesh网络。

为什么需要全网状网络?

以我为例。我利用双十一的机会购买(提货)了阿里巴巴、腾讯、百度、华为、天翼云的1C2G云服务器,均价80元/年。然后:

一方面,这些服务器可以通过Full mesh形成一个完全互连的内网;另一方面,可以通过K8S网络插件(如:等)组建跨云的K8S集群;本地家庭网络和移动设备、电脑可以与云网络全面互联;更进一步,可以利用家里的NAS、电脑和云服务器节点搭建隧道,然后在本地添加Pod网段和网段,相当于K8S双向连接本地和开发环境的解决方案,可以大大提高开发效率效率。此外,甚至家庭设备也可以作为节点之一添加到云端的 K8S 集群中。 ……

还是很有诱惑力的~

主要原则及实施概要参考资料
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|【智道时空】 ( 京ICP备20013102号-16 )

GMT+8, 2025-5-9 19:34 , Processed in 0.137894 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表