4、端口管理:添加端口到网桥、删除端口、查看端口状态、端口类型(Internal, Patch, Tunnel)

端口管理这块,说白了就是网桥的「手脚」怎么接、怎么拆、怎么查。我刚开始玩 OVS 的时候,觉得端口不就是加加减减嘛,后来踩过坑才明白——端口类型选不对,整个网络拓扑都得崩。今天咱们就把这块掰开揉碎了讲。

4.1 添加端口到网桥

添加端口,最常用的命令就是 ovs-vsctl add-port。我个人习惯先确认网桥存在,再加端口,免得报错。

# 添加一个普通端口(物理网卡)
ovs-vsctl add-port br0 eth0

# 添加时指定端口类型
ovs-vsctl add-port br0 myport -- set Interface myport type=internal

# 添加时带 VLAN tag
ovs-vsctl add-port br0 eth0 tag=100

这里有个细节:如果你加的是物理网卡,比如 eth0,那这块网卡就不能再配 IP 了。为什么?因为 OVS 接管了它的数据面。我曾经在线上环境犯过这个错——加完端口发现 SSH 断了,吓得我赶紧跑机房。

小技巧:添加端口后,用 ovs-vsctl list port 看一眼,确认端口确实挂上去了。我每次加完端口都会跑一遍这个命令,心里踏实。

4.2 删除端口

删除端口比添加简单,但要注意——删了就没了,别手滑。

# 删除端口
ovs-vsctl del-port br0 eth0

# 或者直接指定端口名(不指定网桥也行)
ovs-vsctl del-port eth0

嗯,这里有个坑:如果你删的是 Internal 端口,那这个端口对应的虚拟网卡也会消失。我之前有个同事,删端口的时候没注意,把管理用的 Internal 端口给删了,结果整个控制面都连不上了。所以我的建议是——删之前先 ovs-vsctl show 看清楚。

警告:删除端口前,务必确认该端口上没有正在运行的流量。可以用 ovs-ofctl dump-ports br0 查看端口流量统计,如果 rx/tx 字节数还在增长,说明有流量,别急着删。

4.3 查看端口状态

查看端口状态,我一般用三个命令,各有各的用处:

命令 作用 我常用的场景
ovs-vsctl show 查看网桥和端口概览 快速确认拓扑结构
ovs-vsctl list port 查看端口详细配置 查 VLAN tag、trunk 配置
ovs-ofctl dump-ports br0 查看端口实时流量统计 排查丢包、流量异常
# 查看所有端口
ovs-vsctl list port

# 查看某个具体端口
ovs-vsctl list port eth0

# 查看端口流量统计
ovs-ofctl dump-ports br0

你想想看,如果端口状态是 down,那多半是物理链路有问题,或者对端设备没起来。我遇到过最奇葩的一次——端口状态一直 up,但就是不通,查了半天发现是网线松了。嗯,硬件问题有时候比软件还难搞。

4.4 端口类型详解

端口类型这块,是 OVS 的核心概念之一。说白了,不同类型的端口,干的活不一样。我按实际使用频率来介绍:

4.4.1 Internal 端口

Internal 端口,就是 OVS 内部创建的虚拟网卡。它跟物理网卡长得一样,可以配 IP、可以当网关。我最常用的场景就是给网桥配管理 IP:

# 创建 Internal 端口
ovs-vsctl add-port br0 mgmt -- set Interface mgmt type=internal

# 配 IP
ip addr add 192.168.1.10/24 dev mgmt
ip link set mgmt up

我记得有一次做 OpenStack 集成,控制节点和计算节点之间通信全靠 Internal 端口。当时有个 bug,Internal 端口老是丢包,查到最后发现是 MTU 不匹配。所以我的建议是——Internal 端口的 MTU 一定要跟物理链路保持一致。

核心要点:Internal 端口本质上是虚拟网卡,可以配 IP、可以路由。但它不直接处理物理帧,所有流量都走 OVS 的数据面。

4.4.2 Patch 端口

Patch 端口,说白了就是一根「虚拟网线」,用来连接两个网桥。我经常用它来做多网桥之间的流量转发:

# 创建一对 Patch 端口
ovs-vsctl add-port br0 patch0 -- set Interface patch0 type=patch options:peer=patch1
ovs-vsctl add-port br1 patch1 -- set Interface patch1 type=patch options:peer=patch0

这里要注意:Patch 端口必须成对出现,而且 peer 名字要写对。我曾经手抖写错了 peer 名,结果两个网桥之间死活不通,查了半天才发现是名字拼错了。你想想看,这种低级错误多冤啊。

避坑指南:Patch 端口不支持 VLAN 转换。如果你需要跨网桥传递带 VLAN tag 的流量,得用 vlan_mode 或者流表来处理。我一般用流表做,更灵活。

4.4.3 Tunnel 端口

Tunnel 端口,就是用来做 overlay 网络的。VXLAN、GRE、Geneve 这些隧道协议,都得靠它。我部署 SDN 的时候,Tunnel 端口是标配:

# 创建 VXLAN 隧道端口
ovs-vsctl add-port br0 vxlan0 -- set Interface vxlan0 type=vxlan options:remote_ip=192.168.100.2 options:key=100

# 创建 GRE 隧道端口
ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.100.3 options:key=200

嗯,这里有个关键点:Tunnel 端口的 remote_ip 一定要能通。我遇到过最头疼的问题——隧道建起来了,但流量就是过不去,最后发现是底层网络 MTU 太小,VXLAN 包被分片了。所以我的习惯是,建隧道之前先 ping 一下对端,确认 MTU 没问题。

重要提醒:Tunnel 端口会额外增加 50 字节左右的头部开销(VXLAN 是 50 字节,GRE 是 24 字节)。如果你的物理网络 MTU 是 1500,那隧道内的 MTU 就得设成 1450 或更小,否则会丢包。

4.5 实战经验总结

说了这么多,我总结几条实战经验:

  • 加端口前先确认网桥存在——别问我为什么,问就是吃过亏。
  • 删端口前看流量统计——流量还在跑就别手贱。
  • Internal 端口当管理口用——别把它当普通数据口,性能有限。
  • Patch 端口成对创建——少一个都不行,peer 名别写错。
  • Tunnel 端口注意 MTU——这是最容易出问题的地方,没有之一。

端口管理这块,说白了就是细心活。你只要记住每个端口类型是干什么的,加加减减的时候多看一眼,基本不会出大问题。好了,下一章咱们聊聊流表——那才是 OVS 真正牛逼的地方。