github仓库

演示视频

本次实验建立的拓扑

使用到的 pox 指令介绍,参考pox控制器学习笔记

1. forwarding.l2_learning

使OpenFlow交换机充当L2学习交换机的一种。当此组件学习L2地址时,它安装的流在尽可能多的字段上都是完全匹配的。

2. openflow.discovery

该组件在交换机之间使用特制的LLDP报文来发现整个网络的拓扑结构。当链路生效或者失效时,该组件都会产生一个事件(Raise Events)。

3. openflow.spanning_tree

该组件使用discovery组件来创建网络拓扑的视图,构造一棵生成树,然后使不在生成树中的交换机端口的洪泛功能失效,使得网络中不存在洪泛回路。

两个选项:

(1) --no-flood,只要交换机连接上了就使该交换机的所有端口洪泛失效,对于某些端口,稍后将使能。
(2) --hold-down,防止洪泛控制在一个完整的发现回路完成前被改变

因此该组件最安全的的使用方法是

openflow.spanning_tree --no-flood --hold-down

使用到的 mininet 指令介绍,参考Mininet常用命令参数介绍

1. mn --custom file.py --topo mytopo

依照 file.py 内的方式创建拓扑,可以参考mininet入门(二)

2. --mac

使用这个参数可以让MAC地址从小到达排列,使得复杂的网络更清晰,容易辨识各个组件的MAC地址。不使用这个参数的话,复杂的网络容易混乱。

3. --controller

一般我们不用mininet自带的控制器,而是自己制定一个远程控制器,代码如下:

mn --controller = remote,
--ip = [控制器的IP地址]
--port = [控制器的端口号]

如果--ip和--port省略的话,则默认使用本地ip地址,端口默认使用6653或6633端口号。

构建思路

Mininet是由斯坦福大学基于Linux Container架构开发的一个进程虚拟化网络仿真工具,可以创建一个包含主机,交换机,控制器和链路的虚拟网络,其交换机支持OpenFlow,具备高度灵活的自定义软件定义网络。

我们可以通过topology.py在虚拟机上使用Mininet构建一个虚拟的小型网络,该网络包含6个交换机,每个交换机都连接着一台主机。尽管Mininet本身可以创建一个主控制器来控制交换机,但我在Loopback接口的tcp6633端口处使用了远程控制器(POX),使其具有学习交换机和防火墙等附加功能。

firewallpolicies.csv提供所要阻止的ip地址并由firewall.py识别,firewall.py将指示控制器在交换机的流表中添加特定的条目,来自这些被阻止的ip地址的数据包将交由交换机独立处理。

L2学习算法将与POX控制器一起运行,控制器强制将所有交换机转换成具有学习功能的二层交换机(L2 switch)。当一个新的数据包到达交换机时,交换机根据openflow协议进行操作,在openflow协议中,它需要将数据包发送到控制器,因为交换机不知该如何操作,所以此时控制器会“告诉”交换机该如何操作,交换机会“学习”源地址及其相应的操作,并在交换机的流表中添加特定的流项。

在POX控制器上(特别是在此网络中)还需要运行openflow协议的Spanning_tree模块,以便大量的交换机能够有效地管理数据包流而不会出现任何循环和错误。

如果我们不将生成树算法与openflow的发现和生成树模块一起使用,则POX控制器将变得不受管理,并引发以下错误:

WARNING:openflow.of_01:<class 'pox.openflow.PacketIn'> raised on dummy OpenFlow nexus.

在2或3台交换机(线性连接)的网络中不会出现此问题。但是,该网络更像是一个网状网络,其中大多数主机都具有与其他主机的直接和多个间接连接。 openflow的spanning_tree组件使用openflow的发现组件来构建网络拓扑的视图,构造一个生成树,然后在不在树上的交换机端口上禁用洪泛。 Spanning_tree组件使用以下选项来修改交换机的行为:--no-flood选项在交换机连接后立即禁用所有端口上的洪泛。 --hold-down选项可防止更改洪水控制,直到完成一个完整的发现周期,因此,所有链接都有机会被发现。 openflow.discovery组件将LLDP消息从openflow交换机发送出去,以便它可以发现网络拓扑。

由于此项目的主要功能是在POX控制器上添加防火墙,因此firewall.py需要与POX控制器一起启动,该算法根据firewallpolicies.csv表工作。当交换机收到从ip_0地址发来的包时,会将其发送到POX,经防火墙模块处理后,将“丢弃”流条目下推到交换机以阻止数据包。因此,交换机将阻止来自该源的任何其他数据包。其他来源的数据包将被简单地转发,POX控制器会在交换机的流表中添加相应的流条目,以便任何其他数据包仅由交换机管理,而无需将数据包发送到控制器,因此符合软件定义网络的原则。

