【计算机网络】SDN实验整理

常用命令

mininet

mininet >help 获取帮助列表
mininet >nodes 查看网络拓扑中结点的状态
mininet >links 显示链路健壮性信息
mininet >net 显示网络拓扑
mininet >dump 显示每个节点的接口设置和表示每个节点的进程的PID
mininet >pingall 在网络中的所有主机之间执行ping测试
mininet>pingpair 只测试前两个主机的连通性
mininet >iperf 两个节点之间进行iperftcp带宽测试(iperf h1 h2)
mininet >iperfudp 两节点之间进行iperfudp带宽测试(iperfudp bw h1h2)
mininet >link 禁用或启用节点间链路link s1 s2 up启用link s1 s2 down禁用s1和s2之间的链路)
mininet >h1 ping h2 h1和h2节点之间执行ping测试
mininet >h1 ifconfig 查看host1的IP等信息
mininet >xterm h1 打开host1的终端
mininet >exit 退出mininet登录
mininet >intfs 查看网络接口信息

openflow

查看流表:dpctl dump-flows
添加流表:dpctl add-flow in_port=2,actions=output:3
添加丢弃数据包流表:dpctl add-flow in_port=2,action=drop
删除所有交换机的所有流表:dpctl del-flows
删除所有交换机的特定流表:dpctl del-flows in_port=3
删除某个交换机的流表:sh ovs-ofctl del-flows s1 in_port=3

配置测试

image.png

ryu-manager **.py 这个命令中,**.py 表示一个 Ryu 应用程序的 Python 脚本文件。这个文件包含了定义网络行为的逻辑,比如如何处理网络流量、如何实现路由等。当你执行这个命令时,ryu-manager 将加载并运行指定的 Python 脚本
【计算机网络】SDN实验整理_第1张图片
mn 是 Mininet 的命令行工具,--controller=remote 指定控制器运行在远程模式,这意味着 Mininet 会尝试连接到一个运行在本机或其他服务器上的控制器。
通过这个界面,用户可以进一步配置网络、运行测试、模拟网络场景等。如果配置了外部控制器,比如使用了 ryu-manager 运行了 Ryu 应用程序,那么 Mininet 中的交换机会尝试与该控制器连接并按照控制器的指令转发网络流量。6653是OpenFlow 控制器的标准端口

mininet负责构造网络拓扑结构,ryu负责进行openflow表控制

网络搭建

视频例子:搭建如下网络
【计算机网络】SDN实验整理_第2张图片

使用miniedit可视化搭建

miniedit.py在/mininet/mininet/examples下
打开miniedit报找不到python解决方法
image.png

界面介绍

【计算机网络】SDN实验整理_第3张图片

edit-prefence

【计算机网络】SDN实验整理_第4张图片
这个界面是 Mininet 的配置对话框,其中包含了多个配置选项:

  • IP Base: 这是用于自动分配给 Mininet 网络中的设备(如主机和控制器)的 IP 地址的基础。10.0.0.0/8 表示使用 10.0.0.010.255.255.255 这个范围的 IP 地址,子网掩码为 8 位,这意味着网络前缀是前 8 位,也就是 10.x.x.x
  • Default Terminal: 这里指定了 Mininet 启动主机终端时使用的默认终端仿真器。例如,xtermgnome-terminalkonsole 等。
  • Start CLI: 这个复选框如果被选中,Mininet 会在启动网络后自动启动命令行界面(CLI)。
  • Default Switch: 这里指定了 Mininet 使用的默认交换机类型。Open vSwitch Kernel Mode 表示使用 Open vSwitch 的内核模式运行交换机。
    Open vSwitch 部分:
  • OpenFlow 1.0 - 1.3: 这些复选框允许你选择 Open vSwitch 支持的 OpenFlow 协议的不同版本。
  • dpctl port: 这个输入框用于指定与 Open vSwitch 交互的 dpctl 工具的端口号。
    sFlow Profile for Open vSwitch 部分:
  • Target: 指定接收 sFlow 采样数据的收集器地址和端口。
  • Sampling: 设置每多少个包进行一次采样。
  • Header: 指定每个采样数据包的最大字节数。
  • Polling: 设置多久进行一次流量计数器的轮询(以秒为单位)。
    NetFlow Profile for Open vSwitch 部分:
  • Target: 指定接收 NetFlow 数据的收集器地址和端口。
  • Active Timeout: 设置在活动流结束之前,多长时间发送一次 NetFlow 记录。
  • Add ID to Interface: 如果选中,会在接口名称中添加标识符,用以区分不同的流量采样数据。
    如图修改
    【计算机网络】SDN实验整理_第5张图片

