WireGuard到底好在哪?

WireGuard
做加法,还是做减法,这个问题的关键在于你目之所及的范围。

在VPN领域,WireGuard这个减法很漂亮。若要理解WireGuard的简洁之美,还得从头说起。

VPN是继RealityPN而生的,RPN(Reality Private Network)即实际专用网,也就是专线。专线为了将多个处在不同物理位置的site连接在一起,费用很高。

ISP提供了非常便宜的Internet接入服务,与其通过专线传输私有数据,不如通过Internet传输,为了私有数据在公共Internet上保持私密性,需要将数据加密。

端到端加密对端设备性能提出很高的要求,这在1990年代并不现实,让专用的设备做这件事更合适,专用设备作为网关,部署在可信区域与不可信区域的边界,在IP层提供统一的加密服务,第一代VPN诞生了,比如网关到网关的IPSec,点到网关的L2TP,接入方式不同,存在形式不同。

第一代VPN像一个全家桶一样欲想包罗万象,然而所有配置必须DIY,PKI体系以及SSL/TLS让很多参数都可以自动协商,只需要配置证书即可,并且可以提供端到端的加密功能。浏览器的发展让服务HTTPS的SSL/TLS更加流行。这是1990年代末的事。

除了HTTPS之外,几乎没有被广泛使用的端到端加密应用,但个人接入VPN的场景变得很多,如何进行身份认证是一个重要的问题,使用数字证书是一个很方便且安全的方法。SSL/TLS结合数字证书认证,便出现了OpenVPN。

OpenVPN结合SSL/TLS以及第一代VPN网关的特征,被看作是VPN的revolution,这是第二代VPN。

OpenVPN配置非常简单,它是一个典型C/S模式的VPN,适合点到网关的VPN接入,相比L2TP,OpenVPN的客户端配置通过服务端push下发,这大大简化了客户端的配置。经过合理的组网,OpenVPN也依然适合IPSec般的网关到网关的VPN连接。

OpenVPN针对IPSec/L2TP做了减法。

WireGuard对OpenVPN再次做减法。WireGuard仅仅提供加密隧道。

扫描二维码关注公众号,回复: 13269514 查看本文章

在PKI看来,Pre-shared Key是一个极其不推荐的配置,因为它非常难以进行密钥管理和分发,然而对于VPN,PKI设施的维护也是一件非常麻烦的事情。VPN的本质就是一条加密隧道。通过DH算法协商出一个对称密钥是一个更加简洁的方式。

WireGuard通过交换公钥信息协商出对称密钥,需要做的只是在隧道两端配置一下对端的公钥即可,堪称极简主义典范。

WireGuard将一个wg虚拟网卡(类似IPSec的VTI虚拟网卡)作为一个VPN实例,该实例包括很少的字段:

  • 一个Peer列表。
  • 自己的私钥。
  • 自己的UDP监听端口。

其中,一个Peer代表一个与自己建立VPN隧道的对端,它包括:

  • 对端的公钥。
  • 对端允许的IP Prefix列表。

所有的配置就以上这些。以上简单且对称的结构使WireGuard不再以C/S模式运行,它甚至没有Server和Client的概念,WireGuard节点是完全对等的,这意味着WireGuard适合各种组网拓扑:

  • 点到点拓扑
  • 星形拓扑
  • full-mesh拓扑

事先已配置好Peer的公钥,一对Peer之间可以在1-RTT内完成握手,直接用DH算法协商出对称密钥,这是WireGuard的典型特征。

WireGuard握手期间不保存Peer任何状态,于是对DDoS天然免疫。虽然需要事先部署好Peer公钥,但对于VPN而言,收益是巨大的,相对于IPSec,OpenVPN等复杂的握手协议暴露的攻击面,WireGuard在1-RTT握手中几乎不会暴露任何信息。Silence is a Virtue.

WireGuard使用公钥而不是IP端口五元组来标识Peer,而索引公钥的字段自握手之后始终包含在WireGuard报文的协议头中,这意味着隧道是IP无关的。这是WireGuard另一个典型特征。

