目录
- 项目简介
- 泛洪攻击基本知识
- 泛洪简介
- 攻击原理
- 危害
- DoS攻击方式的防范手段
- mininet基本知识(常用命令及示例)
- Mininet简介
- Mininet用处
- Mininet命令
- mn网络构建使用参数介绍
- 内部交互式命令介绍及使用
- 其他操作
- sFlow基本知识
- sFlow简介
- sFlow原理
- sFlow与防火墙和IDS相比
- sFlow的采样报文格式
- sFlow的十大优势
- sFlow应用
- ryu控制器基本知识
- 先了解什么是SDN
- ryu是什么
- 安装ryu
- Ryu的源码目录
- 使用ryu
- 实验步骤
- 拓扑结构
- 搭建过程
- 启动控制器
- 创建网络拓扑
- 安装sFlow-RT
- 配置sFlow Agent
- 模拟洪泛攻击
- 下发流表
- 观察现象
- 配置自动防御
- 遇到的问题
- 端口
- 模块
- import不了
- 权限
- mn 评不通
- 不能减少流量
项目简介
在给定的实验网络环境中,利用攻击主机向靶机发起模拟流量洪泛攻击,利用SDN控制器完成流表下发与流量控制,实现对洪泛攻击的拦截与防御
泛洪攻击基本知识
泛洪简介
泛洪就是攻击者发送大量的数据流量,通过泛洪攻击,使得被攻击者的资源耗尽,无法为正常用户提供服务。
攻击原理
在网络中两台电脑建立TCP连接时需要进行三次握手过程,客户端首先向服务器发关TCP SYN数据包,接着服务器会向客户端发关相应的SYN ACK数据包,最后客户端会以ACK进行响应.从而建立正常的握手过程.在具体的连接细节中,服务器最早接受到SYN包时,在TCP协议栈中会将相应的半 连接记录添加到队列中,之后等待接受下面准备握手的数据包,如果握手成功,那么这个半连接记录将从队列中删除.或者当服务器未收到客户端的确认包时,会重 发请求包,一直到超时才将此条目从未连接队列删除.但是,在服务器中的TCP协议栈中存储的半连接记录是有限的,当服务器受到SYN型的DOS攻击后,队列会很快处于充满状态,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢严重者引起网络堵塞甚至系统瘫痪,服务器随后就不再接受新的网络连接,从而造成正常的客户端无法访问服务器的情况发生.
危害
SYN攻击除了能影响主机外,还可以危害路由器,防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施.
DoS攻击方式的防范手段
- syn cookie
- 封禁IP
- 过滤可疑的IP直址
- 减小超时值
- 增大队列SYN最大半连接数
关于泛洪攻击,你需要知道的一切
mininet基本知识(常用命令及示例)
Mininet简介
Mininet是由斯坦福大学基于Linux Container架构开发的一个进程虚拟化网络仿真工具,可以创建一个包含主机,交换机,控制器和链路的虚拟网络,其交换机支持OpenFlow,具备高度灵活的自定义软件定义网络。
Mininet用处
- 为OpenFlow应用程序提供一个简单,便宜的网络测试平台;
- 启用复杂的拓扑测试,无需连接物理网络;
- 具备拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试;
- 支持任意自定义拓扑,主机数可达4096,并包括一组基本的参数化拓扑;
- 提供用户网络创建和实验的可拓展Python API。
Mininet命令
Mininet命令共分为网络构建启动参数、内部交互命令、外部运行参数三部分。
- 网络构建启动参数:–topo,–custom,–switch,–controller,–mac等等。
- 内部交互命令:dump,net,nodes,links,dpctl,iperf等等。
- 外部运行参数:-c(清除配置信息),-h(帮助)等。
mn网络构建使用参数介绍
–topo:定义拓扑结构
minimal最小化拓扑(一个交换机,两个主机)
sudo mn --protocol=openflow13
single 单一拓扑(整个网络拓扑中只有一个交换机,其可以下挂一个或者多个主机)
sudo mn --topo=single,5
liner 线性拓扑(交换机呈线性排列,存在多个交换机,且每一个交换机下挂主机数目相同)
sudo mn --topo=linear,3
sudo mn --topo=linear,3,2
tree 树形拓扑(交换机的连接呈树形排列,且每个交换机可以下挂多个交换机,多个主机)
sudo mn --topo=tree,3,2
sudo mn --topo=tree,depth3=,fanout=2【三层,第一层一个交换机,第二层2个交换机,第三层4个交换,主机:4 x 2 = 8】
depth表示交换机有多少层,fanout表示所有的交换机作为父节点,有多少个子树。
reversed反向拓扑(这种拓扑类型与single单一拓扑类型相同)
sudo mn --topo=reversed,4
–switch:定义mininet要使用的交换机
交换机分类3类:用户型、内核型和OVS型,其中内核型和OVS型的吞吐量比用户性大很多,因此一般采用后两种。可以测试三者的TCP bandwidth(区别UDP bandwidth):
主要参数如下:
a. lxbr:内核态交换机。
b. user:用户态交换机。
c. ovsk:OpenVSwitch交换机,默认使用此值。
d. ovsbr:OpenVSwitch交换机。
e. ivs:OpenVSwitch交换机。
sudo mn --test iperf
sudo mn --switch user --test iperf
sudo mn --switch ovsk --test iperf
–controller:定义要使用的控制器
如果没有指定则使用mininet中默认的控制器。
sudo mn --controller=remote,--ip=[controller ip],--port=[port]
//不指定拓扑--默认是一个交换机下面挂两个主机
//--controller=remote 是将mininet的控制器指向远端控制器 未指定ip,默认0.0.0.0或者本地IP 端口默认是在6635
–mac:自动配置设备的MAC地址
让MAC地址易读,即设置交换机的MAC,主机MAC及IP地址从小到大排序,且设置简单唯一,不仅让机器容易获取,也容易让肉眼很容易识别其ID。使用方法如下:
sudo mn --topo=tree,depth=2,fanout=2,--mac
-x(XTerm)
通过使用-x参数,mn在启动后会在每个节点上自动打开一个XTerm,方便某些情况下的对多个节点分别进行操作。命令为
sudo mn -x
在进入mn cli之后,也可以使用 node xterm 命令指定启动某些节点上的xterm
h1 xterm
内部交互式命令介绍及使用
使用mn默认创建网络后,可以使用一系列命令查看并验证网络系统的链路健壮性。
(1)iperf:两节点间进行iperftcp带宽测试。
iperf h1 h2
(2)iperfudp:两节点间进行iperfudp带宽测试。
iperfudp bw h1 h2
(3)link:禁用或开始节点间链路。
link s1 s2 up
link s1 s2 down
(4)dpctl:所有交换机上增删改查流表。
dpctl dump-flows
(5)xterm:节点开启xterm进入可视化操作界面。
xterm h1
(6)py:执行python表达式。
py help(s1)
py dir(s1)
py net.addSwitch("h3")
py net.addLink(s1,net.get("h3"))
py s1.attach("s1-eth3")
py net.get("h3").cmd("ifconfig h3-eth0 10.3")
pingall
(6)sh:执行ovs系统的指令
sh ovs-vsctl show
常用命令总结
help: 默认列出所有命令文档,后面加命令名将介绍该命令用法 dump打印节点信息
gterm: 给定节点上开启gnome-terminal。注:可能导致mn崩溃 xterm给定节点上开启xterm
intfs:列出所有的网络接口
iperf:两个节点之间进行简单的iperf TCP测试
iperfudp:两个节点之间用制定带宽udp进行测试
net:显示网络链接情况
noecho:运行交互式窗口,关闭回应(echoing)
pingpair:在前两个主机之间互ping测试
source:从外部文件中读入命令
dpctl:在所有交换机上用dptcl执行相关命令,本地为tcp 127.0.0.1:6634
dump:查看节点信息。
link:禁用或启用两个节点之间的链路
links :检测链路是否正常工作。
nodes:列出所有的节点信息
pingall:所有host节点之间互ping
py:执行python表达式
sh:运行外部shell命令
quit/exit:退出
其他操作
(1)执行sudo mn -c会进行清理配置操作,适合故障后恢复。
(2)执行exit会退出Mininet的cli,同时给出运行时间统计。
(3)py cmd 使用python来执行cmd。
(4)测试Mininet启动后立刻关闭的时间可以用 sudo mn --test none。
Mininet教程(三):Mininet命令操作
sFlow基本知识
sFlow简介
sFlow 是由InMon、HP 和FoundryNetworks 于2001 年联合开发的一种网络监测技术,它采用数据流随机采样技术,可提供完整的第二层到第四层,甚至全网络范围内的流量信息,可以适应超大网络流量(如大于10Gbit/s)环境下的流量分析,让用户详细、实时地分析网络传输流的性能、趋势和存在的问题。
sFlow原理
sFlow Agent是sFlow的客户端设备,在一个典型的部署sFlow的网络中,一般是内嵌于网络转发设备中(比如交换机和路由器),负责收集设备上的流量转发情况并实时发送给sFlow Collector以供分析使用。
术语 | 解释 |
---|---|
sFlow Agent | 内嵌于网络设备中,在sFlow系统中收集流量统计数据发送到Collector端供分析。 |
sFlow Collector | 通常由专门服务器充当,在sFlow系统中收集各Agent的采样数据并以图标或报表的形式加以汇总。 |
sFlow与防火墙和IDS相比
在现代网络中的千兆、几千兆和万兆以太网链路,使防火墙和IDS越来越难以承担监视和控制流量的任务。将防火墙和IDS放置在关键网络(如服务器群组和拥有大量知识资产的部门)的入口点,有可能将会出现多种问题。
像检查点的增加势必引起性能下降。镜像端口不能转发几千兆上行链路的所有流量,适应千兆速度的防火墙和IDS系统非常昂贵,捕获数据的集中管理和观察非常耗费资源,没有足够的IT资源来安装所有防火墙和IDS系统,并维护和执行所要求的操作等。以及在大流量攻击面前,依赖镜像端口或旁路器的传统安全部件会不堪负荷——削减了总体效能。
虽然sFlow并不是一项对所有转发数据包进行安全分析的完全“镜像端口”或“网络旁路”技术,但是它可以提供适合安全监视和策略执行的大量信息。sFlow的优势在于能够对安全采集器提供的实时采样数据进行分析,从而提供整个网络的连续监视能力。
通过网络设备ASIC芯片实现数据收集技术,即使是网络在受到大量拒绝服务攻击时也不会影响性能。在遭到拒绝服务攻击时,恶意流量急剧增加,而被采样的数据包也将与恶意流量成比例地增加,这样可以快速判断出攻击行为,从而保障采集器不会因攻击数据包的增加而过载。
采样数据可以用于创建比较流量的正常使用基准。这些基准可用于显示出使用端口映射、使用ping和端口扫描进行探测的侦察行为;显示出消耗计算机资源或网络带宽,以阻止主机通信的拒绝服务攻击,如采用ICMP的Smurf攻击或SYN flood攻击;显示出采用重复登录或TCP劫持,对网络上的主机造成威胁的行为;显示出以不正确的方式使用系统的错误使用行为,以及使用企业策略禁止的服务和应用。
sFlow的采样报文格式
sFlow报文采用UDP封装,缺省目的端口号为知名端口6343。sFlow报文共有4种报文头格式,分别为Flow sample、Expanded Flow sample、Counter sample、Expanded Counter sample。其中Expanded Flow sample和Expanded Counter sample是sFlow version5新增内容,是Flow sample和Counter sample的扩展,但不前向兼容。所有的Extended的采样内容必须使用Expanded采样报文头封装。
上图是sFlow报文格式
sFlow Agent提供了两种采样方式供用户从不同的角度分析网络流量状况,分别为Flow采样以及Counter采样。
采样方式 | 解释 |
---|---|
Flow | Flow采样是sFlow Agent设备在指定端口上按照特定的采样方向和采样比对报文进行采样分析,并将分析的结果通过sFlow报文发送到Collector设备的过程。 |
Counter | Counter采样是sFlow Agent设备周期性的获取接口上的流量统计,并将这些统计信息通过sFlow报文发送给Collector设备的过程。 |
sFlow的十大优势
sFlow与以往的RMON、RMON II和NetFlow网络监视技术相比较,sFlow的主要优势在于:
◆ 更低的全网络监视成本——无需购买任何探针;
◆ 具有实时分析能力的永远在线技术;
◆ 嵌入到ASIC中的强劲技术;
◆ 可看到设备或端口配置的全网络视图;
◆ 用户可自行配置的采样速率;
◆ 对设备性能没有影响;
◆ 对网络带宽的影响很小;
◆ 完整的数据包头信息;
◆ 完整的第二~七层详细信息;
◆ 支持多种协议(IP、MAC、Appletalk、IPX、BGP等)。
SFlow技术对安全隐患的判断
sFlow在发现流量出现以下情况时,就会怀疑有可能出现的安全问题。
◆ 判断出拥有可疑流量的超级带宽占用者;
◆ 发现与使用新的服务或应用相关的传输流量模式的变化;
◆ 对话双方不正常或与外部主机有过多的通信行为;
◆ 识别出不常使用的协议;
◆ 一个主机试图使用大量服务端口连接大范围的地址;
◆ 到某个主机的流量,在很短的时间内异常增大;
◆ 某个主机发出异常数量的登录流量;
◆ 通过对外部主机的监视,发现异常传输流量或使用的服务类型端口异常;
◆ sFlow除发送所有的传统数据包头和协议信息外,还发送物理传输信息,如交换机/端口接口信息、RMON统计信息和部分数据包有效载荷来进行监视。这样,使用sFlow实现网络安全的可能性就明显增加,而与安全相关的应用,如全企业IDS、应用识别和流量监视,就会成为可能。
sFlow应用
sFlow系统包含一个嵌入在设备中的sFlow Agent和远端的sFlow Collector。其中,sFlow Agent用于获取本设备上的接口统计信息和数据信息,将信息封装成sFlow报文,当sFlow报文缓冲区满或是在sFlow报文缓存时间(缓存时间为1秒)超时后,sFlow Agent会将sFlow报文发送到指定的sFlow Collector。sFlow Collector对sFlow报文进行分析,并显示分析结果。
https://blog.csdn.net/wuming5454/article/details/51527082
https://blog.csdn.net/a3192048/article/details/86475878
ryu控制器基本知识
先了解什么是SDN
软件定义网络(Software Defined Network,SDN)是由美国斯坦福大学Clean-Slate课题研究组提出的一种新型网络创新架构,是网络虚拟化的一种实现方式,可通过软件编程的形式定义和控制网络。其核心技术OpenFlow通过将网络设备的控制面与数据面分离开来,从而实现了网络流量的灵活控制,使网络作为管道变得更加智能,为核心网络及应用的创新提供了良好的平台。
ryu是什么
Ryu是一个基于组件的软件定义网络框架
Ryu为软件组件提供了定义良好的API,使开发人员能够轻松地创建新的网络管理和控制应用程序。
支持管理网络设备的多种协议
Ryu是使用Python开发的
官方文档
安装ryu
https://www.cnblogs.com/ssyfj/p/11730362.html
Ryu的源码目录
1、 base
base中有一个非常重要的文件:app_manager.py,其作用是RYU应用的管理中心。用于加载RYU应用程序,接受从APP发送过来的信息,同时也完成消息的路由。
其主要的函数有app注册、注销、查找、并定义了RYUAPP基类,定义了RYUAPP的基本属性。包含name, threads, events, event_handlers和observers等成员,以及对应的许多基本函数。如:start(), stop()等。
Ryu APP其实就是用Ryu控制器编写的应用代码,我们在Ryu框架的基础上进行开发,注意这里APP与应用平面不同,我们现在讨论的都是控制平面。
2、controller:
实现控制器和交换机之间的连接和事件处理。
3、lib:
实现了网络的基本协议以及基本的数据结构。
ofctl_v1_3.py中的代码有匹配的函数,可对照之前OpenFlow介绍中显示的匹配域:
4、ofproto:
这里有两类文件,一类是协议的数据结构定义,另外一类是协议的解析,即处理的函数。
如ofproto_v1_3.py是1.3版本的OpenFlow协议数据结构的定义,而ofproto_v1_3_parser.py则定义了1.3版本的协议编码和解码。
5、topology:
这里定义了交换机的数据结构和一些event。
可以看到这里的Switches class将交换机基本的内容已经定义好了:
6、contrib:
存放了开源社区贡献者的代码。
7、cmd:
为控制器的执行创建环境,执行命令行的命令。
使用ryu
开启控制器,使用二层交换
~/ryu/ryu/app$ ryu-manager simple_switch.py
实验步骤
拓扑结构
搭建过程
启动控制器
启动第一个主机远程shell(“命令行”),进入/opt/ryu/ryu/app/目录,使用ryu-manager命令启动ryu控制器,并且加载ofctl_rest.py和simple_switch.py两个app(由于要使用ryu的北向接口,所以必须加载ofctl_rest.py);
ofctl_rest.py是开启控制器的北向接口,simple_switch_13.py作为自学习交换机。
nohup ryu-manager --verbose ofctl_rest.py simple_switch.py > /home/ryu.log 2>&1 &
使用nohup指令将ryu进程置于后台运行,输出信息重定向至/home目录下的ryu.log文件;如过希望了解ryu控制器的工作细节可以查看该文件内容。如需关闭该进程,则需要执行ps -aux |grep ryu-manager命令获取进程id,进一步执行kill -9 进程id即可
创建网络拓扑
启动第二个主机shell(“命令行1”),使用mn命令,创建三个节点的星形网络,IP地址为10.0.0.1-10.0.0.3,设定ovs的controller为控制器主机地址;
mn --controller=remote,ip=10.0.0.1-10.0.0.3,port=6653,protocols=OpenFlow13 --top single,3
执行pingall命令可以测试网络连通性;
使用net命令查看模拟主机连接的ovs接口名称;
使用dump命令查看网络结构
安装sFlow-RT
启动第三个主机shell(“命令行2”),使用如下代码安装java环境,并启动sFlow-rt的controller。
# 安装java环境
apt-get update
apt-get install default-jre
# wget https://inmon.com/products/sFlow-RT/sflow-rt.tar.gz
# 实验环境已将包下载好,放在/opt/目录
tar -xvzf sflow-rt.tar.gz
./sflow-rt/get-app.sh sflow-rt flow-trend
./sflow-rt/get-app.sh sflow-rt browse-metrics
nohup ./sflow-rt/start.sh -Dhttp.port=8081 &
nohup命令将进程脱离shell放置在后台运行,如需关闭该sflow进程,则需要执行ps -aux |grep sflow命令获取进程id,进一步执行kill -9 进程id即可。
配置sFlow Agent
在主机shell(“命令行2”)中,配置sFlow Agent,对mn创建的虚拟交换机流量进行采样。
由于OVS虚拟交换机支持sFlow Agent功能,使用ovs-vsctl命令完成Agent配置:
ovs-vsctl -- --id=@sflow create sflow agent=s1 target=\"127.0.0.1:6343\" header=128 sampling=10 polling=1 -- set bridge s1 sflow=@sflow
agent:监控交换机某个接口的流量;
target:sFlow-RT的IP,默认端口6343;
bridge:需要开启sFlow的网桥;
sampling:采样率,表示每隔N个Packet就取样一次
polling:轮询时间,每隔N秒polling一次轮询
备注:在实际中,上述命令执行的次数和需要开启sFlow的网桥的数目有关,有几个网桥,就需要执行几次此命令,此处仅一个网桥,故只需要针对s1网桥配置一次Agent
查看已配置的sFlow Agent使用如下命令:
ovs-vsctl list sflow
配置完成后,访问主机8008端口(映射端口需根据每次生成的容器动态提供),查看负载情况
模拟洪泛攻击
在发起模拟攻击之前,需在shell"命令行2"中,启动/data/workspace/myshixun/SDN-security目录下的bps_record.py脚本,定时轮询sFlow采集到的数据吞吐量(该脚本设置记录时间长度为10分钟,所以请务必在十分钟内完成下述各过程)
进入"命令行1",在mininet终端中,执行h1 ping h3操作,查看流量数值,之后将h1作为攻击者,向靶标h3模拟进行ping洪泛攻击
h1 ping -f h3
如果操作正确,可以看出当命令执行后,sFlow监测到的传输流量剧增(sFlow Bytes、sFlow Packets),CPU占用和内存占用也大幅度增加。
下发流表
为实现对洪范攻击的防御与缓解,需要从控制器下发流表至OVS交换机,以期实现对攻击流量的阻断;假设此时我们已知攻击的源IP地址为10.0.0.1,编写python脚本调用ryu的rest api完成流表下发,下发流表匹配过滤10.0.0.1为源地址的所有报文并丢弃
import requests
import json
url="http://127.0.0.1:8080/stats/switches"
url1="http://127.0.0.1:8080/stats/flow/1"
res=requests.get(url1).json()
print("-----------------------flows in switch1--------------------")
print(res)
print("-----------------------flows in switch1--------------------")
url_addEntry="http://127.0.0.1:8080/stats/flowentry/add"
data={
# *******************************************
# 请在此处填入request message body,完成流表匹配域与动作域设置
"idle_timeout":30,
"hard_timeout":120,
"apid":1,
"cookie":1,
"table_id":0,
"priority":555555,
"flags":1,
"match":{
"nw_src":"10.0.0.1/32",
"dl_type":2048
},
"actions":[]
# *******************************************
}
data=json.dumps(data)
res=requests.post(url_addEntry,data=data)
print("FlowTable update status:")
print(res)
print("-----------------------flows in switch1 after update--------------------")
res=requests.get(url1).json()
print(res)
print("-----------------------flows in switch1 after update--------------------")
注意:
在下发流表时,idle_timeout设置为30,hard_timeout设置为120;
流表下发成功后,返回200状态码,并打印在屏幕上;
openflow协议中,actions字段设置为空(即"actions":[])表示交换机对匹配流量不做任何处理,直接丢弃;
流表中的优先级字段,数值越大优先级越高,建议设置30000以上;
利用在线编辑器完成代码后,切换到切换到/data/workspace/myshixun/SDN-security目录下,利用pyhton3作为解释器执行flow_entry.py脚本。
观察现象
使用python3解释器执行流表下发的py脚本,切换到bps_record脚本执行shell,观察流量变化情况;可以看到流量值迅速降低至数十字节每秒;
等待流表超时时间(如120秒),流量值又恢复到数十兆字节每秒,表示DDoS缓解机制取消后,目标再次遭受攻击
配置自动防御
如何将上述攻击缓解过程自动化,实现SDN控制器根据对流量的动态检测,自动化的生成流表,匹配攻击流量并进行阻断?
可以采用rest api方案、自定义ryu app方案、或者sFlow的js插件方案;
遇到的问题
端口
开启端口
/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
关闭端口
/sbin/iptables -I INPUT -p tcp --dport 8080 -j DROP
查看端口
/sbin/iptables -L -n
模块
如果安装不了模块
1.首先尝试update命令 sudo apt-get update
2.如果不行则执行upgrade sudo apt-get upgrade 上述命令成功以后就能正常使用 sudo apt-get install xxxxx
3.最后上面两项都不行则尝试 sudo apt-get install aptitude 成功以后使用 sudo aptitude install xxxxx
import不了
./bps_record.py: line 1: import: command not found
在python文件第一行加上
#!/usr/bin/python
权限
-bash: ./bps_record.py: Permission denied
修改权限
mn 评不通
host主机之间ping不通
查看静态流表
在mininet环境下:
mininet> dpctl dump-flows #查看静态流表
添加流表
mininet> dpctl add-flow in_port=1,actions=output:2 #对所有的switch添加
mininet> dpctl add-flow in_port=2,actions=drop #丢弃数据包
删除流表文章来源:https://uudwc.com/A/3yyb
mininet> dpctl del-flows #删除所有流表
mininet> dpctl del-flows in_port=2 #仅对入口2
mininet> sh ovs-ofctl del-flows s1 in_port=2 #仅对s1&入口2
不能减少流量
注意版本问题
在官方文档查找文章来源地址https://uudwc.com/A/3yyb