控制器属性

【计算机网络】SDN实验整理_第6张图片
类型设置为远程,这里使用ryu的控制器

交换机属性

【计算机网络】SDN实验整理_第7张图片
设置十六位DPID和switch type

主机属性

【计算机网络】SDN实验整理_第8张图片
设置ip

使用python搭建

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call

def myNetwork():

    net = Mininet( topo=None,
                   build=False,
                   ipBase='10.0.0.0/8')

    info( '*** Adding controller\n' )
    c0=net.addController(name='c0',
                      controller=RemoteController,
                      ip='127.0.0.1',
                      protocol='tcp',
                      port=6633)

    info( '*** Add switches\n')
    s1 = net.addSwitch('s1', cls=OVSKernelSwitch, dpid='0000000000000001')
    s2 = net.addSwitch('s2', cls=OVSKernelSwitch, dpid='0000000000000002')
    s3 = net.addSwitch('s3', cls=OVSKernelSwitch, dpid='0000000000000003')

    info( '*** Add hosts\n')
    h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
    h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)
    h5 = net.addHost('h5', cls=Host, ip='10.0.0.5', defaultRoute=None)
    h6 = net.addHost('h6', cls=Host, ip='10.0.0.6', defaultRoute=None)

    info( '*** Add links\n')
    net.addLink(s1, h1)
    net.addLink(h2, s1)
    net.addLink(s2, h3)
    net.addLink(h4, s2)
    net.addLink(h5, s3)
    net.addLink(s3, h6)
    net.addLink(s1, s2)
    net.addLink(s2, s3)

    info( '*** Starting network\n')
    net.build()
    info( '*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info( '*** Starting switches\n')
    net.get('s1').start([c0])
    net.get('s2').start([c0])
    net.get('s3').start([c0])

    info( '*** Post configure switches and hosts\n')

    CLI(net)

    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()

实验过程

  1. 安装vmware,创建ubuntu虚拟机,配置相关环境
    【计算机网络】SDN实验整理_第9张图片
    经过验证,环境配置成功。

  2. 使用miniedit根据拓扑图连接配置
    【计算机网络】SDN实验整理_第10张图片

  3. 启动ryu-manager
    【计算机网络】SDN实验整理_第11张图片

  4. 运行拓扑,测试全部连通。
    【计算机网络】SDN实验整理_第12张图片

  5. 查看ryu下的包状态
    【计算机网络】SDN实验整理_第13张图片

  6. 使用net指令查看端口连接情况,每个设备名称后的 -ethX 表示该设备的以太网接口,其中 X 是接口编号。
    【计算机网络】SDN实验整理_第14张图片

  7. 在拓扑图上添加交换机端口号如下
    【计算机网络】SDN实验整理_第15张图片

  8. 在没有主机发送数据包的情况下,输入dpctl dump-flows查看交换机的流表信息。可以看到流表还是空的。
    image.png

  9. pingall后再次输入dpctl dump-flows查看交换机的流表信息。交换机将pingall操作中主机之间的通信过程进行了转发,然后记录在了流表信息中。
    【计算机网络】SDN实验整理_第16张图片

  10. 使用dpctl del-flows清除流表信息

  11. 添加两条规则,让走端口1输入的都走2输出,走2输入的都走1输出。查看流表信息。
    【计算机网络】SDN实验整理_第17张图片

  12. 查看连通性,根据拓扑图的端口来看,应该分别只有h1,h2连通,h3,h4连通,h5,h6连通。验证后也确实如此。
    【计算机网络】SDN实验整理_第18张图片

  13. 删除所有输入端口为1的规则
    【计算机网络】SDN实验整理_第19张图片

  14. 删除所有规则。此时和视频出现差错,视频重新全部ping通,但我全都无法ping通。
    【计算机网络】SDN实验整理_第20张图片

  15. 检查操作后发现之前重启的ryu使用了example_switch_13,没有正确使用simple_switch。更换成正确的应用后可以连通。
    【计算机网络】SDN实验整理_第21张图片

  16. 再次尝试,对交换机S3进行如下配置
    【计算机网络】SDN实验整理_第22张图片
    sh ovs-ofctl add-flow s3 priority=40001,ip,in_port=3,nw_src=10.0.0.1,nw_dst=10.0.0.6,actions=drop
    sh ovs-ofctl add-flow s3 priority=40001,ip,in_port=3,nw_src=10.0.0.4,nw_dst=10.0.0.5,actions=drop

  17. 查看流表并进行连通性检查。根据规则,IP源地址10.0.0.1发送到IP目的地址为10.0.0.6的主机的数据包被丢弃,IP源地址10.0.0.4发送到IP目的地址10.0.0.5的数据包被丢弃。所以h1无法与h6连通,h4无法与h5连通。
    【计算机网络】SDN实验整理_第23张图片

  18. 重置后再次定义规则,凡是来自输入端口2的数据全都丢弃。
    dpctl add-flow in_port=2,action=drop
    【计算机网络】SDN实验整理_第24张图片

  19. pingall验证,结果正确,只有1端口输入输出的才能连通。
    【计算机网络】SDN实验整理_第25张图片

  20. 教学视频学习完毕,自己构建一套拓扑图和流表。先使用miniedit绘制拓扑图。
    【计算机网络】SDN实验整理_第26张图片

  21. 启动,记录一下端口连接情况,添加在拓扑图上。
    【计算机网络】SDN实验整理_第27张图片

  22. 使用python构建代码

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call

def myNetwork():

    net = Mininet( topo=None,
                   build=False,
                   ipBase='10.0.0.0/8')

    info( '*** Adding controller\n' )
    c0=net.addController(name='c0',
                      controller=RemoteController,
                      ip='127.0.0.1',
                      protocol='tcp',
                      port=6633)

    info( '*** Add switches\n')
    s1 = net.addSwitch('s1', cls=OVSKernelSwitch, dpid='0000000000000001')
    s2 = net.addSwitch('s2', cls=OVSKernelSwitch, dpid='0000000000000002')
    s3 = net.addSwitch('s3', cls=OVSKernelSwitch, dpid='0000000000000003')
    s4 = net.addSwitch('s4', cls=OVSKernelSwitch, dpid='0000000000000004')
    s5 = net.addSwitch('s5', cls=OVSKernelSwitch, dpid='0000000000000005')
    s6 = net.addSwitch('s6', cls=OVSKernelSwitch, dpid='0000000000000006')

    info( '*** Add hosts\n')
    h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
    h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)
    h5 = net.addHost('h5', cls=Host, ip='10.0.0.5', defaultRoute=None)
    h6 = net.addHost('h6', cls=Host, ip='10.0.0.6', defaultRoute=None)
    h7 = net.addHost('h7', cls=Host, ip='10.0.0.7', defaultRoute=None)
    h8 = net.addHost('h8', cls=Host, ip='10.0.0.8', defaultRoute=None)
    h9 = net.addHost('h9', cls=Host, ip='10.0.0.9', defaultRoute=None)
    h10 = net.addHost('h10', cls=Host, ip='10.0.0.10', defaultRoute=None)
    h11 = net.addHost('h11', cls=Host, ip='10.0.0.11', defaultRoute=None)
    h12 = net.addHost('h12', cls=Host, ip='10.0.0.12', defaultRoute=None)

    info( '*** Add links\n')
    net.addLink(h1, s1)
    net.addLink(h2, s1)
    net.addLink(h3, s2)
    net.addLink(h4, s2)
    net.addLink(h5, s3)
    net.addLink(h6, s3)
    net.addLink(h7, s4)
    net.addLink(h8, s4)
    net.addLink(h9, s5)
    net.addLink(h10, s5)
    net.addLink(h11, s6)
    net.addLink(h12, s6)
    net.addLink(s1, s2)
    net.addLink(s2, s3)
    net.addLink(s3, s4)
    net.addLink(s4, s5)
    net.addLink(s5, s6)

    info( '*** Starting network\n')
    net.build()
    info( '*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info( '*** Starting switches\n')
    net.get('s1').start([c0])
    net.get('s2').start([c0])
    net.get('s3').start([c0])
    net.get('s4').start([c0])
    net.get('s5').start([c0])
    net.get('s6').start([c0])

    info( '*** Post configure switches and hosts\n')

    CLI(net)

    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()

  1. 规定h1,h2,h3禁止访问h10,h11,h12,h10,h11,h12也禁止访问h1,h2,h3。这两端的各三台主机都与中间的h4,h5,h6,h7,h8,h9互通。
  2. 编写控制命令并输入,检查流表
# 阻止 h1, h2, h3 与 h10, h11, h12 通信
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.1,nw_dst=10.0.0.10,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.1,nw_dst=10.0.0.11,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.1,nw_dst=10.0.0.12,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.2,nw_dst=10.0.0.10,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.2,nw_dst=10.0.0.11,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.2,nw_dst=10.0.0.12,actions=drop
sh ovs-ofctl add-flow s2 ip,nw_src=10.0.0.3,nw_dst=10.0.0.10,actions=drop
sh ovs-ofctl add-flow s2 ip,nw_src=10.0.0.3,nw_dst=10.0.0.11,actions=drop
sh ovs-ofctl add-flow s2 ip,nw_src=10.0.0.3,nw_dst=10.0.0.12,actions=drop

# 阻止 h10, h11, h12 与 h1, h2, h3 通信
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.10,nw_dst=10.0.0.1,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.10,nw_dst=10.0.0.2,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.10,nw_dst=10.0.0.3,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.11,nw_dst=10.0.0.1,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.11,nw_dst=10.0.0.2,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.11,nw_dst=10.0.0.3,actions=drop
sh ovs-ofctl add-flow s6 ip,nw_src=10.0.0.12,nw_dst=10.0.0.1,actions=drop
sh ovs-ofctl add-flow s6 ip,nw_src=10.0.0.12,nw_dst=10.0.0.2,actions=drop
sh ovs-ofctl add-flow s6 ip,nw_src=10.0.0.12,nw_dst=10.0.0.3,actions=drop

# 默认允许其他流量
sh ovs-ofctl add-flow s1 priority=0,actions=normal
sh ovs-ofctl add-flow s2 priority=0,actions=normal
sh ovs-ofctl add-flow s3 priority=0,actions=normal
sh ovs-ofctl add-flow s4 priority=0,actions=normal
sh ovs-ofctl add-flow s5 priority=0,actions=normal
sh ovs-ofctl add-flow s6 priority=0,actions=normal

【计算机网络】SDN实验整理_第28张图片
25. pingall进行连通性测试,检查结果
【计算机网络】SDN实验整理_第29张图片
结果正确,h1,h2,h3和h10,h11,h12无法互通,其他都互通。

思考题

1.Openflow如何实现流表控制?其工作原理是什么?
OpenFlow通过向支持该协议的交换机内部的流表中添加、删除或修改流表项来实现流表控制。交换机根据流表中的规则来处理网络流量,其中每个规则定义了一组匹配标准和一组相应的动作。当数据包到达交换机时,交换机会按照优先级顺序检查流表中的规则,直到找到匹配的规则为止,然后根据该规则执行相应的动作。
2.谈谈你觉得Openflow有何应用场景?
Openflow适合于需要高度可编程性和灵活性的环境。例如在数据中心中,OpenFlow可以实现精细化的流量管理,从而优化资源利用率并进行动态负载均衡。Openflow还可以对于网络进行划分,将不同的区域进行分割。
3.你觉得SDN网络对于当前计算机网络的发展的创新性在哪?
SDN网络的创新性在于它彻底改变了传统网络的架构,通过将控制平面从数据平面中分离出来,实现了更加集中和灵活的网络管理。这种架构转变使得网络策略能够快速响应业务需求的变化,通过软件定义来适应网络环境的变化,而不是依赖硬件的物理配置。
4.动手进行实践,自己进行网络拓扑创建(可视化界面创建或者使用python脚本
创建),然后对于你所构建的网络拓扑进行分析。
5.动手构建Openflow流表并进行配置,阐述你的流表设置的匹配和动作的过程。

你可能感兴趣的:(计算机网络,计算机网络,网络,python,linux,ubuntu)