“访问限制”&“代理访问”实验

前言: 第三届SDN创新大赛又悄悄临近了,第二届大赛时做的题目积压在电脑里实在可惜,因此简单整理,拿出来和大家分享,从代码到实验过程,比较详尽,可以供初学者参考学习。

第二届初赛题分为基础题、提高题和设计题。设计题各有不同,这里主要分享基础题中“访问限制”和提高题中“代理访问”。完整代码可以去https://github.com/ysywh的match库中下载。

一 访问限制

1 实验目的

一台Web服务器提供简单的静态网页访问,实现一台PC 机可以访问web服务器,然后限制该PC 机一定时间(比如一分钟)内再次访问服务器。限制时间过后,PC机可以再次成功访问web服务器。实验Topo如下:

2 实验设备

物理服务器1台,系统为Ubuntu14.0.4(搭建mininet仿真环境、Ryu控制器和Nginx的web服务,进行实验验证)

3 实验原理

1)本实验使用物理服务器安装Mininet软件、Ryu控制器和Nginx搭建实验环境,其中Nginx用来提供web服务。 2)在Ryu控制器端实现代码,通过检测主机访问服务器的80端口,然后限制或允许TCP报文转发,实现题目要求访问限制。

4 代码设计

4.1 核心代码的流程图

核心代码流程图

控制器通过检测访问端口为80数据报文,检测用户主机H1对web服务器的访问,通过下发禁止用户H1访问web服务器80端口的Flow-mod流表项,进行访问限制。 4.2 核心代码 为了在合适的时刻对用户访问进行限制,即下发禁止访问得了流表,需要在packet-in的处理中进行如下策略,代码如下。首先需要一个禁止列表limit(字典类型),key值为(源ip,目的ip,目的port),value为True或是false,记录是否对相应key的用户禁止访问过,禁止过则设置为false,为true时则启动进程monitor下发禁止1分钟的双向流表项。注意,为了普遍意义,采用limit列表可以对任何用户有效。防止阻塞和提高效率,采用进程方式调用。

5 实验步骤

实验步骤主要分为三个部分:1)建立实验topo脚本,启动Minnet,搭建实验网络环境2)搭建WEB服务器3)启动Ryu控制器,加载访问限制模块 5.1 建立topo脚本,启动Mininet Topo脚本比较简单,即两个主机连接一个交换机的topo,这里不再赘述。在Ubuntu终端下,输入如下命令,加载我们写好的topo脚本文件,并且指定Openflow协议版本为1.3,指定本地服务器地址,用参数-x打开H1和H2终端xterm,开启网络环境。

mn --mac --custom /home/hl/text/topo1.py --topo mytopo -switch=ovsk ,protocols=Openflow13  --controller remote –x

建立好的H1和H2的默认IP分别为10.0.0.1和10.0.0.2,其中,使用H1作为访问用户的主机,H2作为web服务器,提供静态网页访问的功能。 5.2 搭建Web 服务器 我们需要在H2上搭建web服务器来提供web服务,实验中我们使用Nginx服务器。

在H2终端xterm下,安装Nginx服务器:

apt-get install nginx

将/usr/share/nginx/www目录下的默认主页显示文字稍作修改,方便显示。 在H2终端xterm上启动nginx的web服务,向H1提供web访问服务:

service nginx start

5.3 启动控制器,加载访问限制模块 在终端下,加载写好的访问限制模块access_limit.py,启动Ryu控制器

Ryu-manager  access_limit.py

从图中可以看到,Ryu正常启动,且成功加载access_limit访问限制模块,并且连接到mininet建立的网络topo。

6 结果分析

6.1 主机第一次正常访问服务器 在H1的xterm终端中输入firefox,打开浏览器,并在浏览器中地址栏输入服务器H2的IP 10.0.0.2,此时可以正常访问服务器,访问结果如图:

H1第一次访问页面结果

此时在终端下查看交换机流表,s1的流表项如图所示:

s1流表信息

可以看到,交换机s1的第二、三条流表项由控制器下发,用来转发H1与H2的web服务器数据。所以,当第一次主机用户H1访问H2服务器web时,访问交互的数据流得到了正常的转发,所以H1可以正常的访问到服务器的网页内容。 6.2 限制主机正常访问服务器 当主机第一次成功访问服务器后,控制器会下发限制主机和服务器之间通信的流表项,从而限制该PC 机一分钟内再次访问服务器。

此时在H1的终端xterm环境下打开firefox浏览器,输入服务器端和和H2的IP地址,进行web访问,网页会显示失败。此时终端下查看交换机s1中的流表项,如图:

s1流表信息

