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 # 后台运行,不然不好访问 webMininet
使用 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的数据包丢弃
控制管理类
查看网桥和端口
创建一个网桥
添加/删除一个端口
设置/清除网桥的 openflow 协议版本
查看某网桥当前流表
设置/删除控制器
查看控制器列表
设置/删除被动连接控制器
设置/移除可选选项
设置 fail 模式,支持 standalone 或者 secure
standalone(default):清除所有控制器下发的流表,ovs 自己接管
secure:按照原来流表继续转发
查看接口 id 等
查看接口统计
流表类
流表操作
添加普通流表
删除所有流表
按匹配项来删除流表
匹配项
匹配 vlan tag,范围为 0-4095
匹配 vlan pcp,范围为 0-7
匹配源/目的 MAC
匹配以太网类型,范围为 0-65535
匹配源/目的 IP 条件:指定 dl_type=0x0800,或者 ip/tcp
匹配协议号,范围为 0-255 条件:指定 dl_type=0x0800 或者 ip/ICMP
匹配 IP ToS/DSCP,tos 范围为 0-255,DSCP 范围为 0-63 条件:指定 dl_type=0x0800/0x86dd,并且 ToS 低 2 位会被忽略(DSCP 值为 ToS 的高 6 位,并且低 2 位为预留位)
匹配 IP ecn 位,范围为 0-3 条件:指定 dl_type=0x0800/0x86dd
匹配 IP TTL,范围为 0-255
匹配 tcp/udp,源/目的端口,范围为 0-65535
匹配 tcp flags tcp flags=fin,syn,rst,psh,ack,urg,ece,cwr,ns
匹配 icmp code,范围为 0-255 条件:指定 icmp
匹配 vlan TCI TCI 低 12 位为 vlan id,高 3 位为 priority,例如 tci=0xf123 则 vlan_id 为 0x123 和 vlan_pcp=7
匹配 mpls label 条件:指定 dl_type=0x8847/0x8848
匹配 mpls tc,范围为 0-7 条件:指定 dl_type=0x8847/0x8848
匹配 tunnel id,源/目的 IP
指令动作
动作为出接口
动作为指定 group
动作为 normal
动作为 flood
动作为 all
动作为 local
动作为 in_port
动作为 controller
动作为 drop
动作为 mod_vlan_vid
动作为 mod_vlan_pcp
动作为 strip_vlan
动作为 push_vlan
动作为 push_mpls
动作为 pop_mpls
动作为修改源/目的 MAC,修改源/目的 IP
动作为修改 TCP/UDP/SCTP 源目的端口
动作为 mod_nw_tos
动作为 mod_nw_ecn
动作为 mod_nw_ttl
动作为 dec_ttl
动作为 set_mpls_label
动作为 set_mpls_tc
动作为 set_mpls_ttl
动作为 dec_mpls_ttl
动作为 move NXM 字段
动作为 load NXM 字段
动作为 pop_vlan