WireGuard:快速、现代、安全的 VPN 隧道


WireGuard ®是一款极其简单但快速且现代的 VPN,它采用了最先进的加密技术。它旨在比IPsec更快更简单、更精简、更实用,同时避免大量麻烦。它旨在比 OpenVPN 性能更高。WireGuard 被设计为通用 VPN,可在嵌入式接口和超级计算机上运行,​​适用于许多不同情况。它最初是为 Linux 内核发布的,现在已跨平台(Windows、macOS、BSD、iOS、Android)并可广泛部署。它目前正在大力开发中,但它可能已经被视为业内最安全、最易于使用和最简单的 VPN 解决方案。

简单易用

WireGuard 的目标是像 SSH 一样易于配置和部署。只需交换非常简单的公钥(与交换 SSH 密钥完全一样)即可建立 VPN 连接,其余所有操作均由 WireGuard 透明处理。它甚至能够像Mosh一样在 IP 地址之间漫游。无需管理连接、担心状态、管理守护程序或担心底层情况。WireGuard 提供了一个非常基本但功能强大的界面。

密码学健全

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

最小攻击面

WireGuard 的设计充分考虑了易于实施和简单性。它旨在通过极少的代码行轻松实现,并且易于审计安全漏洞。与像 *Swan/IPsec 或 OpenVPN/OpenSSL 这样的庞然大物相比,即使对于大型安全专家团队来说,审计庞大的代码库也是一项艰巨的任务,而 WireGuard 旨在由个人进行全面审查。

高性能

极高速的加密基元与 WireGuard 位于 Linux 内核的事实相结合,意味着安全网络可以非常高速。它既适用于智能手机等小型嵌入式设备,也适用于满载的骨干路由器。

定义明确且经过深思熟虑

WireGuard 是一个漫长而深思熟虑的学术过程的结果,最终形成了技术白皮书,这是一篇学术研究论文,它清楚地定义了协议和每个决策中所考虑的深思熟虑。

概念概述

如果您想了解 WireGuard 的一般概念概述,请继续阅读。然后,您可以继续安装并阅读有关如何使用它的快速入门说明。

如果您对内部工作原理感兴趣,您可能会对协议的简要概述感兴趣,或者通过阅读技术白皮书来深入了解,其中详细介绍了协议、加密和基础知识。如果您打算为新平台实施 WireGuard,请阅读跨平台说明

WireGuard 通过 UDP 安全地封装 IP 数据包。您可以添加一个 WireGuard 接口,使用您的私钥和对方的公钥对其进行配置,然后通过它发送数据包。所有密钥分发和推送配置的问题都不WireGuard 的范围内;这些问题最好留给其他层处理,以免我们最终陷入 IKE 或 OpenVPN 的臃肿。相比之下,它更像 SSH 和 Mosh 的模型;双方都有彼此的公钥,然后他们就可以开始通过接口交换数据包。

简单网络接口

WireGuard 的工作原理是添加一个(或多个)网络接口,如eth0wlan0,称为wg0(或wg1wg2、等)。然后可以使用wg3正常配置此网络接口,使用为其添加和删除路由,等等,所有普通的网络实用程序都可以使用。使用工具配置接口的特定 WireGuard 方面。此接口充当隧道接口。ifconfig(8)ip-address(8)route(8)ip-route(8)wg(8)

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

  1. 此数据包是发往 192.168.30.8 的。那是哪个对等点?让我看看……好的,它是发往对等点的ABCDEFGH。(或者,如果它不是发往任何已配置的对等点,则丢弃该数据包。)
  2. ABCDEFGH使用对等方的公钥加密整个 IP 数据包。
  3. 对等体的远程端点是什么ABCDEFGH?让我看看...好的,端点是主机 216.58.211.110 上的 UDP 端口 53133。
  4. 使用 UDP 将步骤 2 中的加密字节通过 Internet 发送到 216.58.211.110:53133。

当接口接收到数据包时,会发生以下情况:

  1. 我刚刚从主机 98.139.183.24 上的 UDP 端口 7361 收到一个数据包。让我们解密它!
  2. 它为对等体正确解密和验证LMNOPQRS。好的,让我们记住,对等体LMNOPQRS最近的 Internet 端点是 98.139.183.24:7361,使用 UDP。
  3. 解密后,纯文本数据包来自 192.168.43.89。对方是否LMNOPQRS可以以 192.168.43.89 的身份向我们发送数据包?
  4. 如果是,则在接口上接受该数据包。如果不是,则丢弃它。

在幕后,人们利用最先进的加密技术,进行着许多工作以提供适当的隐私性、真实性和完美的前向保密性。

密钥路由

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

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

[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820

[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

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

[Interface]
PrivateKey = gI6EdUSYvn8ugXOt8QQD6Yc+JyiZxIhp3GInSWRfWGE=
ListenPort = 21841

[Peer]
PublicKey = HIgo9xNzJMWLKASShiTqIybxZ0U3wGLiUeJ1PKf8ykw=
Endpoint = 192.95.5.69:51820
AllowedIPs = 0.0.0.0/0

在服务器配置中,每个对等体(客户端)将能够将数据包发送到网络接口,其源 IP 与其相应的允许 IP 列表相匹配。例如,当服务器从对等体收到数据包时gN65BkIK...,在解密和验证后,如果其源 IP 为 10.10.10.230,则允许其进入接口;否则将被丢弃。

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

在客户端配置中,其单个对等端(服务器)将能够使用任何源IP 向网络接口发送数据包(因为 0.0.0.0/0 是通配符)。例如,当从对等端收到数据包时HIgo9xNz...,如果数据包使用任何源 IP 正确解密和验证,则允许其进入接口;否则将被丢弃。

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

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

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

对于任何字段,都可以使用 IPv4 和 IPv6 的任意组合。如有必要,WireGuard 完全有能力将一个封装在另一个内。

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

内置漫游

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

为容器做好准备

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

了解更多

可以考虑浏览命令和快速入门,以便更好地了解 WireGuard 在实践中的使用方法。除了提供最详细信息的技术白皮书外,还有协议、加密和密钥交换的描述。

关于该项目

源代码

WireGuard 分为多个存储库,托管在 ZX2C4 Git 存储库和其他地方。请参阅项目存储库列表

IRC 讨论

如果您在设置或使用 WireGuard 时遇到困难,最好的帮助来源是#wireguardLibera.Chat 上的 IRC 频道。我们还在那里讨论开发任务并规划项目的未来。

邮件列表

加入邮件列表,参与 WireGuard 开发讨论。所有开发活动都在此进行。使用 提交补丁git-send-email,类似于 LKML 的样式。

电子邮件联系

如果您出于某种原因想要私下联系我们,您可以通过[email protected]联系我们。但请记住,“支持”请求更适合我们的 IRC 频道。

安全联系人

请将任何安全问题报告给[email protected],且仅报告给该地址。请勿将与安全无关的问题发送至此电子邮件别名。请勿将与安全相关的问题发送至其他电子邮件地址。

执照

内核组件和 Linux 内核本身均在 GPLv2 下发布。其他项目则根据具体情况在 MIT、BSD、Apache 2.0 或 GPL 下获得许可。