假如两部手机之间已经建立了WireGuard隧道,那么任凭两台手机如何移动导致IP地址变化,只要不是同时变化,隧道均不会中断。WireGuard仅支持UDP协议让以上的地址漫游行为更加如丝般柔滑。

WireGuard还有很多亮点,至于代码多么简洁,Linus如何夸赞,这些别人已经介绍了太多,我只说别人没提到的东西。

有一篇有点原教旨主义的文章,The death of the VPN – It’s time to say goodbye:
https://phcorner.net/threads/the-death-of-the-vpn-its-time-to-say-goodbye.699100/
提到了零信任和VPN的关系。

传统的观点,人们将网络划分为了可信区域和不可信区域,而VPN则部署在两个区域的边界,该边界的存在正是VPN存在的前提。然而零信任策略让这个边界不复存在。

万物皆可SD的当下,SDP(软件定义边界)提出可信和不可信要应用本身的逻辑组件来定义,不存在一个固定的区域边界,这也正是零信任策略的核心。零信任取消了可信网络区域,所有的VPN将没有地方部署。

当你觉得零信任是VPN之死的祸首时,事实上零信任策略的提出是非常合理的,是时代的要求。

云计算、大数据的发展,使传统的信息系统边界变得模糊,越来越多的用户从或固定或移动的“外部”接入“内部”越来越多的应用,这会让部署在内外部边界上的VPN不堪重负且成为一个攻击单点,攻击这样一个单点对于黑客而言是一件有收益的事,SDP安全自决的原则有效解决了这些问题。

这意味着是VPN带来了问题,而零信任策略解决了问题。VPN和零信任似乎再也无法共存。

但如果VPN部署在里应用最近的地方呢?只要不要再把VPN看作一个网关,将它看作一个应用的安全组件依然是合理的。WireGuard的极简化设计非常适合将其部署在应用容器和手持终端。WireGuard仅提供安全隧道,即便在零信任策略下,WireGuard依然可以作为一个安全组件继续发挥作用。

谈谈和我相关的。

我比较手贱,看到复杂的东西就想砍掉点东西,看到简单的东西就想添点啥。

当我第一次看到WireGuard的时候,一刻钟工夫就撸顺了它的逻辑,问了自己一个问题,它的算法配置在哪儿?读了几分钟源码,发现竟然使用了固定的算法,没有协商,甚至版本号协商都没有,竟然不支持证书,不能选cipher suit…

我预估自己一个周末应该就能把这些给加进去,到时候又可以自豪地说我实现了通过X.509证书进行身份认证的支持cipher suit协商的WireGuard,显得很牛逼。就像当时看到OpenVPN竟然不支持多线程,然后上去就是一顿改一样。我还曾经把OpenVPN给移植进了Linux内核。

事后反思,如果非要把一个极简的VPN按照之前的经验补充成和之前的VPN一样的样子,这并不是一件正确的事情。如果我手里只有一把锤子,那除了拼命找钉子并没有别的事可做,应该把视线放远些,不做根本不应该存在的东西。如果我把WireGuard和OpenVPN的差异都补齐了,为什么不直接用OpenVPN呢?

在了解WireGuard或者其他任何东西宕的核心特性以及部署场景之前,上来就基于自己曾经的经验或者偏见来优化,这就是在优化根本不存在的东西。

这是老毛病又犯了。

按照传统观念,VPN一定要作为一个盒子网关摆在机房里,后面携带一个受其保护的可信网段。因此,用DPDK重新实现WireGuard就是一个自然而然的想法,然而事实上,WireGuard is yet another VPN.WireGuard不必以网关的形式存在。

需要一个WireGuard网关摆在机房里吗?可能确实需要,在这种情况下,用DPDK,FPGA重构WireGuard再好不过了,然而并不是WireGuard唯一的部署场景,绝大多数情况下,WireGuard并不是作为一个网关存在,网关的概念正在逐步弱化,包括安全在内的各种曾经可以统一处理的逻辑都在向应用程序自决的方向发展。

浙江温州皮鞋湿,下雨进水不会胖。

猜你喜欢

转载自blog.csdn.net/dog250/article/details/119933617