可以看到,控制器向s1流表中安装了第二、第三条流表项,用来限制H1访问H2的web服务器的交互数据,即当主机访问成功之后,控制器就会下发限制主机与服务器之间通信的流表项,并且限制时间限定在60s。在这期间,主机H1服务器H2之间的网页交互报文会被交换机丢弃,所以成功的限制了主机H1对于服务器H2的正常访问,从而达到了实验要求的目的。 6.3 限制过后,主机正常访问服务器 当限制时间60s过后,流表项超时删除,此时交换机中的流表项恢复到初始状态,只有一条默认流表项,如下图。此时,在H1的浏览器中再次访问H2的web服务器时候,则会网页访问正常,并且流表项中会有控制器新下发的流表项,如下第二张图。

通过以上实验验证和结果分析,我们完成了实验要求,即一台Web 服务器提供简单的静态网页访问,一台PC 机可以访问web服务器,然后限制该PC 机一定时间(比如一分钟)内再次访问服务器。限制时间过后,PC机可以再次成功访问web服务器。

二 代理访问

1 实验目的

根据实验题目要求建立相应拓扑,其中有1台web服务器,1台web代理服务器,2台主机。

1.Web服务器是Host1 和Host2 都可以访问的,而web代理服务器是只有代理用户才可以访问到。

2.可以设置Host1 或Host2 为代理用户,可以访问到代理服务器的网页,但是代理服务器相对用户主机透明。

2 实验设备

物理服务器1台,Ubuntu14.0.4系统(搭建mininet仿真环境、Ryu控制器和Nginx与Apache2的web服务,进行实验验证)

3 实验原理

1)本实验使用Mininet仿真网络拓扑环境,采用Ryu控制器,在Openflow1.3版本上开发代理访问模块,进行实验。 2)代理服务器针对用户透明,代理用户通过重定向可以访问到代理服务器。一般用户可以访问web服务器,但是不能重定向访问到代理服务器。

4 代码设计

4.1 核心代码流程图

代理访问模块的设计,主要通过双流表设计和重定向完成。Table0负责代理用户访问web的重定向,table1 负责基本的二层逻辑转发。此外,在Ryu启动阶段,会通过发送arp mac探测包主动学习服务器mac地址,并学习到与服务器直连的交换机。这样,可以实现无需知道mac和topo场景下的代理访问功能,具有较强的可扩展性与广泛适用性。 4.2 核心代码 在访问代理模块设计与分析的基础上,进行代码开发。核心代码主要分为三个部分1)mac自学习检测与代理服务器透明2)arp mac探测与学习 3)重定向流表构造与下发。

1 mac自学习检测与代理服务器透明

自学习与代理服务器透明

Ryu启动阶段,开启_rederect函数的进程,进入服务器mac自学习阶段,通过循环检测mac和服务器直连交换机是否已经学习到,没有学习到则调用arp mac探测包函数detect_mac进行mac探测学习,学习到则对服务器直连交换机下发禁止直接访问代理服务的流表项,保证代理服务对用户的透明性。

2 Arp mac探测与学习

arp mac探测与学习

这部分代码分为两个函数,detect_mac用来构造并发送arp mac探测报文,arp_respond_handler用来处理arp回复报文,对mac和服务器直连交换机进行学习。

3 重定向流表构造与下发。

重定向流表

重定向部分的代码主要完成了重定向流表项在s2的table 0上安装,对代理用户H1访问web server 80端口的数据包,把目的地址重定向到web proxy,对于来自web proxy数据包,重定向源地址为web server地址。此功能可以完成web proxy对于用户的完全透明,并且代理用户可以通过重定向访问到web proxy服务器。

5 实验步骤

实验主要分为三个步骤,1)安装Web服务器,2)并开启web服务和web代理服务,3)开启Ryu,加载代理访问模块 5.1 安装Web服务器,开启Mininet的网络环境 Web服务器安装:我们需要在web_server和web_proxy上分别提供web服务,因此分别使用Nginx服务器和Apache2 服务器。 1 安装Nginx服务器安装命令如下:

apt-get install nginx

为了访问nginx服务器时候显示web server字样,且白底黑字,我们默认的静态主页进行修改,并将文件放在/usr/share/nginx/www目录下,HTML代码如下:

nginx网页代码

2 安装Apache服务器命令如下:

apt-get install apache2

为了访问apache2服务器时候显示web proxy字样,且黑底白字,我们默认的静态主页进行修改,并将文件放在/var/www/目录下,HTML代码和nginx差不多,只需要改动相应代码即可。

此外,在mininet中建立题中topo,然后开启。