拦截规则

规则未启用

规则启用后

简单的sdn防火墙的更多相关文章

  1. Linux的简单命令(防火墙篇)

    名称 解释 重启 reboot 关机 shutdown  -h   now poweroff 查看本机IP地址 ifconfig 查看默认网卡信息的文件 cat /etc/sysconfig/netw ...

  2. nginx+lua构建简单waf网页防火墙

    需求背景 类似于论坛型的网站经常会被黑掉,除了增加硬件防护感觉效果还是不太好,还会偶尔被黑,waf的功能正好实现了这个需求. waf的作用: 防止sql注入,本地包含,部分溢出,fuzzing测试,x ...

  3. Ubuntu默认防火墙安装、启用、配置、端口、查看状态相关信息

    Ubuntu附带了一个相对iptables简单很多的防火墙 配置工具:ufw ufw防火墙 即uncomplicated firewall,不复杂的防火墙,繁琐部分的设置还是需要去到iptables ...

  4. SDN三种模型解析

    数十年前,计算机科学家兼网络作家Andrew S. Tanenbaum讽刺标准过多难以选择,当然现在也是如此,比如软件定义网络模型的数量也很多.但是在考虑部署软件定义网络(SDN)或者试点之前,首先需 ...

  5. 《SDN核心技术剖析和实战指南》第一章小结

    第一章主要是概况.新技术有一个特点是,每家都有不同的说法.这里我只说说我比较认同的部分. SDN的核心概念大概有两个:转发面与控制面分离.开发可编程化.书里还说逻辑上集中控制,其实这个就可以从转发与控 ...

  6. iptables防火墙详解(一)

    -- 防火墙 常见的防火墙 :瑞星 江民 诺顿 卡巴斯基 天网...... iptables firewalld http://www.netfilter.org/ netfilter / iptab ...

  7. ubuntu ufw防火墙软件的配置入门

    顺便,一条龙作完安全吧. ufw的使用,是比iptables简单.但只能作简单的事儿,更改简单的netfilter里的iptable里的记录.难点的,可能还是得iptables原生命令. 自打2.4版 ...

  8. SDN期末作业验收

    作业链接:https://edu.cnblogs.com/campus/fzu/SoftwareDefinedNetworking2017/homework/1585 负载均衡程序 1.github链 ...

  9. [转载]ubuntu防火墙设置

    原文地址:ubuntu防火墙设置作者:風飏    自打2.4版本以后的Linux内核中, 提供了一个非常优秀的防火墙工具.这个工具可以对出入服务的网络数据进行分割.过滤.转发等等细微的控制,进而实现诸 ...

随机推荐

  1. 【C#】【MySQL】C#连接MySQL数据库(二)解析

    C# MySQL 实现简单登录验证 后端代码解析 Visual Studio中使用MySQL的环境配置 下文所有到的代码(前端后端) 请查阅这篇博文 C#连接MySQL数据库(一)代码 获取前端数据 ...

  2. Redis5.0.8 Cluster集群部署

    目录 一.Redis Cluster简介 二.部署 三.创建主库 一.Redis Cluster简介 Redis Cluster集群是一种去中心化的高可用服务,其内置的sentinel功能可以提供高可 ...

  3. jenkins集成openldap

    参考图片 集成ldap参考链接:https://www.cnblogs.com/mascot1/p/10498513.html

  4. Django 中间件理解

    中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 应用场景,对所有 ...

  5. 优雅的按键模块-----Multi-button

    优雅的按键模块-----Multi-button ​ 在我们日常开发和使用的过程中常常使用了一些按键,利用按键实现不同的功能,比如长按,短按,双击等等.但是每次都是采用标志等等来实现信息的读取,是否有 ...

  6. JAVA获取文件byte数组并输出进行展示和文件下载

    /** * 文件下载 */ @GetMapping(value = "/download") public void download(HttpServletResponse re ...

  7. SpringBoot项目给静态变量static注入@Value

    @value不能直接注入值给静态属性,spring 不允许/不支持把值注入到静态变量中:spring支持set方法注入,我们可以利用非静态setter 方法注入静态变量 @Component publ ...

  8. redis启动报错 var/run/redis_6379.pid exists, process is already running or crashed

    redis启动显示 /var/run/redis_6379.pid exists, process is already running or crashed 出现这个执行 rm -rf /var/r ...

  9. JAVA获取某年(当年)的第一天的开始时刻和某年(当年)的最后一天的最后时刻

    package com.date; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Dat ...

  10. cmake之生成动态库

    演示源码下载地址: https://github.com/mohistH/demo_cmake_dylib 把文仅为参考. 以实际情况为准 1.目录结构 │ CMakeLists.txt │ inde ...