刷度娘的时代早就翻篇了,刷小冰、谷歌,越往后简中页面就越没法看了,满屏Mesh全是“路由器”,楞是能套上mesh network的帽子,一直没想明白家庭内网或者soho内网Mesh的意义何在,面对面传小纸条?本文简要介绍网状网组网工具,并对Netbird的基本使用进行概括性梳理,与家宽、soho的“Mesh”无关。
1.网状网(Mesh Network)组网工具
1.1 全互联网状网(Full Mesh Network)
搬运一张示意图,左侧是全互联网络,存在于科学家、技术专家和用户的理想之中。右侧是部分互联网络,真实世界中的某个小角落的网络结构。
无论是总线型、星型、树型、环型还是全互联结构,都只停留在教科书或实验室中,现实中都是混合型。全互联网络需要创建、维护N*(N-1)/2条连接和对应的路由,组网工具则需要面对路由创建与维护、NAT穿越、子网访问以及终端用户针对私有名称解析与管理、移动终端适配等的个性化需求。路由创建与维护才是核心功能,打洞、转发都不是,移动适配更不是。
对抱有“既然基于wireguard、那为什么不直接用wireguard”想法的,可能是把自己的一两台电脑、一两部手机当成互联网的全部了。如上所述,动态路由规划、创建与维护、密钥分发与交换、子网访问、私有名称解析等等都不是wireguard本身所具备的功能,仅仅在两点之间建立一条安全隧道,干嘛?!如果是像Nebula一样原始设计就是以连接成千上万个设备为目标,只使用原生wg,Slack就需要大家手动进行密钥分发与交换了。一个完全采用Wireguard的Mesh网络,100个节点,你添加第101个节点试试?单纯的Wireguard在用户平面仅仅只是个高级玩具,生产环境需要的要素它都给不了。
1.2 基于Wireguard的网状网组网工具
在抓包只能依靠tcpdump的时代,可以借助tinc等古老的vpn组网工具手动实现或者满世界找破解版的商用软件。Linux及开源社区兴起后才涌现了很多能用、好用的工具。简中互联网这方面的介绍很少,也可以说没有。Slack采用的nebula(愿景是连接散布在全世界的成千上万台机器而非人、设计开发灵感源自tinc)、刚获得投资的Netbird、主打“Under the hood”(底层)并且坚持使用Rust开发的Innernet等鲜有人知。
同样搬运一个Github的「小项目」(https://github.com/HarvsG/WireGuardMeshes),对“所有”基于wireguard的网状网组网工具进行了汇总,信息还是比较全面、完整的,可自行查阅。
项目表格中的不少应用并不完全是严格的全互联组网工具,无需深究。除了基于wireguard的,其他的Mesh组网工具也不少,典型的譬如Nebula、Zerotier、Twingate等,而Cloudflare Access完全不是Mesh网络组网工具,但居然被不少文章列入Mesh Network工具,Cloudflare Access和WARP傻傻分不清也就罢了,毕竟有历史的沿革。
目前,完全/完整开源、免费的Nebula、Innernet和Netbird在国内都不流行,很可能不会流行,原因在于Nebula和Innernet现在没有、可能以后也不会有“新手”、“小白”需要的零配置安装部署和官方原生GUI管理界面。满足这些需求,不像能学会,倒可能学废了。
2.Netbird的基础使用
2.1 节点配置查询与自定义
Netbird使用了内核态的Wireguard,所以我们无法在安装了Netbird的节点中找到标准的wg配置文件,需要安装wireguard-tools,使用wg完成配置查询与自定义工作。
#add-apt-repository ppa:wireguard/wireguard #apt update apt install wireguard-tools
安装wg-tools后,直接使用不带任何参数的wg,就可以查询当前节点的所有配置信息。
此处可以看到所有4个节点全部在线,使用的接口为wt0,使用的时wg默认的51820端口,该场景下,在任何一个节点上,都会显示自身及其他3个节点的配置信息。Wireguard节点是对等的,只是习惯性地在富强场景下,将代理转发节点称为服务器,请求转发节点称为客户端,链式的wireguard中间节点就有两种角色了。
上述配置不以文件形态存在于系统中,/etc/netbird目录下存有netbird的配置文件(/etc/netbird/config.json),除了本节点的私钥和SSH私钥,所有netbird节点的配置文件其他内容都完全相同且和节点配置无关,也许这是个让“折腾党”很抓狂的“槽点”。
相应的,/etc/wireguard目录为空。
cat /etc/netbird/config.json cd /etc/wireguard ls -a
即使是内核态,并不妨碍我们使用wg对peer节点进行配置,但除非是手动创建的接口,保持默认netbird创建的接口不会生效。
root@laoe:~# wg set -h Usage: wg set <interface> [listen-port <port>] [fwmark <mark>] [private-key <file path>] [peer <base64 public key> [remove] [preshared-key <file path>] [endpoint <ip>:<port>] [persistent-keepalive <interval seconds>] [allowed-ips <ip1>/<cidr1>[,<ip2>/<cidr2>]...] ]...
官方netbird程序在包括windows命令行的所有平台上均可用,实际使用up、down、status、--setup-key较为常用,但没有接口与节点配置相关的功能。
root@ip-172-31-24-212:~# netbird -h Usage: netbird [command] Available Commands: completion Generate the autocompletion script for the specified shell down down netbird connections help Help about any command login login to the Netbird Management Service (first run) service manages Netbird service ssh connect to a remote SSH server status status of the Netbird Service up install, login and start Netbird client version prints Netbird version Flags: --admin-url string Admin Panel URL [http|https]://[host]:[port] (default "https://app.netbird.io:443") -c, --config string Netbird config file location (default "/etc/netbird/config.json") --daemon-addr string Daemon service address to serve CLI requests [unix|tcp]://[path|host:port] (default "unix:///var/run/netbird.sock") -h, --help help for netbird -n, --hostname string Sets a custom hostname for the device --log-file string sets Netbird log path. If console is specified the the log will be output to stdout (default "/var/log/netbird/client.log") -l, --log-level string sets Netbird log level (default "info") -m, --management-url string Management Service URL [http|https]://[host]:[port] (default "https://api.wiretrustee.com:443") --preshared-key string Sets Wireguard PreSharedKey property. If set, then only peers that have the same key can communicate. -k, --setup-key string Setup key obtained from the Management Service Dashboard (used to register peer)
2.2 管理面板
Netbird管理面板本身就已经非常精简,导航选项下并无二级菜单,必要的核心功能都有,没有太多花哨。不像有些工具,本身只要解决某一个很有针对性、很具象的问题,却延展出一堆花里胡哨、可有可无的附属功能放在UI中。
如此简洁的管理后台,重点包括三项:组的创建与管理、访问控制、子网路由。NB的基本管理单元是组而非单一节点,虽然NB的组管理功能并不强,但组可以为空或者仅包含一个节点,从管理粒度上来说够用了。NB将组的创建合并“压缩”进了节点编辑中,通过【Peers】->【节点名称】->【Groups】,直接输入计划创建的组的名称回车即可,UI本身也有相应的提示,这是一个很棒的设计。
对组的列表查询及删除,则是在Setting导航卡界面,【Settings】->【Groups】->【Used】或者【Unused】,可以分别查看已使用的组和未使用的组,未使用的组可以在此删除。
第二个重点是访问控制,可以非常直观的了解NB的管理单元是组而非节点。本例中可以看到,无论是源还是目的,都是由用户选择组而非节点。
另一方面,NB的访问控制规则/列表(ACL)是顺序匹配的,默认Default规则允许 ALL<->ALL访问,在不禁用该规则且该规则前置的前提下,所有的其他规则都不会生效。
第三项重点就是子网路由,这应该是类似组网工具最核心的功能。在NB貌似“简陋”的Network Routes配置页面下,Network Range、Routing Peer都很好理解,无非是CIDR和可以理解为子网网关的节点。分发组(Distibution groups)需要选择具体的组,意思是要将子网路由信息分发给哪些组,这只是字面含义,同时,所有接收该分发的组就可以访问定义的子网,自然也需要进行路由规划,这是字面之下必须完成的工作。分发组的调整,不仅意味着哪些组可以获得访问子网的路由,也意味着需要为哪些组规划、创建并维护这些路由。
其他的诸如DNS、Users、Activity、Settings等相关选项内容本文不再赘述,已经足够简洁易用,确实没有文字描述的必要。额外需要说明的是,如果需要使用API管理网络,需要点击右上角账户图标,在该页面下创建Token。
3.结语
我们可以使用一个非网络中的节点、使用其他的Wireguard程序连接Netbirad网络中的某个节点并成功建立隧道,但仅止于此,无论怎么配置路由和转发、iptables规则都不会生效。这是正常的,只要节点连接于Netbird网络中,就不可能不受管理和控制(包括私有化部署)。如果将服务端也断开连接,wt0接口也会消失,再手动创建、配置wireguard隧道及设置转发,已经完全脱开NB网络了,不是本文讨论的范畴。有关Exit node和iOS的支持,官方issue倒是有相应的回应,分别计划于Q3、Q4发布。
老E并不是Wireguard的拥趸,只是单纯体验到Netbird的简洁和轻快,也许等到NB出现动辄“感人”的时候,我会移情别恋。至于说什么组网工具好用,需要结合自身的网络环境和需求来选择,这是每个人的自由,但不懂不能装懂,看完、搞清楚再理性、礼貌提问。视频评论区出格、酸味评论都无视、直接删,老E不理会不懂装懂、缺少教养的。
文章评论