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。
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 处理。
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_state 是 down。所以,记得用 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先像个普通交换机一样工作。
3.5 四个概念的关系
最后,我用一句话总结它们的关系:
Bridge 是一台虚拟交换机,上面有多个 Port,每个Port对应一个 Interface 负责收发数据,而数据怎么转发,由 Flow Table 说了算。
画个图就是:
+-------------------+
| Bridge br0 |
| +----+ +----+ |
| |Port1| |Port2| |
| +----+ +----+ |
| |Intf1| |Intf2| |
| +----+ +----+ |
| Flow Table |
+-------------------+
我记得刚开始带团队时,有个新人问我:“为什么我配了Port,数据还是不通?” 我让他查流表,结果发现流表是空的。这就是典型的只配了端口,没配转发规则。
所以,记住这个顺序:先建Bridge,再加Port,最后配流表。三步走,稳得很。
下一章,咱们就深入聊聊Patch Port,看看它是怎么把两个Bridge连起来的。