3. OVS核心概念:网桥、端口、接口、流表与OpenFlow协议简介

好,咱们今天来啃OVS最核心的几个概念。说实话,我刚开始接触OVS时,也被这些名词绕得有点晕——网桥、端口、接口,听起来都差不多嘛。但实际用起来,它们各有各的脾气。我习惯把它们比作一个虚拟的交换机硬件,这样理解起来会直观很多。

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

网桥,说白了就是一台虚拟的交换机。你在宿主机上创建一个OVS网桥,就等于在软件里造了一台支持OpenFlow的硬件交换机。

创建网桥的命令很简单:

ovs-vsctl add-br br0

这条命令执行完,系统里就多了一个叫br0的虚拟交换机。你可以用ovs-vsctl show查看它的状态。我记得第一次看到输出时,感觉跟物理交换机show running-config有点像,但更简洁。

关键点:OVS网桥是独立于Linux内核bridge的。别搞混了。Linux自带的bridge是传统二层交换,而OVS网桥是OpenFlow交换机。我遇到过有人直接用Linux bridge去对接OpenFlow控制器,结果折腾半天连不上——压根不是一回事。

3.2 端口(Port)与接口(Interface)——一对孪生兄弟

这两个概念最容易混淆。我当年也花了点时间才理清。简单来说:

  • 端口(Port):是网桥上的一个逻辑连接点。你可以理解为交换机面板上的一个物理插口。
  • 接口(Interface):是实际承载网络流量的网络设备。比如一个veth pair的一端,或者一个TAP设备。

它们的关系是:一个端口下面挂着一个接口。大多数情况下是一对一,但OVS也支持一个端口绑定多个接口(比如做bonding)。

举个例子,把一块物理网卡eth0加到网桥:

ovs-vsctl add-port br0 eth0

这条命令同时创建了端口eth0和接口eth0。名字一样,但概念不同。你可以用下面命令看到它们的区别:

ovs-ofctl show br0
# 输出中会显示端口号(如 1(eth0))
ovs-vsctl list interface eth0
# 显示接口的详细信息,比如type、options等

嗯,这里要注意:当你把物理网卡加到OVS网桥后,这块网卡就不能再配IP了。IP要配在网桥上,或者配在OVS内部端口上。我曾经犯过这个错——把eth0加到br0后,还在eth0上配IP,结果网络全断了,折腾了半小时才反应过来。

3.3 内部端口(Internal Port)——连接宿主机网络的关键

OVS网桥默认会创建一个同名的内部端口。比如你创建br0,系统会自动生成一个br0接口。这个接口就是宿主机跟虚拟交换机通信的通道。

你可以给br0配IP:

ip addr add 192.168.100.1/24 dev br0
ip link set br0 up

这样宿主机就能通过br0跟虚拟机通信了。我习惯把br0当作管理接口,所有虚拟机都连到br0上,宿主机也通过br0访问虚拟机——这样网络拓扑非常清晰。

小技巧:如果你不想用默认的内部端口,可以手动创建:ovs-vsctl add-port br0 mgmt -- set interface mgmt type=internal。这样管理流量和数据流量可以分开,我个人比较推荐这种方案。

3.4 流表(Flow Table)——OVS的灵魂

流表是OVS最强大的地方。传统交换机靠MAC地址表转发,OVS靠流表。流表里每一条规则都告诉交换机:匹配到什么条件,执行什么动作。

看一个最简单的流表项:

ovs-ofctl add-flow br0 "priority=10, in_port=1, actions=output:2"

这条规则的意思是:从端口1进来的包,从端口2发出去。说白了就是一条静态转发规则。

流表的结构其实不复杂,核心三要素:

  • 匹配条件(Match):源MAC、目的MAC、IP、端口号、VLAN等等,你能想到的二到四层字段都能匹配
  • 优先级(Priority):数值越大越优先。多条规则匹配时,优先级高的生效
  • 动作(Actions):转发、丢弃、修改字段、送控制器等等

我举个例子,你想想看:如果想让来自192.168.1.0/24的流量走端口2,其他流量走端口3,可以这样写:

ovs-ofctl add-flow br0 "priority=100, ip, nw_src=192.168.1.0/24, actions=output:2"
ovs-ofctl add-flow br0 "priority=50, ip, actions=output:3"

优先级高的先匹配。这就是OpenFlow的灵活之处——你可以用软件定义一切转发逻辑。

注意:流表默认是空的。没有匹配到任何流表的包,会被送到控制器(如果配置了控制器),或者直接丢弃。我第一次搭OVS时,配好网桥发现虚拟机之间ping不通,查了半天才发现——流表没配,包全丢了。

3.5 OpenFlow协议简介——控制器的语言

OpenFlow是OVS跟控制器通信的协议。你可以把它理解为一种南向接口协议。控制器通过OpenFlow协议往OVS的流表里下发规则。

OpenFlow协议有几个核心概念:

概念 说明
控制器(Controller) 负责决策的网络大脑,比如OpenDaylight、RYU、ONOS
安全通道(Secure Channel) OVS与控制器之间的加密连接,默认使用TLS
流表(Flow Table) 控制器下发的转发规则集合
组表(Group Table) 用于实现多播、负载均衡等高级转发行为

配置OVS连接控制器:

ovs-vsctl set-controller br0 tcp:192.168.100.10:6633

连上控制器后,OVS就变成了一个瘦交换机——它只负责转发,所有转发决策都由控制器来做。这就是SDN(软件定义网络)的核心思想。

我做过一个项目,用RYU控制器管理几十台OVS交换机。一开始流表下发速度跟不上,后来发现是控制器跟OVS之间的连接没做优化。调了调心跳间隔和缓冲区大小,问题就解决了。嗯,这些细节在实际生产环境中特别重要。

3.6 小结

这几个概念是OVS的基石。网桥是交换机本体,端口是连接点,接口是实际设备,流表是转发逻辑,OpenFlow是控制协议。理解它们的关系,你就能看懂OVS的运作方式了。

下一章我会讲怎么用OVS连接KVM虚拟机,到时候这些概念都会用上。你先把基础打牢,后面实操就顺了。