暑期实训的第二个项目,虽然没有在线上平台测试,但是在本地测试,应该可以满足要求(๑•̀ㅂ•́)و✧

0x01 项目背景简介

言简意赅:实现防火墙的功能。如上图所示:

Server上开启视频服务,端口为8080

H1上开启Web服务,端口为80

**要求:**实现H2正常访问Server和H1的服务,H1无法访问Server的视频服务,但能SSH连接Server。

**分析:**看似问题复杂,其实问题很明确,给SW1下发流表,丢弃H1访问Serve视频服务的数据包。

**注释:**我和Steve·Curcy观点相同,需要丢弃的数据包仅需三元组就可以唯一确定,(source-ip,destination-ip,destination-port),至于不用source-port的原因是,在更加复杂的网络中,若还是匹配source-port,会导致H1无法访问其他服务器8080端口的服务,这是不符合一般逻辑的。

0x02 Web应用预期

主界面:

流表下发:

![image-20200709213325267](/Users/lowbee/Library/Application Support/typora-user-images/image-20200709213325267.png)

0x03 开发过程

​ 类防火墙比负载均衡要困难的多,一个人无法两三天内完成,特别是类防火墙需要设计web前端应用,因此还需要了解Django的web服务搭建,这次和Steve·Curcy分工明确,他负责前端的设计(js,html,css全是他写的,有个大佬带就是爽(~ ̄▽ ̄)~),而我负责后台的搬砖工作(~ ̄▽ ̄)~、顺便总体测试一下。

这两天的主要工作:

index.html

index.js

index.css

views.py

myodl.py

由于还未征求他人同意,源码就先不放了,后期再议。

以下是topo代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from mininet.net import Mininet
from mininet.cli import CLI
from mininet.node import RemoteController,Controller
from mininet.log import info
import sys

if len(sys.argv) == 1:
controller_ip = '127.0.0.1'
else:
controller_ip = sys.argv[1]

# net = Mininet(controller=Controller)
# controller=net.addController('c0',ip='127.0.0.1',port=6653)
net = Mininet(controller=RemoteController)
odl_controller=net.addController('ODL_controller',ip=controller_ip,port=6653)
print(controller_ip)
print("*** Add Switch\n")
s1=net.addSwitch('s1')
print("*** Add Hosts\n")
h1=net.addHost('h1')
h2=net.addHost('h2')
print("*** Addd Servers\n")
server = net.addHost('server')

net.addLink(s1,server)
net.addLink(s1,h1)
net.addLink(s1,h2)


server.setIP('10.0.0.1',24)
h1.setIP('10.0.0.2',24)
h2.setIP('10.0.0.3',24)

net.start()

CLI(net)

0x04 作品展示

目前实现的功能:

1.自动获取switch_id

2.下发/删除流表

3.自动查询当前流表

4.批量删除流表

5.远程连接交换机(理论上可以)

6.拓扑的管理(实在是有点难)

6.广告位ヾ(=・ω・=)o

下发流表前,先看下交换机当前的流表,以下流表是交换机能实现拓扑内通讯的基本流表。

页面流表展示:

查询后台流表:

流表删除:

查询后台流表: