我在两台主机之间有一条通过 L2TPv3 传输的隧道。隧道的每一端都从属于一个网桥,其他接口也是如此。远程网桥有一个附加的 DHCP 服务器,而本地网桥有一个 DHCP 客户端。为了测试这一点,我在主机上创建了一对 veth 对。我将其中的一半从属于网桥,并将另一半放入新的网络命名空间中。然后,我在该命名空间中的另一半上启动 DHCP 客户端。像这样:
ip netns add test
ip link add test1 type veth peer test2
ip link set test2 netns test up
ip link set test1 master tunnel_bridge up
ip netns exec test dhclient -d test2
这一切都按预期工作 - 获取并配置了 test2 接口的 DHCP 租约。 tunnel_bridge 接口上已运行的 DHCP 客户端也会获取地址。
现在我正在尝试用 VxLAN 隧道替换 L2TPv3 隧道。 VxLAN 没有理由只应有两个对等点,但在本例中却有。 VxLAN 配置为具有静态泛洪的单播。
现在,桥梁之间的交通状况良好;本地网桥可以通过 DHCP 获取地址并可以 ping 远程网桥。但来自 DHCP 服务器的 DHCP 回复不会从本地网桥传播到从属接口。我尝试过向网桥添加以太网端口、veth 接口和 WiFi AP。在每种情况下,tcpdump 都会显示 DHCP 请求进入本地网桥,穿过隧道到达远程网桥,以及答复穿过隧道并到达本地网桥,但从未到达发出请求的接口。
两个网桥的 STP 均已打开(但我也尝试过将其关闭)。 /sys/class/net/tunnel_bridge/bridge/nf_call_arptables
并且/sys/class/net/tunnel_bridge/bridge/nf_call_iptables
都是0
。所有 iptables 都是空的,其默认策略设置为ACCEPT
。所有 ebtables 都是空的。 brctl showstp
显示所有端口处于转发状态。
据我所知,仅有的工作配置和非工作配置之间的区别是将 L2TPv3 隧道替换为 VxLAN 隧道。这会如何影响流量从网桥传播到其他接口的方式?我还可以检查什么?
编辑这里的部分答案是 VxLAN 正在将到达隧道的数据包回显到原始网桥。因此,我看到原始 DHCP 请求到达网桥并进入隧道,然后重复的帧到达网桥。这会导致网桥更新其关于可以在哪个端口上找到 MAC 地址的想法,这意味着回复将被定向回 VxLAN 隧道,而不是定向到发出请求的端口。设置brctl setageing tunnel_bridge 0
会导致网桥将所有数据包淹没到所有网桥端口,然后它“起作用” - 但这显然并不理想。我没有任何直接证据表明是 VxLAN 隧道在执行此操作,只是当 VxLAN 替换为 L2TPv3 时一切正常。我不确定为什么 VxLAN 隧道要这样做。
答案1
这里的问题实际上是 VxLAN 的问题。有一个自动过程将广播条目添加到 VxLAN 隧道远程端的 fdb(例如bridge fdb append 00:00:00:00:00:00 dst <remote ip> dev vxlan1
);这个过程还错误地添加了当地的作为 VxLAN 端点的 IP 地址。
因此,当从 veth 接口发送 DHCP 请求时,会将 veth 接口的 MAC 地址(DHCP 帧上的源 MAC)的单播 fdb 条目添加到网桥的端口转发表中。然后该帧将被淹没到所有网桥端口。 VxLAN 接口会将帧通过隧道发送到远程,但它会还发送给它自己。当它“接收”到该帧时,它会被复制到网桥上,并且网桥会看到来自该 MAC 地址的帧到达 VxLAN 端口;它会相应地更新其端口转发表,将 VxLAN 端口记录为到达 veth 接口 MAC 地址的方式。
当 DHCP 回复到达时,网桥会查看它,查看 veth 接口的 MAC 地址,查询其端口转发表,查看它最后一次看到来自 VxLAN 端口的 MAC,然后将其发送到 VxLAN 端口。它永远不会到达 veth 端口。
对我来说,这根树枝的意义在于,将桥的老化时间设置为 0“解决”了问题,因为这样桥就会被淹没每一个包到每一个港口。虽然我可能应该发现额外的 fdb 条目。