引入
我买的个人服务器越来越多,它们来源自不同的商家,分布在世界各地,对于同一家买的服务器,有的或许内网可以传输数据,但是很多廉价 VPS 没有内网互通的功能,更不要说跨云了,都不是一家的 VPS 很难提供直接相连的内网环境,这样就导致了这些服务器之间相对独立。
起初并不觉得有什么问题,但是随着知识、经验的增长,终究还是遇到了需要跨云通信的需求。最简单的例子是服务器监控,把每个服务器的运行信息汇总在一起。
现在我选择使用 Netmaker 来解决上述问题。
跨云
基本上每台服务器都有一个公网 ipv4 地址,服务器间的互访肯定不是问题。实际上跨云局域网的目的并不是实现通信,而是保护通信数据。
一个数据(可也是文件、通信数据、请求、everything)从 A 传输到 B 必然会有安全问题,最常见的解决方法就是 SSL 了。也有 ssh 这种依靠自身解决安全问题的方法。
然而,如果想为每一个服务都配置 SSL 那么会显得非常麻烦,有的东西它可能根本就不支持 SSL ,或者说配置起来比较麻烦。例如数据库、容器、IoT 设备等。同时你还需要在公网暴露更多的端口,然后再用 iptables 保护这些端口。这样下去迟早有一天人会坏掉
也就是说我需要一种加密、安全、低成本、稳定、对服务器开销小的通用的通信方式。
VPN
Full Mesh 的重要性
虚拟专用网络,从诞生起就是解决这个问题,因此很容易让人联想到它。VPN 产品有很多,但是挑选时我发现我需要的不仅仅是一个普通的 VPN
- 多台服务器数据传输需求,数据传输量大, VPN 服务器的带宽和网络是个问题
- 尽量避免单点故障,不能说某天 VPN 服务器 down 了,内网就断了
也就是说我需要 P2P 的这种连接方式,任意两个服务器之间的通信不应该经过其它服务,也就是文章标题中的 Full Mesh
很多 VPN 就被 pass 了,有些 VPN 可以通过优化来避免这个问题,然而配置过于麻烦(说的就是你 OpenVPN)。于是我把目光投向新一代 VPN。
有趣的 VPN
很快,我发现了一些有趣的东西:Nebula、Tinc、TailScale、ZeroTier、WireGuard。
它们其实大部分都能满足需求,有些是半开源的,有些是完全开源的。不过我最终还是选了 WireGuard,无它,快、简单,代码能被加入 Linux 内核,生态还行,有各种拓展产品。(实际上它还有很多需要完善的地方,例如密钥更新)以及我已经使用了一段时间的 WireGuard,体验还不错。
Netmaker
直接使用 WireGuard 是不行的,我需要一个界面管理,所以我找到了 Netmaker 和 WireGuard Easy。 Netmaker 更贴近我的使用场景。实际上它不止是一个 web 管理面板,重要的是除此之外 Netmaker 还支持 NAT 下的打洞、流量中继等。可以说是对 WireGuard 的升级。
唯一问题是这个东西还在测试阶段。不过截至目前,它已经经过了两年的开发,基本功能已经稳定,如果想尝尝鲜,选它是没问题,就是后续可能经常需要升级。
注意:Netmaker 欠缺自动密钥更新的功能,需要结合其它运维工具,例如 ansible 来使用。
一些概念
- Netmaker 分为一个服务端和很多客户端,控制节点与客户端之间使用 gRPC 通信
- WireGuard 的角度来看,每个节点都是对等的
- 一个 Netmaker 服务端可以创建、管理多个虚拟网络
- 客户端通过 key 加入网络,该 key 是 base64 后的 json
部署
控制节点官方提供了一个脚本,使用方法:
wget https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/nm-quick.sh
chmod -x ./nm-quick.sh
sudo ./nm-quick.sh
其它节点的加入同样简单:
curl -sL 'https://apt.netmaker.org/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/netclient.asc
curl -sL 'https://apt.netmaker.org/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/netclient.list
sudo apt update
sudo apt install netclient
netclient join -t <token>
详细内容请参考官方文档。本文不做解释。
总结
这个东西的前景非常好,尤其是在企业之中。
- 对于物联网来说,它可以构建一个充电站内网,将该地区的所有充电站连接起来,也可以是路灯和电线杆网络
- 同样的,在云计算上连接多个地区的服务器,和容器,实现容器间的通信等