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虚拟机,到时候这些概念都会用上。你先把基础打牢,后面实操就顺了。