NetBird 上的两个 LAN:哪些对等节点负责路由,谁可以通信
注册并不会为 LAN 建立路由。为每个站点选一个路由节点,保留地址伪装,收紧策略,然后让每个 LAN 网关学会下一跳。
西侧 LAN 的一台工作站打开浏览器,输入东侧 LAN 上某个应用的地址,然后等到超时。NetBird 的每个界面都说对等节点已连接,这是事实,却不是要点:处在同一个叠加网络中,并不等于让两个本地子网处在同一个网络里。下面的路径从这台工作站出发,以一次被设计有意拒绝的请求结束,每一站都是从设备上读出来的,而不是猜的。预期缺少的是一条路由或一条策略,而不是叠加网络。
先从工作站读故障
打开管理控制台之前,先确认工作站实际发出的是什么。数据包是发往站点网关、本地接口还是无处可去,由它自己的路由表决定,而这个决定不需要任何叠加网络工具就能看到。没有通往远端前缀的路由的机器,无论对等节点列表看起来多健康,都会失败。叠加网络的地址段和站点自己的前缀是不同的地址空间,而注册只配置了其中一个。
接着把域名解析和可达性分开,因为浏览器把两者都报成同一次超时。先从运行 NetBird 客户端的机器按地址重试,再从没有运行客户端的普通工作站重试。如果已注册的机器成功而普通机器失败,缺口就在本地路由;如果两者都失败,先继续读,再改路由。
每个站点选一个路由节点
路由节点是在叠加网络上代表其 LAN 的主机,所以要选一台到子网可达性稳定的 Linux 机器,而不是某人的桌面工作站。按正常流程注册它,放进以角色命名的组,因为网络资源和策略都会引用这个组。每个站点一个代表仍然清晰;一群志愿者宣布同一个前缀,会把之后的每个问题都变成调试会话。节点在本地网段上的地址和它在叠加网络上的身份同样重要,因为这个地址会成为告诉每台普通设备的下一跳。
在动控制台之前先把计划写下来,因为名字和前缀正是这类设计走偏的地方:每个站点的前缀、网关、节点地址和组。西侧是 10.52.0.0/24,由 10.52.0.5 服务;东侧是 10.63.0.0/24,由 10.63.0.5 服务;两个组是 west-routers 和 east-routers,任何前缀都不得与另一个前缀、叠加网段或其他被路由的目标重叠。
创建资源,保留地址伪装
在已部署的仪表板里,为每个站点创建一个网络资源,并把该站点的路由节点组挂上去。资源是前缀,组是为其应答的主机,两者都必须先存在,才能宣告任何东西。确认已部署的自托管版本确实有“网络”工作流,因为名字相近的路由对象的旧界面是另一项功能。
让地址伪装保持开启。NetBird 的站点到站点指南要求在这种安排下开启;为了保留每个原始地址而关闭它,并不是少一跳的同一设计;它会改变叠加网络的源检查和策略所看到的东西。后果值得直说:接收服务记录下来的来源是路由节点,而不是单台工作站。如果该服务的允许列表或审计期望工作站地址,要么改变期望,要么在转换之前于站点边界强制身份。
授权给发起方,而不是给前缀
路由让地址可达,策略决定谁可以使用它;两者是拥有不同所有者的不同对象。策略要从工作负载倒着写:哪个组发起、目标哪个资源、需要哪个 TCP 服务。把两个前缀都宣告给每个已注册对等节点的网络,只是制造了可达性,什么也没有定下来。
然后读一读还有什么是已经允许的,因为一条狭窄的新规则不会撤销位于其上方的宽泛旧规则。当东侧也必须发起向西的连接时,把那个方向写成独立的策略;西侧打开的会话的返回流量,与允许新的东向会话是两个问题。如果只有部分西侧工作站应当访问东侧应用,就在转换之前在站点边界上挑选它们,并保留应用自身的认证。路由节点以整个站点身份承载 LAN 流量,而不是以每用户叠加身份承载,所以按用户计费必须来自别处。
让每个网关学会下一跳,然后测试一次拒绝
普通设备永远看不到叠加网络,所以它们自己的网关需要一条静态路由,把远端前缀指向路由节点的 LAN 地址。这一步常被跳过,因为 NetBird 内部可见的一切都已经正常,而普通工作站仍在超时。网关保留原来的默认路由;这个前缀是追加,而不是替换。
两条路由描述属于每个站点自己的网关配置,而不是主机上的覆盖项。两条都是普通的静态路由,也都不碰默认路由:
west gateway: 10.63.0.0/24 via 10.52.0.5
east gateway: 10.52.0.0/24 via 10.63.0.5用项目真正需要的应用,从普通工作站测试,并记录三件事:发送侧选择的下一跳、命中的策略、服务记录的源地址。也要测试一次拒绝,因为从未拒绝过任何东西的设计有着未知的边界,而拒绝是唯一能证明起作用的是策略而不是路由的证据。当东侧也需要发起时,不要假定第二个方向会自己成立,而要从那一侧发起新连接。还要规划路由节点的重启、升级和更换,因为一台主机已经成了站点的依赖。
| Test | A pass looks like | A failure points at |
|---|---|---|
| Ordinary workstation opens the east application | Next hop on west is the routing peer | Missing static route on the west gateway |
| A source outside policy is refused | No session in the service log | Policy too broad, or a route bypasses it |
| East starts a connection, if required | A fresh reverse session succeeds | No policy for the reverse direction |
私有名称需要自己的解析器设计,因为可达性不会创建 DNS 记录,而姓名坏掉却仍能工作的 IP 路径,读起来和坏掉的路径一模一样。如果路由节点运行在云网络里,也要检查提供商的转发和防火墙规则,因为注册不会覆盖它们。把测试观察和计划放在一起,因为下一个调试这件事的人想要的是命中的策略和记录下来的源地址,而不是拓扑描述。