SDN 笔记


ODL虚拟机基础配置

开完 ODL 虚拟机后先配置 IP 配置文件在 /etc/network/interface 目录下.

vim /etc/network/interface

iface eth0 inet static
address 172.16.9.100  # 修改成自己的 IP 地址
netmask 255.255.255.0 # 修改成自己的掩码地址
gateway 172.16.9.254  # 修改成自己的网关地址

建议虚拟机开 NAT 模式 然后 IP 配置同网段 vmnet 网卡 IP 再用 SecureCRT 开3个窗口 SSH 上去,一个窗口开 Opendaylight,一个窗口开 Mininet,一个配置流表


OpenDaylight

cd ODL/bin/
sudo ./karaf

opendaylight-user@root> feature:install odl-restconf
opendaylight-user@root> feature:install odl-l2switch-switch-ui
opendaylight-user@root> feature:install odl-mdsal-apidocs
opendaylight-user@root> feature:install odl-dluxapps-applications

# 组件安装完成后,可以通过浏览器访问 OpenDaylight WEB 控制台,访问的 url 为:http://{controller_ip}:8181/index.html
# 登录用户名和密码都是 admin
# 其中{controller_ip}为 OpenDaylight 控制器的 IP 地址,如果是本机,则 ip 地址可以为 127.0.0.1.

# 如果是SSH开2窗口的就不用挂起后台运行了,下面2步仅针对单 session 操作
Ctrl+z  # 后台挂起
bg      # 后台运行,不然不好访问 web

Mininet

使用 mininet 生成网络拓扑

sudo mn --controller=remote,ip=xxx,xxx,xxx,xxx

显示 Mininet CLI 命令:

mininet> help

显示节点:

mininet> nodes

显示网络链接:

mininet> net

输出所有节点的信息:

mininet> dump

示例

例1

单交换机(Single switch)

创建完拓扑后即可使用 ping 命令进行测试:h1 ping h2 (注意:如果没有指定控制器的话,是 ping 不通的)

例2

使用 Mininet 和 OpenVswitch 构建拓扑,采用采用 OVS 交换机格式,连接 ODL 的 6653 端口 Openflow1.3 协议

深度2,扇出系数2


例3

使用 Mininet 构建拓扑,采用 ovsk 交换格式,连接 ODL 的远程地址为 192.168.10.128:6653,协议类型是 Openflow1.30


例4

两个线性连接的交换机

使用 Mininet 和 OpenVswitch 构建拓扑,连接 ODL 的 6653 端口采用 Openflow1.3 协议

下面的命令创建具有2个交换机,两个交换机下面个连一个主机,交换机之间再互连起来.


流表

示例

流表操作在第三个窗口上进行,当然在 mininet 中可以在命令前加上 sh 运行

再提醒一下,流表操作在第三个窗口上进行,前面加 sudo

如果在 mininet 中可以在命令前加上 sh 运行

例1

通过 OVS 下发流表,H1 与 H2 可以互通,H1 与 H3 不能互通,但 H3 和 H4 之间可以互通.

将主机1发给主机3的数据包丢弃

该流表项的匹配字段包括:

  • dl_type=0x0800(MAC帧上一层为IP协议)

  • nw_src=10.0.0.1(源IP地址为10.0.0.1)

  • nw_dst=10.0.0.3(目的IP地址为10.0.0.3)

  • 优先级 priority 设为27,高于其他流表,故优先执行;

  • table id 为0,即将该流表项下发到table 0中.

  • 该流表项表示:从主机 10.0.0.1 发往主机 10.0.0.3 的IP包将被抛弃.

查看控制器下发的流表项


例2

H1 启动 HTTP-Server 功能,WEB 端口为 80,H2 作为 HTTP-Client,获取 H1 的 html 网页文件.

通过 OVS 手工命令在 openflow:1 虚拟交换机下发流表,只允许下发一条流表,优先级为 priority=50 实现如下需求:H1 与 H2 可以互通,H1 与 H3 不能互通,但 H3 和 H4 之间可以互通.

将主机1发给主机3的数据包丢弃

