3、OVS 基本操作:创建网桥、添加端口、查看状态
好,咱们正式开始动手操作。这一节的内容,说白了就是 OVS 的「三板斧」——建网桥、加端口、看状态。你把这几个命令练熟了,后面所有的流量监控、端口镜像才能玩得转。
我记得刚接触 OVS 那会儿,总觉得它跟 Linux 自带的 bridge 差不多。后来在项目里踩了坑才发现,OVS 的灵活性和功能深度,完全不是一个量级的。嗯,咱们先从最基础的开始。
3.1 创建网桥
创建网桥,用 ovs-vsctl add-br 命令。我个人习惯把网桥名字起得有意义一点,比如 br-mgmt、br-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 的设计哲学——每个网桥都需要一个「自己」的接口,用来处理控制面的流量。我在项目中遇到过有人忘了这茬,结果网桥建好了,却连不上 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
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 show 或 ovs-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 的日常操作了。下一节咱们聊聊端口镜像,那才是流量监控的重头戏。