趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法

软件定义网络(SDN)
趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法

  • 控制与转发分离。转发平面是一个个虚拟或物理的网络设备。控制平面是统一的控制中心。
  • 控制平面与转发平面之间的开放接口。控制器向上提供接口,被应用层调用,向下调用接口,控制网络设备。
  • 逻辑上的集中控制。逻辑上集中的控制平面可控制多个转发设备,即控制整个物理网络,可获得全局的网络状态视图,并根据网络全局网络状态视图实现对网络的优化控制。

OpenFlow 和 OpenSwitch

OpenFlow 是 SDN 控制器和网络设备之间互通的南向接口协议。

OpenvSwitch 用于创建软件的虚拟交换机,支持 OpenFlow 协议。

两者被统一的 SDN 控制器管理,从而实现物理机和虚拟机的网络连通。
趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法

SDN 控制器如何通过 OpenFlow 协议控制网络?
趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法
在 OpenvSwitch 里,有一个流表规则,任何通过这个交换机的包,都会经过这些规则进行处理,从而接收、转发、放弃。

流表里有多个表格,每个表格有多行,每行是一条规则,每条规则有优先级。
趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法
通过流表,可对收到的网络包进行处理。
趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法
OpenvSwitch 实现 VLAN 功能

OpenvSwitch 端口 port 分两种:

1、access port

  • 配置 tag,从此端口进来的包会被打上这个 tag。
  • 如果网络包本身带有的 VLAN ID 等于 tag,则会从这个 port 发出。
  • 从 access port 发出的包不带 VLAN ID。

2、trunk port

  • 不配置 tag, 配置 trunks。
  • 如果 trunks 为空,允许所有的包通过。
  • 如果 trunks 不空,则仅仅 带着 trunks 允许的 VLAN ID 的包通过。

创建环境:

ovs-vsctl add-port ubuntu_br first_br
ovs-vsctl add-port ubuntu_br second_br
ovs-vsctl add-port ubuntu_br third_br
ovs-vsctl set Port vnet0 tag=101
ovs-vsctl set Port vnet2 tag=102
ovs-vsctl set Port first_br tag=103
ovs-vsctl clear Port second_br tag
ovs-vsctl set Port third_br trunks=101, 102

禁止 MAC 学习:

ovs-vsctl set bridge ubuntu_br flood-vlans=101, 102, 103

趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法

  • 从 192.168.100.102 ping 192.168.100.103,first_if、sencond_br 可收到包。first_br 出去的包没有 VLAN ID,second_br 是 trunk port,出来的包头有 VLAN ID。
  • 从 192.168.100.100 ping 192.168.100.105,second_if、third_if 可收到包,包头里 VLAN ID = 101。但 ping 不通,因为 third_if 不属于某个 VLAN。
  • 从 192.168.100.101 ping 192.168.100.104,second_if、third_if 可收到包,包头里 VLAN ID = 102。

用 OpenvSwitch 模拟网卡绑定,连接交换机

bond_mode 可设置如下三个值:

  • active-backup:active 失效时,backup 顶替。
  • blance-slb:流量安装源 MAC 和 output VLAN 进行负载均衡。
  • blance-tcp:在支持 LACP 协议的情况下,可根据 L2, L3, L4 进行负载均衡。

环境:
趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法
建立 bond 连接:

ovs-vsctl add-bond br0 bond0 first_br second_br
ovs-vsctl add-bond br1 bond1 first_if second_if
ovs-vsctl set Port bond0 lacp=active
ovs-vsctl set Port bond1 lacp=active

1、默认 bond_mode 是 active-backup 模式,一开始 active 的是 first_br 和 first_if。

从 192.168.100.100 ping 192.168.100.102,从 192.168.100.101 ping 192.168.100.103,包都从 first_br 通过。

如果把 first_if 设成 down,则 second_if 开始有流量。

2、bond_mode 设为 balance-slb。

从 192.168.100.100 ping 192.168.100.102,从 192.168.100.101 ping 192.168.100.103,包会分流。

ovs-vsctl set Port bond0 bond_mode=blance-slb
ovs-vsctl set Port bond1 bond_mode=blance-slb

OpenvSwitch 如何做到这些?架构图如下
趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法
(1)在用户态,有两个重要的进程,两个重要的命令行工具。

  • OVSDB 进程。ovs-vsctl 命令行与之通信,创建虚拟交换机、端口,将端口添加到虚拟交换机,OVSDB 将这些拓扑信息保存在一个本地文件中。
  • vswitchd 进程。ovs-ofctl 命令行与之通信,下放流表规则,vswitchd 将流表放在用户态 Flow Table 中。

(2)在内核态,

  • 内核模块 OpenvSwitch.ko,为图中的 Datapath 部分。在网卡上注册一个函数,每当有网络包到达此网卡时,该函数被调用,提取各个层的重要信息。
  • 内核态 Flow Table。内核模块在这个内核流表中匹配规则,如果匹配上,则执行操作、修改包,或转发或丢弃。如果内核没有匹配上,则进入用户态,用户态和内核态之间通过 Netlink 通信。

内核通过 upcall,告知用户态进程 vswitchd 在用户态 Flow Table 匹配规则,内核 Flow Table 里只保留部分规则,过一阵会过期。

用户态匹配了流表规则后,在用户态执行操作,同时将匹配成功的流表通过 reinject 下发到内核。

调用 openflow 协议的,是本地命令行工具或远程的 SDN 控制器。一个重要的 SDN 控制器是 OpenDaylight。可通过 OpenDaylight,将两个交换机之间配置通,或不通,还可配置虚拟 IP 地址,在不同机器之间实现负载均衡。

如何在云计算中使用 OpenvSwitch?
趣谈网络协议---软件定义网络 SDN:共享基础设施的小区物业管理办法

1、OpenvSwitch 本身支持 VLAN,所有的虚拟机可放在一个网桥 br0 上,通过不同的用户配置不同的 tag,就能实现隔离。

如图中,用户 A、B 的虚拟机都可在 br0 上,只是设置了不同的 tag。

2、创建一个虚拟交换机 br1,将物联网络和虚拟网络隔离。物理网络有物理网的 VLAN 规划,虚拟机在一台物理机上,所有的 VLAN 都从 1 开始,一般不会超过 4096。

如图中,上面的物理机中,用户 A 的 tag 是 1,B 的 tag 是 2,下面的物理机中,A 的 tag 是 7,B 的 tag 是6。