
1. Open vSwitch 简介
Open vSwitch 是一个开源的虚拟交换机,支持标准交换功能(如 VLAN、STP)和高级功能(如 OpenFlow、VXLAN)。它广泛应用于虚拟化环境和 SDN 场景。
2. OVS 作为普通交换机
场景描述
将 OVS 配置为普通交换机,用于连接虚拟机或物理设备,支持 VLAN 和 STP 等传统交换功能。
配置步骤
-
安装 OVS:
sudo apt update sudo apt install openvswitch-switch
-
创建 OVS Bridge:
sudo ovs-vsctl add-br ovs-br0
-
添加物理网卡到 Bridge:
sudo ovs-vsctl add-port ovs-br0 eth0
-
配置 VLAN:
- 将端口
eth0
设置为 Trunk 端口,允许 VLAN 10 和 20:sudo ovs-vsctl set port eth0 trunks=10,20
- 将虚拟机接口
vnet0
加入 VLAN 10:sudo ovs-vsctl add-port ovs-br0 vnet0 tag=10
- 将端口
-
启用 STP:
sudo ovs-vsctl set bridge ovs-br0 stp_enable=true
-
验证配置:
sudo ovs-vsctl show
3. OVS 作为流表交换机(配合 SDN)
场景描述
将 OVS 配置为流表交换机,通过 OpenFlow 协议与 SDN 控制器(如 Ryu)通信,实现动态流量控制。
配置步骤
-
安装 OVS 和 Ryu 控制器:
sudo apt update sudo apt install openvswitch-switch pip install ryu
-
创建 OVS Bridge 并连接控制器:
sudo ovs-vsctl add-br ovs-br0 sudo ovs-vsctl set-controller ovs-br0 tcp:127.0.0.1:6633
-
启动 Ryu 控制器:
- 编写一个简单的 Ryu 应用(
simple_switch.py
):from ryu.base import app_manager from ryu.controller import ofp_event from ryu.controller.handler import MAIN_DISPATCHER from ryu.controller.handler import set_ev_cls from ryu.ofproto import ofproto_v1_3 class SimpleSwitch(app_manager.RyuApp): OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION] def __init__(self, *args, **kwargs): super(SimpleSwitch, self).__init__(*args, **kwargs) @set_ev_cls(ofp_event.EventOFPSwitchFeatures, MAIN_DISPATCHER) def switch_features_handler(self, ev): datapath = ev.msg.datapath ofproto = datapath.ofproto parser = datapath.ofproto_parser # 添加默认流表规则:丢弃所有流量 match = parser.OFPMatch() actions = [] self.add_flow(datapath, 0, match, actions) def add_flow(self, datapath, priority, match, actions): ofproto = datapath.ofproto parser = datapath.ofproto_parser inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)] mod = parser.OFPFlowMod( datapath=datapath, priority=priority, match=match, instructions=inst ) datapath.send_msg(mod)
- 启动 Ryu 控制器:
ryu-manager simple_switch.py
- 编写一个简单的 Ryu 应用(
-
添加流表规则:
- 通过 Ryu 控制器动态添加流表规则,例如将来自端口 1 的流量转发到端口 2:
match = parser.OFPMatch(in_port=1) actions = [parser.OFPActionOutput(2)] self.add_flow(datapath, 1, match, actions)
- 通过 Ryu 控制器动态添加流表规则,例如将来自端口 1 的流量转发到端口 2:
-
验证配置:
- 查看 OVS 流表规则:
sudo ovs-ofctl dump-flows ovs-br0
- 查看 OVS 流表规则:
4. OVS 在 SDN 中的高级功能
场景 1:VXLAN 隧道
-
创建 VXLAN 隧道:
sudo ovs-vsctl add-port ovs-br0 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=192.168.1.101
-
验证配置:
sudo ovs-vsctl show
场景 2:流量镜像
-
配置流量镜像:
- 将端口 1 的流量镜像到端口 2:
sudo ovs-vsctl -- set Bridge ovs-br0 mirrors=@m \ -- --id=@p1 get Port vnet0 \ -- --id=@p2 get Port vnet1 \ -- --id=@m create Mirror name=mymirror select-dst-port=@p1 select-src-port=@p1 output-port=@p2
- 将端口 1 的流量镜像到端口 2:
-
验证配置:
sudo ovs-vsctl list mirror
5. 总结
- 作为普通交换机:OVS 支持 VLAN、STP 等传统交换功能,适合简单网络场景。
- 作为流表交换机:OVS 通过 OpenFlow 协议与 SDN 控制器协同工作,实现动态流量控制和高级功能(如 VXLAN、流量镜像)。
- 配置工具:
ovs-vsctl
用于管理 OVS 配置,ovs-ofctl
用于查看和修改流表规则。
通过以上配置案例,您可以根据实际需求灵活使用 OVS,构建高效、可编程的虚拟网络环境。