两块开发板需要共享一个以太网段,而它们的实验台位于不同楼栋。隧道已经存在并且已经在承载以太网,因此剩下的工作看起来只有三条命令,其实并非如此。主机如何处理经过网桥的帧、PC 自身地址应当放在哪里、网桥并不制造哪条边界,是三个相互独立的事实,而第二点弄错正是实验室时好时坏、管理访问悄然劣化的常见原因。这三点在拓扑图上都看不出来。

下面的路径假定两台 Linux PC 之间已有经过认证的 TAP 连接、每个实验台一条专用有线端口,以及一个不属于实验的管理接口。顺序很重要:先帧,再地址,最后是边界。

网桥究竟搬运什么

网桥是用软件实现的交换机。它学习哪个 MAC 地址出现在哪个成员端口后面,并在成员之间转发帧,完全不查 IP 路由表。这段描述里没有子网、网关或默认路由,所以启用 IP 转发并不会产生这种接入,所以 ping 可以通而其他流量仍然失败。板子完全不配置默认路由也能到达对端,这让期待二层像三层那样工作的人感到意外。

每台 PC 向网桥贡献一条有线端口,并把 TAP 设备接入同一个网桥,于是来自板子的帧进入本端口、被转发到 TAP 设备、穿过隧道、到达对端的 TAP 设备,再转发到对端的板子。隧道就是一个普通的成员端口,网桥既不知道也不关心它背后有 VPN。正是这种对称性让例子容易推演:每侧各有一条面向实验室的端口和一条隧道端口,两侧都不特殊。

Board A -- bench0 -- br-test -- tap-bench
                                 |  OpenVPN TAP
Board B -- bench0 -- br-test -- tap-bench

两台 PC 上同名的端口只是本地名字,不是共享对象。实验台之间只有一条以太网通路,没有第二根线缆,也没有第二条隧道去闭合环路;同一个 MAC 从两个端口出现时,网桥会欣然绕圈转发。

地址给网桥,而不是给成员端口

PC 在实验网段上的身份属于网桥设备。成员端口保持无编号,因为端口是转发成员,在其上配置地址会造出同一网段的第二个、相互竞争的所有者。大多数手写方案正是错在这里:它们既给 TAP 设备配地址,又给网桥配地址,然后再疑惑对端实际到达的是哪一个。

ip link add br-test type bridge
ip link set bench0 master br-test
ip link set tap-bench master br-test
ip address add 172.30.90.2/24 dev br-test
ip link set bench0 up
ip link set tap-bench up
ip link set br-test up

对端以另一个主机地址使用同样的形态;板子在同网段取地址,需要时把 PC 的网桥地址作为下一跳。计划确定之前请使用文档用地址段,并把该段预留出来,避免与办公室已有路由冲突。执行任何步骤之前,先确认成员端口没有残留地址、没有 DHCP 客户端、也没有加入另一个网桥;同时通过持有隧道配置的一方统一 TAP 设备的地址,以免它事后又恢复地址。

为什么每个实验台一条专用端口

专用有线端口正是让实验不至于变成全办公室变更的东西。管理接口承载 SSH、默认路由和外部 VPN 连接,这些都不应出现在一条以搬运实验室帧为目的的网桥上。

把管理网卡接进来,等于让办公室 LAN 与开发板之间只隔一次转发决策;而在二层乱来的板子恰恰是你不希望出现在那个网段上的设备。Wi-Fi 网卡更糟:在基础结构模式下桥接无线接口的行为并不像桥接以太网,故障也更难看清而非干净利落。

把实验室网段放在任何生产 DHCP 作用域之外。如果板子以后需要动态地址,只保留一个获授权分配器和一个地址池,才是唯一可预测的安排;两个站点各自的普通路由器在同一网段应答,会产生没人解释得清的地址。

网桥并不制造的边界

桥接不是路由,也不是隔离。穿过网桥的帧仍可能到达主机的过滤钩子,取决于已安装的 bridge-netfilter 路径,所以有效策略必须检查而不能假定。因为丢了一个帧就关掉防火墙,是用一个普遍缺陷换掉一个具体缺陷。

网桥与每个管理或上行接口之间的 IP 转发应保持关闭或被明确拒绝,这跟是否加入网桥是两项独立控制。把 PC 的实验地址选作网关的板子正好在检验这一点:如果管理流量能穿过去,你想要的边界从来就不存在。

还有两类问题需要明确决定。地址规划并不会让网桥只支持 IPv4,所以 IPv6 与其他 EtherType 需要各自的规划或过滤。而 ping 成功并不能说明板子的发现广播、组播组或巨型帧能否通过,因为这些是默认行为不同的不同流量类别。

最后,传输与机密性是两笔不同的购买。TAP 承载以太网,OpenVPN 服务在其外围提供保护。VXLAN 覆盖同样承载以太网,本身不提供机密性,所以用其中一个替换另一个会改变安全属性,哪怕拓扑图看起来一模一样。

持久化与验证它的测试

连上之后敲一次的命令不是配置。请通过 PC 现有的网络管理器把网桥、端口成员关系和唯一的宿主地址持久化,并把接入与 TAP 设备的出现绑定,避免重连后留下一条成员已经消失的网桥。

bridge link show
ip -d link show br-test
bridge fdb show br br-test | head

然后在两个方向上测试板子真正需要的东西,重连隧道,并按已批准的恢复方案重启一台 PC。之后确认三件事:管理访问仍然独立可用、没有出现重复的实验地址、没有意外的生产接口加入网桥。这三者的组合,才证明实验仍留在它的实验台之内。

相关文章