5.2 开启web服务和web代理服务 根据建立好的网络环境,我们用H1和H2作为web访问用户,H3作为web server服务器,开启nginx,提供web服务,H4作为web proxy服务器,开启apache2,提供web代理服务。

1 在H3中开启web server服务 我们用H3(10.0.0.3)虚拟机作为web server,因此在Mininet提示符下输入以下命令,打开H3终端xterm:

Mininet> Xterm H3

打开H3(10.0.0.3)终端后,采用ngnix服务器提供web server服务,修改其默认主页为web server字样提示,然后开启web server:

开启H3中web server服务

打开web server服务后,在H3本地打开firefox浏览器,进行web_server服务的网页测试:

H3中web测试

2 在H4中开启web proxy服务,如H3一样做同样测试,如下,不再赘述。

H4中web测试

5.3 开启Ryu,加载代理访问模块 1 在Ubuntu终端下启动Ryu控制器,加载proxy_access.py模块:

加载proxy_access模块

如上图所示,开启Ryu控制器后,通过打印的信息可以看到:控制器连接了三个交换机,并且采用mac探测方式主动获取mac,即发送arp探测报文,获得即将设为代理主机的H1(代理主机)、H4(web server)和H4(web proxy)三个关键主机的mac地址,并且通过自学习计算出与H3(web server)直连的交换机为s2,其dpid为2。因此,Ryu成功启动,代理访问模块成功加载。

2 Ryu启动后,在Mininet中查询三个交换机流表,如下图所示:

交换机流表信息

流表分析:图中显示三个交换机的流表,每个交换机有两个流表,在table 0中有一条跳转到table 1的流表项,table 1有一个miss entry流表项,此外,交换机2上,table 0 中安装了一条drop直接访问web proxy的流表项,防止主机通过web proxy的IP直接进行web访问。 访问代理采用双流表设计,table 0 负责代理业务,通过重定向完成,table 1负责正常的二层转发。但开始阶段,H1和H2都不是代理主机,这时候table 0流表中并没有负责重定向的流表项。 到此为止,完成了实验的基本步骤,下来进行实验结果测试和分析。

6 结果分析

本实验结果验证和分析通过四个阶段完成:

第一阶段,H1和H2都不是代理用户,都可以正常访问web serve,对此进行测试与结果分析。

第二阶段:H1成为代理用户,H2仍然不是代理用户,H1访问web server时候会重定向到web proxy,H2访问web server不做重定向,访问的真实服务器任然是web server服务器,对此进行测试与结构分析。

第三阶段:根据对题目要求的解读,并且结合实际,代理服务器web proxy应该对用户透明,因此会限制用户host直接访问web server,对此功能进行测试与结果分析。

第四阶段:除了了web 访问外,其他业务不受任何限制(例如互相Ping),进行测试。

6.1 H1和H2都非代理用户,web访问测试 在Mininet提示符下打开H1(10.0.0.1)虚拟机终端,在终端下打开firefox浏览器,输入web server的IP(10.0.0.3),进行web server访问,如下图。H2做同样访问测试即可,应该都可以对web服务器正常访问:

访问web server服务器

6.2 H2为代理用户,web访问测试 控制器设定一定时间后,把H2授权为代理用户,此时进行web访问测试。 1 打开在H1虚拟机终端,在终端中打开firefox浏览器,输入web server的IP(10.0.0.3),进行web server访问测试:

Figure 1-19 设置代理后H1访问web服务器

firefox浏览器输出web proxy字样,可以看到H1为授权代理用户后,访问web server(10.0.0.3)时候时会重定向到web proxy服务器(10.0.0.4)上,因此浏览器显示代理服务器制定的网页,达到了代理用户可以透明的访问代理服务器的目的。

2 此时,在Mininet中查看各个交换机流表:

Figure 1-20交换机流表信息

流表分析:除了三个交换机table1的二层转发流表项,控制器向交换机s2的table 0中安装了重定向流表项,会把代理用户H1(10.0.0.1)访问web server(10.0.0.3)的数据流的目的地址重定向到代理服务器web proxy(10.0.0.4),因此代理用户H1访问web server时,则显示web proxy的页面,重定向成功,达到代理用户可以访问代理服务器的目的,且代理服务器相对用户透明。

3 此时,H2并没有成为代理用户,在H2虚拟机终端下的midori浏览器中,输入web server的IP(10.0.0.3),进行web server访问测试:

Figure 1-21 H2访问web服务器

浏览器输出web server字样,可以看到H2任然是一般用户,没有代理授权,访问web server(10.0.0.3)的页面结果依然是web server的页面,并没有重定向到代理服务器web proxy。

