家庭网络杂谈(一)—— VPN 概述

Posted by Towdium on August 15, 2021

前言

这是我一年以来一直计划的长篇连载,但是一直苦于没有时间把坑填上。家里的组网实际上一年以前就基本定型了。如果开坑再早上半年,除去我目前计划的内容,还有很多有意思的东西可以和大家分享,不过现在已经忘记很多了。但是没有关系,我们可以聊的仍然很多。这个系列我本可以起一些很有话题性的标题,诸如“AIO NAS 组网详解”之流,但是我最终还是选择了这么一个普通的标题。其中原因也很多:首先,这里面覆盖的内容除去 NAS 本体,还包括网络拓扑,VPS,家用 Wifi 等诸多方面,是一个整体的方案,我无法对所有的内容做一个精确的概括;其次,我们将会构建一个相对复杂的拓扑网络,对 NAS 进行一些相当复杂的配置,并不是典型的使用方法,强行蹭热度也可能会误导一些初学者;最后,这虽然和我的本职工作关系密切,但是仍然比我日常的工作要简单一些,蹭这个热度对于跳槽(不是)也不会有什么帮助,没有必要。说到这里你可能也明白了,这个系列我们会讨论一些通用的技术背景,配置方法,另外也夹杂着大量私货,供大家做参考。

电信级协议

由于后文的拓扑关系使用了一些隧道和 VPN 技术,我们这里对于常见的 VPN 技术稍作总结,这样也可以帮助大家理解后续的内容。当然,本节内容需要读者对于二三层网络有一些基础的了解,相关内容还请复习计算机网络。

如果你对于 VPN 这个词汇的理解主要在于科学上网,那我们后面说的东西可能会与你现有的理解存在较大差别,而且其中涉及的内容完全是合法的。VPN 的作用很简单:将两处公网不可互通的网络,通过公网中继流量的方式打通连接。VPN 两端公网不可路由的部分我们就成为私网的两个站点。两个站点的连接方式可以是多样的:

  • 两个站点分属不同的网段,使用公网传递私网流量的同时传递私网路由,也就是传统的三层 VPN(L3VPN)。对于私网设备而言,所有公网承载设备模拟为一台路由器(注意与家用路由器做区分),所有承载设备完全透明。最典型的技术就是 BGP MPLS VPN。
  • 将两个站点模拟在同一个二层广播域中,也就是传统的二层 VPN(L2VPN)。如果承载的是 IP 业务,那么此时两个站点的设备在同一个网段中。当然,更多人用这种技术承载 ISIS 这样的非 IP 协议。对于私网设备而言,所有公网承载设备模拟为一台二层交换机,所有承载设备完全透明。典型的技术包括 VPLS,EVPN。

当然,除去上面这些完整模拟网络的技术,还有一些技术可以模拟一个完整网络的部分功能。这里我们无法避开各式各样的隧道技术,他们在拓扑关系上可以是五花八门的,有一些和传统 VPN 无异,另外一些则是基于虚拟的隧道口进行通信:相比于传统的 VPN 技术,隧道口的存在无非是将 PE 和 CE 设备做了合并。举个例子,传统 L2VPN 的组网是“CE1-PE1-P-PE2-CE2”,其中 CE 是私网设备,PE 是公网边界设备,P 是骨干设备;而二层隧道的组网是“CE1|PE1-P-PE2|CE2”,公网边界设备既是公网成员,又是私网成员,隧道口则用来模拟原来 CE 上连接 PE 的物理口。前者比较常见的是 L2TP 隧道,用于在两台设备中模拟二层连接;后者比较常见的是 GRE 隧道,用于模拟同一网段内的三层通信,换句话说,模拟二层连接,但是只能通 IP 协议。如你所见,只要我们抓住不同技术对应的拓扑关系,隧道技术本来就可以用来实现 VPN 的应用。

vpn

家用级协议

