1.实验目的
- 理解Floodlight控制器的基本操作;
- 理解Firewall REST防火墙的原理;
- 掌握在实验平台搭建简单的SDN实验环境;
2.实验原理
SDN创新实验平台使用Foodlight控制器,使用Foodlight REST API作为其特性开发应用的接口,通过RESI API给控制器添加规则,从而控制交换机的转发机制。
3.实验任务
本实验通过使用Firewall REST防火墙模块,在控制器中加入规则,从而对虚网中的交换机进行控制,完成可以互ping,互相ssh;不能互ping;只能单向ssh等实验任务。
4.实验步骤
4.1搭建环境
步骤1.创建虚网。
1.在首页单击“创建虚网”。
1.单击导航栏中的“虚网”>“创建虚网”,或直接在首页单击“+”创建虚网。虚网名称以“Slice1”为例,虚网名称只能包括数字,字母和下划线。
2.单击“下一步”选择网络拓扑。
如果要创建虚拟机,则必须要选择一个计算存储服务器,双击选中设备。
3.单击“下一步”确认虚网清单。
4.单击“创建”成功创建虚网。
5.单击虚网名称链接进入“虚网详情”页面。
步骤2.添加控制器。
1.在“虚网详情”页面单击控制器部分的“”按钮,请根据实际情况选择要添加的控制器。
2.单击“下一步”选择控制器配置。
3.单击“创建”。
步骤3.在“虚网详情”页面单击网关部分的“”按钮添加网关。
步骤4.创建虚拟机VM1。
1.在“虚网详情”页面虚拟机部分单击“+”创建虚拟机。
2.单击“下一步”,选择镜像。
镜像选择Ubuntu-Desktop,这是带图形化界面的桌面版Ubuntu,方便我们访问网站。
3.单击“下一步”,选择配置。
4.单击“下一步”确认填写基本信息。
5.单击“创建”。
步骤5.请参照创建VM1的步骤创建VM2,虚拟机镜像与配置同VM1。
步骤6.单击“虚网详情”页面右上角的“”按钮启动虚网。
虚网启动后,控制器也会启动成功。
步骤7.在“虚网详情”页面单击“网关”部分的“”按钮启动网关。
步骤8.选择创建好的两台虚拟机,单击“”启动。
4.2实验配置
请分别登录虚拟机VM1(10.0.0.116)和VM2(10.0.0.117),IP地址可以使用ifconfig命令查看,请根据界面提示输入登录密码,例如123456。
为了进行后续的实验,需要进行实验环境检查。
步骤1.打开terminal。如果是以普通用户登录,则需要切换到root用户,如果不知道root用户密码,需要执行下面的步骤修改root密码。
步骤2.步骤2.执行以下命令修改root密码。
1 |
sudo passwd root |
1.请根据界面提示输入当前用户的密码,例如123456
2.请根据界面提示输入新的root密码,例如123
3.请根据界面提示再次输入新的root密码
步骤3.执行su命令根据提示输入root密码切换到root用户。
步骤4.在VM1和VM2上分别执行以下命令启动wireshark检查是否安装。
1 |
Wireshark & |
步骤5.如果没有安装则执行以下命令安装wireshark,如果已经安装则跳过该步骤。
1 |
apt-get install wireshark |
安装完成后再执行Wireshark &命令验证安装。
Wireshark使用方法如下:
1.单击过滤器filter。
2.在filter string中填入 icmp or tcp or ssh。
3.单击菜单栏Capture>interface,选择eth0 start。
注意
为了每次可以清楚看到wireshark抓包信息,实验结果不相互影响,在每个实验结束后restart,重置抓包状态。
步骤9.安装和启动ssh服务器端服务。
虚拟机默认会打开ssh客户端,若要被作为ssh的服务端,需要下载并且启动ssh服务端,相关命令如下:
安装命令:
1 |
apt-get install openssh-server |
启动命令:
1 |
service ssh start |
两台虚拟机都完成上述操作步骤后,可以尝试ssh操作,并且查看wireshark,保证准备工作完成。
4.3实验验证
4.3.1验证关闭防火墙可以互相ping和ssh
默认情况下防火墙处于关闭状态,虚拟机之间可以互相ping和互相ssh。
具体操作如下:
步骤1.查看防火墙状态。
1.登录控制器的虚拟机,如图:
2.在控制器虚拟机中执行以下命令查看防火墙状态:
1 |
curl http://localhost:8080/wm/firewall/module/status/json |
默认情况下防火墙关闭,如果发现状态为enable则执行以下命令关闭防火墙,确认防火墙状态是关闭状态disable。
步骤10.在防火墙关闭状态下互相ping,请在ping之前启动VM1的wireshark开始抓包。
1.在10.0.0.116虚拟机中输入如下命令:
1 |
ping –c 3 10.0.0.117 |
输出内容如下:
10.0.0.116中Wireshark中输出如下,请保证wireshark处于开启状态下:
可以ping通,并且在wireshark中可以看到三对ICMP信息(request和reply)。
步骤11.验证互相ssh。
1.在10.0.0.116中输入以下命令:
1 |
ssh 10.0.0.117 |
界面提示要求输入10.0.0.117用户密码,则表示ssh成功
10.0.0.116中wireshark中输出结果如下,可以看到经过三次握手后进入ssh通信阶段。
对于10.0.0.117ping或是ssh 10.0.0.116的实验操作与上面类似,不再赘述,结果是可以ping通,并且可以ssh成功。
4.3.2加入规则后互ping
本段实验内容主要目的如下:
- 开启防火墙后,不能ping通或是ssh。
- 加入一定规则后互ping,根据wireshark信息,了解控制器和交换机根据规则对数据包的处理机制。
实验操作步骤如下所示:
步骤1.开启防火墙。
远程登录控制器,在控制器虚拟机中输入以下命令:
1 |
curl http://localhost:8080/wm/firewall/module/enable/json |
输出结果如下:
防火墙打开后,此时不能进行ping或是ssh等操作。
步骤2.在VM1中ping VM2或通过ssh登录VM2。
1 2 |
ssh 10.0.0.117 ping 10.0.0.117 |
步骤3.登录控制器添加规则。
注意
由于系统会为每个虚拟机自动创建一个OVS交换机,因此,需要登录控制器将拓扑上的所有交换机添加ALLOW规则才能保证恢复通信,此处有三个交换机。
1.获取DPID。
此处获取交换机DPID有两种方式:
- 直接在“虚网详情”页面“虚拟交换机”部分查看DPID。
- 登录控制器虚拟机,此处以floodight控制器为例,在floodight/example目录下执行./cli.py switch命令查询交换机dpid,通过shift+pageup键可以向上翻阅命令行:
1 |
/cli.py switch |
在输出结果中寻找dpid号如下:
2.添加控制器规则,此处为00:ff:01:00:00:00:00:05为例进行操作,此处需要对三个交换机都添加控制器规则。
1 |
curl -X POST –d ‘{“switchid”: “00:ff:01:00:00:00:00:00:05”}’ http://localhost:8080/wm/firewall/rules/json |
添加成功后会输出添加成功的提示。此时则在防火墙开启状态下,允许通过交换机的所有数据,比如互ping或互相ssh等。
步骤4.在主机IP:10.0.0.116和10.0.0.117之间增加一条如下ALLOW规则。
规则是对于源ip为10.0.0.116且协议为ICMP的包进行拒绝转发。
1 |
curl -X POST –d ‘{“src-ip”: “10.0.0.116/32”, “dst-ip”: “10.0.0.117/32”, “nw-proto”:”ICMP”, “action”: ”DENY” }’ http://localhost:8080/wm/firewall/rules/json |
步骤5.执行10.0.0.116 ping 10.0.0.117,在wireshark中查看结果。
10.0.0.116虚拟机上的wireshark显示如下:
10.0.0.117虚拟机wireshark无ICMP流信息,在此就不截图显示。
原理解释:
由于规则是对于源ip为10.0.0.116且协议为ICMP的包进行拒绝转发。其中ping使用的协议正是ICMP,对于从ip为10.0.0.116发出的ping数据包则会丢弃,拒绝转发,则ip为10.0.0.117的虚拟机则接收不到request包,因此也不会有reply包的回应。因此ip为10.0.0.116虚拟机的wireshark只能监听到发出request的数据包,10.0.0.117虚拟机wireshark监听不到来自10.0.0.116的ICMP协议数据包
步骤6:执行10.0.0.117 ping10.0.0.116命令,查看抓包结果:
1 |
10.0.0.117 ping10.0.0.116 |
10.0.0.117 虚拟机的wireshark显示如下:
10.0.0.116虚拟机wireshark显示如下:
原理解释:
根据设定的规则,交换机会丢弃来自10.0.0.116的ICMP协议的数据包。则当10.0.0.117ping10.0.0.116时,10.0.0.117发出request数据包,此时交换机进行转发,10.0.0.116接收到request数据包会立即回应reply数据包,由于此数据包是来自10.0.0.116的ICMP数据包,交换机会拒绝转发,则10.0.0.116不会接收到reply数据包,则ping不成功。
4.3.3加入规则后,可以单向ssh
通过在控制器中加入规则,交换机会对来自一端虚拟机的端口22的数据包进行丢弃,因此只能单向ssh。
步骤1.登录控制器添加如下规则,禁止来自10.0.0.116且端口号为22的数据包。
步骤2.登录VM1和VM2,切换到root用户,启动wireshark开始抓包。
步骤3.在虚拟机VM1(10.0.0.116)上执行ssh 10.0.0.117。
1 |
ssh 10.0.0.117 |
界面提示输入10.0.0.117密码,表示ssh成功。
虚拟机10.0.0.116的wireshark显示如下:
在虚拟机10.0.0.117上的wireshark显示与10.0.0.116相同。
从上图中可以得出,前三条数据包表示三次握手成功,之后就是ssh通信的数据包,10.0.0.116 ssh 10.0.0.117成功。
步骤4.虚拟机VM2(10.0.0.117上)ssh VM1。
1 |
ssh 10.0.0.116 |
显示连接失败提示,表示10.0.0.117 ssh 10.0.0.116失败。
10.0.0.117虚拟机的wireshark显示如下:
10.0.0.116虚拟机的wireshark显示如下:
可以看到10.0.0.117一直处于TCP三次握手的第一个阶段,即发出SYN包等待请求,而10.0.0.116收到SYN包后,回复[SYN,ACK]包,但是由于这是来自10.0.0.116的源端口号为22的数据包,根据添加的规则,则被交换机丢弃,因此10.0.0.117一直处于发送SYN数据包等待回复的状态,因此,10.0.0.117无法ssh 10.0.0.116。
5 实验结论
通过开启防火墙后,向控制器中加入相应规则,可以控制交换机的转发机制。删除规则见附录,更多的实验请参考:http://docs.projectfloodlight.org/display/floodlightcontroller/Firewall+REST+API
6 附录
6.1删除规则
步骤1.查看已添加的规则。
1 |
curl http://localhost:8080/wm/firewall/module/storageRules/json |
步骤2.寻找ruleid值,用以下命令删除对应这条的规则。
1 |
curl –X DELETE –d ‘{“ruleid”: “1618819403”}’ http://localhost:8080/wm/firewall/module/rules/json |
6.2常见问题
关于控制器的控制台界面中输入问题请大家注意,目前发现输入符号’与”的时候并不会显示,而是需要输入下一个字符才会一起显示,当输入命令过长需要换行的时候在首行末尾可能卡顿。
关于控制器输入规则后显示添加成功但是并没有实现的原因是控制器内部的延迟问题,请稍后一段时间再试。
由于系统资源有限,为了维护实验平台的稳定,请大家在做实验中创建虚拟机时根据实际需要选择配置。
请输入评论内容