可以在 linux (docker, openvswitch) 中的两个网络接口之间建立类似桥接的东西

can make something like bridge between two network interface in linux (docker, openvswitch)

首先,我不擅长网络编程和英语。

我想创建新网桥来替代 docker 默认网桥以限制出口带宽。

我尝试使用 tc 来控制容器的出口带宽。

经过几次尝试,我认为要限制容器的出口带宽,tc 必须运行 在容器中。但在我的环境中,这是不允许的。

所以我考虑使用 openvswitch(ovs)。

但是创建 ovs 网桥作为 docker 默认网桥不工作。

所以我使用选项 --net=none 创建了 docker 容器,并将 ovs veth peer 附加到容器。它有效,但某些功能受到限制,例如在 docker 统计信息中无法看到网络 I/O。

主要问题如下

我想使用 docker 默认网桥 "docker0" 和 ovs 来限制容器的出口带宽。

enter image description here

我的想法是创建 ovs 网桥并定位在 eth0 和 docker0 之间。但是我没有任何知识来判断这个想法是否可以实现。

这个想法有没有可能实现?

如果是,请告诉我我应该学习什么才能工作。

如果tc也可以用于限制容器出口带宽,请教我。

可以在 Linux 中创建任何时髦的桥链:

诀窍是如何将桥梁连接在一起。有两种选择: 1) 在 OVS 中使用所谓的 'patch' link 类型(仅在两个 OVS 网桥之间有效)。 (网上第一篇文章:https://blog.scottlowe.org/2012/11/27/connecting-ovs-bridges-with-patch-ports/

2) 连接任意两个桥的通用方法(甚至是带有 br-tools 的 OVS,或任何其他类似桥的东西):使用 veth。

Veth 是一个虚拟以太网接口:当您创建它时,它会同时创建两个接口(f.e。veth0veth1)。所有进入 veth0 的流量都来自 veth1,所有进入 veth1 的流量都来自 veth0。您可以将 veth0 插入您的 docker0 网桥,并将 veth1 插入您选择的网桥(假设 mybrige)。

执行此操作的命令:

ip link add type veth  # check out ip link list command to see new interfaces
ip link set up dev veth0 # names may be different
ip link set up dev veth1
ovs-vsctl add-br mybridge
ovs-vsctl add-port mybridge veth0
ovs-vsctl add-port mybrige eth0
brctl addif docker0 veth1 # I'm not sure what kind of bridge docker uses, may be it's ovs-vsctl add-port docker0 veth1

额外的事实:veth 是一个合适的 linux eth 接口,它可以 shaped/filtered 如您所愿。