因此,H1设置为代理用户,可以透明访问到web proxy代理服务器,而并不影响其他一般用户H2,H2访问的任然是web server服务器。

6.3 代理服务器相对用户透明,web访问测试 根据对题目要求的解读,并且结合实际,代理服务器相对用户透明,因此用户H1或是H2若直接对代理服务器web proxy进行web访问,访问的数据包会被丢弃,因此在H1和H2上分别进行测试:

1 在H1终端下,打开firefox浏览器,并且直接输入web proxy服务器H4的IP地址10.0.0.4,进行对web proxy直接访问测试:

访问代理服务器

可以看到,用户H1直接访问代理服务器web proxy,经过一定时间后会出现超时,H1直接访问web proxy失败。当然,在H2终端下做同样测试,访问代理服务器,会访问失败。

3 此时,在Mininet中查看各个交换机流表,主要对s2流表项进行分析:

Figure 1-24 s2流表信息

流表分析:可以看到,s2的table 0中的第四条流表项具有禁止用户直接访问web proxy的功能,是由控制器在启动阶段直接下发的。当H1和H2进行访问web proxy测试后,此流表项的数据包n_packets计数器和字节计数器n_bytes已经从0成为59和4366,表示成功匹配并且拦截了用户直接访问web proxy的数据包,达到代理服务器web proxy对用户透明和限制用户直接访问web proxy的目的。

2.7.4 其他业务不受影响的测试 访问代理模块的设计,在访问web业务上可以满足要求,但应该其他业务应该无约束和影响,比如用户之间互相Ping等,这里给出用户H1 ping 用户H2、用户H2 ping H3(web server)的测试:

Figure 1-25 互ping测试

结果显示各个主机之间互ping畅通,因此,设计访问代理功能模块可以保障其他业务正常使用。

2.7.5 实验总结 通过以上实验步骤和测试,本组设计的访问代理功能模块很好的完成了实验要求:

1)当用户H1和H2都为一般用户时,他们可以正常访问到web server

2)当用户被设置为授权代理用户,比如题中H1,H1访问web server时候,会对其web请求重定向到代理服务器web proxy,并成功返回web proxy页面结果,达到代理用户可以访问代理服务器的目的

3)实验设计web proxy对于用户透明,除了代理用户可以在访问web server时候重定向到web proxy外,会丢弃所有用户host 对web proxy的直接访问,达到代理服务器对用户透明的目标

4)代理模块对其他业务不受影响,可以保障其畅通,比如互ping。

原文发布于微信公众号 - SDNLAB(SDNLAB)

原文发表时间:2015-12-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏零基础使用Django2.0.1打造在线教育网站

socket模拟发送http请求

嗨,小伙伴们,好久不见~~~,最近博主在研究socket编程,觉得socket真的好强大。之前一直我们都是在介绍爬虫的requests、urllib等库,我们知...

8172
来自专栏开源优测

渗透测试 - kali Linux

渗透测试操作系统 - kali 什么是kali Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。 由Offensive S...

5264
来自专栏用户2442861的专栏

Nginx初探

http://blog.csdn.net/xlgen157387/article/details/49781487

1343
来自专栏极客慕白的成长之路

HTTP协议原理及实践

HTTP是在应用层,基于传输层 0x1 低三层 物理层主要作用是定义物理设备如何传输数据 数据链路层在通信的实体间建立数据链路连接 网络层为数据在结...

1283
来自专栏Python中文社区

Python开源项目介绍:用zmail简单地发邮件

发送邮件是个很简单的需求,但是在实际的使用中依然碰到了很多坑,因此创建了zmail这个项目,让你使用python发送邮件的过程尽可能简单。

1493
来自专栏猛牛哥的博客

centos安装aria2

2.2K3
来自专栏超然的博客

web攻击

  最常见和基本的攻击WEB网站的方法。攻击者在网页上发布包含攻击性代码的数据。当浏览者看到此网页时,特定的脚本就会以浏览者用户的身份和权限来执行。通过XSS可...

1401
来自专栏桥路_大数据

Gradle打包问题Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0

2.1K4
来自专栏精讲JAVA

RESTful API 最佳实践(阮一峰)

它的大原则容易把握,但是细节不容易做对。本文总结 RESTful 的设计细节,介绍如何设计出易于理解和使用的 API。

1894
来自专栏SDNLAB

怎样配置开发环境来调试SDN应用程序

“工欲善其事,必先利其器”。我们在基于某一个控制器开发SDN应用程序的时候,常常会遇到这样的问题,怎样去调试一个应用程序。 ? 相信大家第一个程序开发是基于集成...

36912

扫码关注云+社区

领取腾讯云代金券