3、OVS 基本操作:创建网桥、添加端口、查看状态

好,咱们正式开始动手操作。这一节的内容,说白了就是 OVS 的「三板斧」——建网桥、加端口、看状态。你把这几个命令练熟了,后面所有的流量监控、端口镜像才能玩得转。

我记得刚接触 OVS 那会儿,总觉得它跟 Linux 自带的 bridge 差不多。后来在项目里踩了坑才发现,OVS 的灵活性和功能深度,完全不是一个量级的。嗯,咱们先从最基础的开始。

3.1 创建网桥

创建网桥,用 ovs-vsctl add-br 命令。我个人习惯把网桥名字起得有意义一点,比如 br-mgmtbr-data,别到时候自己都分不清。

# 创建一个名为 br0 的网桥
ovs-vsctl add-br br0

# 查看网桥是否创建成功
ovs-vsctl show

执行完 ovs-vsctl show,你会看到类似这样的输出:

Bridge "br0"
    Port "br0"
        Interface "br0"
            type: internal
    ovs_version: "2.17.0"
小提示:创建网桥时,OVS 会自动生成一个同名的内部端口(internal port)。这个端口你可以理解成网桥的管理接口,给它配个 IP,就能远程管理了。

为什么会自动生成内部端口?其实这是 OVS 的设计哲学——每个网桥都需要一个「自己」的接口,用来处理控制面的流量。我在项目中遇到过有人忘了这茬,结果网桥建好了,却连不上 SSH,排查了半天才发现是没给内部端口配 IP。

3.2 添加端口

网桥建好了,接下来就是往里面加端口。端口可以是物理网口、虚拟网口(veth pair),也可以是 OVS 内部端口。

3.2.1 添加物理端口

把物理网卡 eth1 加到网桥 br0 里:

ovs-vsctl add-port br0 eth1

注意,一旦把物理网卡加到 OVS 网桥,这张网卡就不再属于 Linux 内核协议栈了。你原来配的 IP 地址会失效。我曾经在线上环境犯过这个错——把管理网口加进了网桥,结果机器直接失联了。嗯,后来我学乖了,操作前一定先确认网口用途。

3.2.2 添加内部端口

有时候你需要一个虚拟端口,用来跟其他 namespace 或容器通信。这时候可以创建内部端口:

ovs-vsctl add-port br0 vport1 -- set Interface vport1 type=internal

创建完内部端口,你可以给它配 IP:

ip addr add 192.168.100.1/24 dev vport1
ip link set vport1 up
重点:内部端口本质上是一个虚拟网卡,一头连着 OVS 网桥,另一头暴露在 Linux 系统里。你可以把它当成普通的网卡来用。

3.2.3 添加 patch 端口(网桥间连接)

如果你有多个 OVS 网桥,想让它们之间互通,可以用 patch 端口。这玩意儿就像一根虚拟网线,把两个网桥连起来。

# 在 br0 上创建 patch 端口
ovs-vsctl add-port br0 patch0 -- set Interface patch0 type=patch options:peer=patch1

# 在 br1 上创建对应的 patch 端口
ovs-vsctl add-port br1 patch1 -- set Interface patch1 type=patch options:peer=patch0

说白了,patch0 和 patch1 是一对「好基友」,数据从 patch0 进去,就从 patch1 出来。我在做多租户隔离的项目时,经常用 patch 端口来串联不同的网桥,既灵活又高效。

3.3 查看状态

操作完了,总得看看效果。OVS 提供了好几个查看状态的命令,我挑最常用的几个说说。

3.3.1 ovs-vsctl show

这个命令最直观,能看到网桥、端口、接口的概览:

ovs-vsctl show

输出示例:

Bridge "br0"
    Port "eth1"
        Interface "eth1"
    Port "vport1"
        Interface "vport1"
            type: internal
    Port "br0"
        Interface "br0"
            type: internal
Bridge "br1"
    Port "br1"
        Interface "br1"
            type: internal
    Port "patch1"
        Interface "patch1"
            type: patch
            options: {peer=patch0}

3.3.2 ovs-ofctl show

如果你想看 OpenFlow 层面的端口信息,用这个:

ovs-ofctl show br0

输出示例:

OFPT_FEATURES_REPLY (xid=0x2): dpid:0000000000000001
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 1(eth1): addr:aa:bb:cc:dd:ee:01
     config:     0
     state:      0
     speed: 1000 Mbps now, 1000 Mbps max
 2(vport1): addr:aa:bb:cc:dd:ee:02
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br0): addr:aa:bb:cc:dd:ee:00
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max

注意看端口号——eth1 是 1,vport1 是 2,br0 是 LOCAL。这个端口号在配置流表时非常关键。我刚开始学的时候,老把端口名和端口号搞混,结果流表配了老半天都不生效。

3.3.3 ovs-vsctl list 系列

OVS 把所有的配置信息都存在了数据库里。你可以用 list 命令来查:

# 查看所有网桥
ovs-vsctl list bridge

# 查看所有端口
ovs-vsctl list port

# 查看所有接口
ovs-vsctl list interface

这个命令的输出很详细,包含了每个对象的全部属性。比如查端口时,你会看到 VLAN 标签、QoS 策略、链路状态等等。

注意:ovs-vsctl list 输出的是数据库的原始内容,信息量很大。如果你只想看关键信息,建议用 ovs-vsctl showovs-ofctl show

3.4 常用操作速查表

我把这一节的核心命令整理成了表格,方便你以后查阅:

操作 命令 说明
创建网桥 ovs-vsctl add-br <bridge> 自动生成内部端口
添加物理端口 ovs-vsctl add-port <bridge> <port> 物理网卡会脱离内核协议栈
添加内部端口 ovs-vsctl add-port <bridge> <port> -- set Interface <port> type=internal 创建虚拟网卡
添加 patch 端口 ovs-vsctl add-port <bridge> <port> -- set Interface <port> type=patch options:peer=<peer> 连接两个网桥
查看概览 ovs-vsctl show 网桥、端口、接口树形展示
查看 OpenFlow 端口 ovs-ofctl show <bridge> 显示端口号、状态、速率
查看数据库详情 ovs-vsctl list <table> Bridge/Port/Interface 表

3.5 避坑指南

最后,分享几个我踩过的坑:

  • 网口被占用:如果你想把 eth1 加到网桥,但提示 Device or resource busy,八成是 eth1 已经被其他网桥或 bond 占用了。用 ovs-vsctl list port 查一下。
  • 内部端口没配 IP:创建完网桥后,如果你需要远程管理,记得给内部端口配 IP。不然你只能到物理机器上操作。
  • patch 端口配错对:patch 端口必须成对出现,而且 peer 名字要一一对应。我曾经把 peer 写反了,结果两个网桥之间死活不通。
  • 删除网桥前先确认:ovs-vsctl del-br br0 会删掉整个网桥及其所有端口。如果你把物理网卡加进去了,删网桥会导致那张网卡暂时不可用。我曾经手滑删错了,结果线上业务断了 5 分钟。

好了,这一节的内容就到这里。你把这些命令敲一遍,基本就能掌握 OVS 的日常操作了。下一节咱们聊聊端口镜像,那才是流量监控的重头戏。