用 iperf 工具测试 H3 和 H4 的带宽.


例3

通过 OVS 手工下发流表,H1 可以 ping 通 H3,H1 无法 ping 通 H2.

将主机1发给主机2的数据包丢弃


例4

通过 OVS 手工下发流表,H1 和 H2 互通.H1 启动 HTTPSERVER 功能,WEB 端口为 4330,H2 作为 HTTPCLIENT,获取 H1 的 html 网页文件.

下发流表使得 H1 和 H2 不通

将主机1发给主机2的数据包丢弃


例5

通过 OVS 给S2下发流表,使得 H1 与 H2 无法互通.

将主机1发给主机2的数据包丢弃


控制管理类

  1. 查看网桥和端口

  1. 创建一个网桥

  1. 添加/删除一个端口

  1. 设置/清除网桥的 openflow 协议版本

  1. 查看某网桥当前流表

  1. 设置/删除控制器

  1. 查看控制器列表

  1. 设置/删除被动连接控制器

  1. 设置/移除可选选项

  1. 设置 fail 模式,支持 standalone 或者 secure

  • standalone(default):清除所有控制器下发的流表,ovs 自己接管

  • secure:按照原来流表继续转发

  1. 查看接口 id 等

  1. 查看接口统计

流表类

流表操作

  1. 添加普通流表

  1. 删除所有流表

  1. 按匹配项来删除流表

匹配项

  1. 匹配 vlan tag,范围为 0-4095

  1. 匹配 vlan pcp,范围为 0-7

  1. 匹配源/目的 MAC

  1. 匹配以太网类型,范围为 0-65535

  1. 匹配源/目的 IP 条件:指定 dl_type=0x0800,或者 ip/tcp

  1. 匹配协议号,范围为 0-255 条件:指定 dl_type=0x0800 或者 ip/ICMP

  1. 匹配 IP ToS/DSCP,tos 范围为 0-255,DSCP 范围为 0-63 条件:指定 dl_type=0x0800/0x86dd,并且 ToS 低 2 位会被忽略(DSCP 值为 ToS 的高 6 位,并且低 2 位为预留位)

  1. 匹配 IP ecn 位,范围为 0-3 条件:指定 dl_type=0x0800/0x86dd

  1. 匹配 IP TTL,范围为 0-255

  1. 匹配 tcp/udp,源/目的端口,范围为 0-65535

  1. 匹配 tcp flags tcp flags=fin,syn,rst,psh,ack,urg,ece,cwr,ns

  1. 匹配 icmp code,范围为 0-255 条件:指定 icmp

  1. 匹配 vlan TCI TCI 低 12 位为 vlan id,高 3 位为 priority,例如 tci=0xf123 则 vlan_id 为 0x123 和 vlan_pcp=7

  1. 匹配 mpls label 条件:指定 dl_type=0x8847/0x8848

  1. 匹配 mpls tc,范围为 0-7 条件:指定 dl_type=0x8847/0x8848

  1. 匹配 tunnel id,源/目的 IP

指令动作

  1. 动作为出接口

  1. 动作为指定 group

  1. 动作为 normal

  1. 动作为 flood

  1. 动作为 all

  1. 动作为 local

  1. 动作为 in_port

  1. 动作为 controller

  1. 动作为 drop

  1. 动作为 mod_vlan_vid

  1. 动作为 mod_vlan_pcp

  1. 动作为 strip_vlan

  1. 动作为 push_vlan

  1. 动作为 push_mpls

  1. 动作为 pop_mpls

  1. 动作为修改源/目的 MAC,修改源/目的 IP

  1. 动作为修改 TCP/UDP/SCTP 源目的端口

  1. 动作为 mod_nw_tos

  1. 动作为 mod_nw_ecn

  1. 动作为 mod_nw_ttl

  1. 动作为 dec_ttl

  1. 动作为 set_mpls_label

  1. 动作为 set_mpls_tc

  1. 动作为 set_mpls_ttl

  1. 动作为 dec_mpls_ttl

  1. 动作为 move NXM 字段

  1. 动作为 load NXM 字段

  1. 动作为 pop_vlan