在我办公室的桌上放着一台用树莓派搭建的 k8s 集群。
在家里还有一台用树莓派搭建的 NAS 服务器。
我的需求是能在任何可联网地方都能访问到办公室的 k8s 集群和家里的 NAS 服务器,而且不能改变我现有的网络结构,还有最重要的一点是成本不能太高,否则就得不偿失了。
其实我的需求本质上就是内网穿透,而内网穿透的可选方案有很多(少说都有十十几种),基本上都是通过端口转发和 VPN
的方式,这里只从硬件和软件的角度出发,选择几种最常见的内网穿透方案。
这种方案是最简单的,也是我之前最常用的,只需要有一个公网的独立 IP 地址就可以通过路由器将端口转发出去即可。
用这样的方法前提是公司特别豪或者是在行业内,比如我们公司就是做 IDC 行业的,我之前就有好几个公网的独立 IP,我选择其中一个连接到路由器,然后对外转发我集群中的端口。
SSH
隧道端口转发是通过 SSH
协议的方式建立起来安全隧道。不仅可以可以将本地端口转发到服务器上,还支持远程端口转发到本地。
一般的实现是通过云服务器将本地端口通过 SSH
隧道的方式实现内网穿透,但是每个月云服务器的租赁成本也是一笔不小的开支。
在内网穿透市场上花生壳的知名度是非常高的,围绕着最初花生壳的产品现在已经扩充了很多网络设备和解决方案,花生壳的软件有免费版本,虽然流量很小,但是做测试或者网络流量很小的使用已经足够了。
除了花生壳还有一个蒲公英,蒲公英就是 SD-WAN
的解决方案,这也是这篇文章要着重介绍的方案。
虽然厂商是有免费的,但是为了保证一定的稳定性最好还是选择购买入门级的硬件来实现。
还有一种方式是通过 VPN
的方式,但是这种方式也需要有在公网上的服务器做端口转发(由于特殊原因这种方式不宜多说)。
硬件层面实现的方式可就更多了,不过我们并不是商用,不需要像 IDC
那种动辄几十万上百万的硬件。
我推荐三个硬件产品:花生棒(花生壳)、向日葵、蒲公英。
花生壳是一款动态域名解析软件,花生棒是内嵌花生壳软件,可穿透内网的智能网络设备。由于花生壳太出名了,所以一般情况下并不区分,都统称为花生壳。
巧的是这三个产品都是一个叫贝锐的公司生产的(贝锐打钱![dog]),每种硬件产品都是从不同的用途出发来定位的。
暴露本地计算机的某个端口通过某个
URL
让全世界公开访问。
竞品: ngrok、frp。
其本质上还是通过端口转发的方式实现。但是花生棒将内网的端口暴露给公网,这样就会导致一个很严重的问题,那就是网络安全的问题。而且端口的数量是有限的,但是我 k8s 集群本身就是一个软件实验室,跑的服务何止几百个,所以花生壳对于我来说并不满足需求。
远程分享桌面,远程控制。
竞品: TeamViewer、ToDesk。
这个不用多说,就是远程控制桌面,虽然也可以实现远程访问,但是并不满足我现有的需求。
蒲公英: SD-WAN、异地局域网组网、跨地域 VPN。
竞品: ZeroTier、OpenVPN。
经过这个大的铺垫,终于轮到今天的主角登场了,它就是:蒲公英!
在蒲公英的盒子里最便宜的产品是蒲公英X1,我就是使用蒲公英X1通过 SD-WAN 异地局域网组网的方式实现办公室和家里的网络互通的。
确定好了方案接下来就是具体的实现了,实现的步骤很简单就两步,但是遇到的问题很多、很难。
SD-WAN
异地局域网组网。废话不多说,先放一张我最终实现了 SD-WAN
异地局域网组网的网络拓扑图。
如果这个网络拓扑图看着有点儿懵逼的话先不要着急,接下来我会详细的解释在这个网络中怎么样让其中任意节点都可以互联互通的。
在讲解网络拓扑图之前首先要了解一个重要的概念:旁路由。
旁路由还可以再细分为3个概念:旁路组网、旁路路由、旁路路由器。
简单的来说,旁路组网就是不改变原有的网络结构,只通过新增加一个设备的方式就可以实现重新组网的网络技术。在本案例中,蒲公英X1是个旁路路由器,实现的是旁路路由的功能,通过旁路组网组网的方式实现 SD-WAN
异地局域网组网。
首先,在组网前都需要对网段进行规划。
我的需求是要将办公室和家里的网络打通,所以就需要2个路由器、2个蒲公英盒子(蒲公英盒子本质上也是路由器,只不过它是特殊的路由器:旁路路由器)和4个网段(一共4个网络设备,每个网络设备都需要一个网段)。
具体网段划分如下:
192.168.1.0/24
。192.168.2.0/24
。10.168.1.0/24
。10.168.2.0/24
。详情见上文网络拓扑图。
正常情况下,办公室和家里的网络都是两个没有联系的独立局域网网段。接下来就需要通过蒲公英X1进行旁路组网,让这两个网段之间产生联系。
蒲公英X1的配置很简单,直接插上网线设置即可,和家用路由器设置一样。需要主要的是要将 WAN
口设置为静态路由 xxx.xxx.xxx.2
,LAN
口则为自己网段的网关。
两个盒子配置好之后就可以实现互联互通了,是不是很简单!
蒲公英有 3 个免费节点,所以我在办公室和家各放一个节点,另一个是移动客户端节点。
这样就可以通过蒲公英客户端和所有在蒲公英盒子下的设备访问这个网络了。
在上述网络拓扑图中移动端、PC-02、PC-04 都可以访问网络中任意节点,但是PC-01、PC-03 就只能访问自己所在的网段。如果我想要 PC-01、PC-03 也可以访问网络中任意节点就需要用到路由器的静态路由功能了。
通过蒲公英盒子是可以实现异地局域网组网,但是要实现在异地局域网中的任意两个节点都能互联互通只靠蒲公英盒子是不行的,还需要路由器的静态路由功能来增强网络的可用性。
虽然通过写路由器的静态路由表可以实现,但是市面上几乎所有的家用路由器都是不支持这个功能的(有个别华硕或梅林固件的有支持,不过大多数都是在四五百左右)。
所以,为了进一步压缩成本还需要刷路由器,让路由器支持静态路由功能。
这里直接使用小米路由器4A千兆版进行刷机,这里选择的软路由系统是老毛子(Padavan
),据说要比 OpenWRT
稳定。
具体的路由器刷机过程我已经写了一系列的文章可作为参考:
常见路由器开源系统(固件)简介
小米路由器4A千兆版 OpenWRTInvasion 刷机教程
小米路由器4A千兆版 CH341A 编程器刷机教程
小米路由器4A千兆版救砖和刷回官方固件
小米路由器4A千兆版更换5G芯片和硬件布局后出现的刷机问题
两台配置好的蒲公英盒子和两台刷了第三方固件(Padavan)的路由器,通过配置静态路由的方式就能实现在异地局域网网络中任意两个节点的互联互通。
蒲公英盒子下面的设备(PC-02、PC-04)和蒲公英客户端下面的设备(移动端)之间访问走的是蒲公英账户的虚拟 IP,蒲公英盒子下面的设备(PC-02)访问上层设备(PC-01)走的是 NAT
模式(对于 PC-02 来说 PC-01 是外网),上层路由的设备(PC-01)访问蒲公英盒子下面的设备(PC-02)走的是静态路由模式。
其中最重要的概念是:旁路由。有关旁路由的技术又会牵扯出一系列的文章,这部分内容就先在这里挖个坑,以后慢慢填吧,哈哈!