说了这么多,提到的大多数是电信级或企业级的技术。这也就意味着,你得先有一个公网 IP。而这就已经让很多人望而却步了。另外,尽管可以使用软件模拟,这些技术大多需要特殊的硬件来实现远超家用需求的报文吞吐量。这也就意味着,除去对于少数狂热的 homelab 爱好者,这些技术大多是遥不可及的。于是,各种基于四层或五层链路的 VPN 技术也就应运而生了,这也就到了大家熟悉的部分了。

在有了前文的铺垫后,再来分析这些家用的 VPN 技术也就十分直观了。最常见,也是快要被赶尽杀绝的 OpenVPN 之流就是在你的设备上创建一个隧道口,分配公网地址,然后穿过隧道接入远端的公网。这里由于我国国情,我们对于“公网”和“私网”的解释总是存在一些歧义:从 VPN 的典型拓扑来说,是穿越公网接入远端私网;对于需要访问某些网站的人来说,则是穿越私网接入远端公网;从本质上来说,其实是穿越公网接入远端公网。这听起来有些奇怪,为什么要穿越公网再接入公网呢,对于科学上网用户以外的人群,开启 VPN 后本机流入公网的源 IP 实际上是 VPN 服务提供商分配的 IP 地址,而不是电信运营商分配的 IP 地址,这适用于隐藏本机真实 IP,模拟异地 IP 等场景。

另外一些大家用的更多的技术,某 socks 啦,某 ray 啦,这些技术本质上不是 VPN,只是长期以来以讹传讹被称作了 VPN,不过话说回来,形式上倒也有几分相似。首先,除去某 ray 的任意门技术,流量入口根本不存在二层或者三层接口,取而代之的则是 socks,http 等四五层接口。这种接口承载二三层流量需要特殊的软件转换,诸如 Proxifier 等。其次,本机完全没有实现和公网的双向互通。使用这种技术时,远端的出口流量完全使用远端设备的公网 IP 发送。换句话说,用这种技术建立的隧道实际上还充当着 NAT 网关的作用。长期生活在 NAT 中的冲国人无异对于 NAT 的使用有着得天独厚的熟悉感,这也给相关技术带来了无与伦比的优势:只需要一台公网设备就可以给无数设备提供接入。说到这里,之前避开不谈的某 ray 任意门技术的实际拓扑也就十分清晰了:作为一个三层口接入的代理技术,尽管实现上可能并没有在刻意模拟相关的拓扑关系,但是在逻辑拓扑上无疑就是一个自带 NAT 的三层 VPN 网络。

说到这里,尽管有些理解对于大家而言可能是新鲜的,但是我们无非是在讨论一些广为人知的技术。而我要向大家隆重推荐的 Tinc VPN,可能就没那么出名了。这是一个基于四层链路的全功能二三层 VPN 技术。经过配置后,我们可以通过隧道口建立二层 VPN,三层 VPN,或者是类似 GRE 的纯 IP 二层 VPN(比纯二层 VPN 性能更好)。另外,只要一台公网设备,即可实现任意多台公网或者 NAT 设备的全互联连接,这也意味这它可以当作高性能的 NAT 打洞技术来使用。最后,借助四层链路的灵活性,他还提供了一些额外特性:流压缩,流加密,认证等若干功能。我对他的吹捧使得这篇文章看起来很像是 Tinc 的枪文,但是除去略显复杂的配置,这确实可以称得上家庭或者小型公司场景下全场景的最优 VPN 方案了。后面的文章里,我们还会在一个复杂的拓扑关系中介绍 Tinc 的实际应用。不同于大多数人对于 VPN 技术的预期,我们不会将他用作科学上网,而是用它来构造一个多站点的私网。话说回来,如果你对我前面说的内容理解到位,你也可以发现,只要在远端出口上使用 Iptables 进行简单的 NAT 配置,你就可以获得一个具有和任何常见技术不同的流量特征的,可靠高速的科学上网工具。当然,处于众所周知的原因,这一部分我就不展开讲了。

小结

本来打算第一篇就把实际的拓扑关系简要介绍完,不小心刚写完背景知识篇幅就已经超了。不管这次的内容和整个系列的的主题是否完全匹配,如果看到这里的你能从这些冰冷的技术中找到一些趣味,那就再好不过了。不出意外的话,下一篇就可以看到实际的组网了。回见。