3、OVS基本概念:Bridge(网桥)、Port(端口)、Interface(接口)、流表(Flow Table)基础

好,咱们正式开始动手之前,得先把OVS里的几个核心概念捋清楚。说白了,OVS就是一个软件交换机,它跟硬件交换机最大的区别就是——你说了算。你告诉它怎么转发,它就怎么转发。

我个人习惯,在学一个新东西的时候,先搞懂它的“零件”是什么。OVS的零件不多,就四个:Bridge(网桥)Port(端口)Interface(接口)Flow Table(流表)。搞懂这四个,你就掌握了OVS的命脉。

3.1 Bridge(网桥)—— 虚拟交换机本体

Bridge,你可以把它想象成一个虚拟的二层交换机。它负责把数据包从一个端口转发到另一个端口。在Linux系统里,你创建一个Bridge,就等于在内存里造了一台交换机。

创建命令很简单:

ovs-vsctl add-br br0

这条命令执行完,系统里就多了一个叫 br0 的虚拟交换机。你可以用 ovs-vsctl show 看看它长什么样。

我在项目中遇到过一个问题:有人创建了Bridge之后,发现网络不通。排查了半天,发现是忘了给Bridge配IP地址。嗯,这里要注意——Bridge本身是个二层设备,但如果你想让宿主机跟虚拟机通信,就得给它配个IP。

小提示: 创建Bridge时,系统会自动创建一个同名的Port和Interface。也就是说,你创建了br0,就自动有了一个br0的端口和接口。

3.2 Port(端口)—— 数据进出的门

Port是Bridge上的“门”。数据包要进到Bridge里,或者从Bridge出去,都得经过Port。OVS支持好几种Port类型,我挑几个常用的说说:

  • Normal Port:普通的端口,对应一个物理网卡或者虚拟网卡。
  • Patch Port:一对虚拟的“管道”,用来连接两个Bridge。这个咱们后面会重点讲。
  • Tunnel Port:隧道端口,用来跨物理主机通信,比如VXLAN、GRE。
  • Internal Port:内部端口,宿主机可以通过它跟虚拟机通信。

你想想看,一个Bridge上可以挂很多Port,每个Port都像一个门卫,负责检查进出的数据包。

添加一个Port到Bridge:

ovs-vsctl add-port br0 eth0

这条命令把物理网卡 eth0 挂到了 br0 上。从此,eth0 收到的数据包都会交给 br0 处理。

注意: 把物理网卡加到Bridge后,这个网卡原来的IP地址就失效了。你得把IP配到Bridge上,或者配到Internal Port上。

3.3 Interface(接口)—— 真正的收发者

很多人搞不清Port和Interface的区别。我刚开始学的时候也迷糊过。其实很简单:

  • Port 是逻辑概念,是Bridge上的一个“插槽”。
  • Interface 是物理或虚拟的收发实体,负责真正地发送和接收数据包。

大多数情况下,Port和Interface是一一对应的。但有些场景下,一个Port可以对应多个Interface,比如做bonding(链路聚合)的时候。

查看Port和Interface的关系:

ovs-vsctl list port br0
ovs-vsctl list interface br0

我曾经踩过一个坑:在配置Patch Port时,只创建了Port,忘了检查Interface的状态。结果数据包死活过不去。后来发现是Interface的 admin_statedown。所以,记得用 ovs-ofctl show br0 看看端口状态。

3.4 Flow Table(流表)—— 转发的大脑

这是OVS最核心的部分。传统交换机靠MAC地址表转发,OVS靠流表转发。流表就是一组规则,告诉OVS:什么样的数据包,该怎么处理。

每条流表规则包含三个部分:

组成部分 说明
匹配条件 比如源MAC、目的MAC、源IP、目的IP、端口号等
优先级 数字越大,优先级越高。匹配时从高优先级开始查
动作 匹配后做什么,比如转发到某个端口、丢弃、修改字段等

看一个最简单的流表例子:

ovs-ofctl add-flow br0 "priority=100,dl_dst=00:11:22:33:44:55,actions=output:1"

这条规则的意思是:如果数据包的目的MAC是 00:11:22:33:44:55,就从Port 1发出去。

你可能会问:如果没有匹配的流表规则怎么办?

嗯,默认情况下,OVS会把数据包交给控制器处理。如果没有控制器,数据包就会被丢弃。所以,我建议你在调试时先加一条默认转发规则:

ovs-ofctl add-flow br0 "priority=0,actions=normal"

这条规则优先级最低,匹配所有没被其他规则匹配到的数据包,交给内核协议栈正常处理。说白了,就是让OVS先像个普通交换机一样工作。

核心要点: 流表是OVS的灵魂。你配置的每一条流表规则,都决定了数据包的命运。搞懂了流表,你就搞懂了OVS。

3.5 四个概念的关系

最后,我用一句话总结它们的关系:

Bridge 是一台虚拟交换机,上面有多个 Port,每个Port对应一个 Interface 负责收发数据,而数据怎么转发,由 Flow Table 说了算。

画个图就是:

+-------------------+
|     Bridge br0    |
|  +----+  +----+   |
|  |Port1|  |Port2|  |
|  +----+  +----+   |
|  |Intf1|  |Intf2|  |
|  +----+  +----+   |
|  Flow Table       |
+-------------------+

我记得刚开始带团队时,有个新人问我:“为什么我配了Port,数据还是不通?” 我让他查流表,结果发现流表是空的。这就是典型的只配了端口,没配转发规则。

所以,记住这个顺序:先建Bridge,再加Port,最后配流表。三步走,稳得很。

下一章,咱们就深入聊聊Patch Port,看看它是怎么把两个Bridge连起来的。