(嵌套虚拟机)ovs+floodlight搭建sdn——模拟并检测ddos攻击

参考博文-CSDN-九瓜(作者)-使用OpenvSwitch + KVM搭建SDN网络、完整流程

ubuntu 下 ovs安装:
sudo apt-get install -qy openvswitch-switch openvswitch-common
以下ovs安装繁琐,不建议
ovs安装,需对应版本,使用uname -a查看内和版本,官网连接http://www.openvswitch.org//download/

如果觉得2.17.7就可以:那么使用命令:

cd /opt
sudo wget https://www.openvswitch.org/releases/openvswitch-2.17.7.tar.gz
# 进入到存放ovs的压缩包的文件夹(移动到你所需要的)
# 其他版本则下属内容自行更换
sduo tar -vxzf openvswitch-2.17.7.tar.gz
cd openvswitch-2.17.7.tar.gz
sudo ./boot.sh
sudo ./configure
sudo apt install libtool-bin
sudo cp /usr/bin/libtool .
sudo make 
sudo make install

下面这个命令没必要
modinfo datapath/linux/openvswitch.ko | grep depends
将上述依赖使用如下命令逐个添加
modprobe libcrc32c[多个依赖]
insmod datapath/linux/openvswitch.ko

sudo su
mkdir -p /usr/local/var/run/openvswitch
mkdir -p /usr/local/var/log/openvswitch

# 创建数据库
ovsdb-tool create /usr/local/etc/openvswitch/conf.db /usr/local/share/openvswitch/vswitch.ovsschema
# 启动ovsdb-server
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach
# 初始化ovsdb,针对于新创建的数据库才需要初始化
ovs-vsctl --no-wait init
# 环境变量建议写到/etc/profile
export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
# 就已经启动了ovs
# 建议此处重启电脑
# 或者
# export PATH=$PATH:/usr/local/share/openvswitch/scripts
# ovs-ctl stop
# export PATH=$PATH:/usr/local/share/openvswitch/scripts
# ovs-ctl start

之后再启动ovs:

sudo su
export PATH=$PATH:/usr/local/share/openvswitch/scripts
ovs-ctl start

参考博文-我的编程生涯(文章网站)-未知作者-Linux下的floodlight安装指南(排坑版)

安装 eclipse (后面启动floodlight项目用)

cd /opt
sudo wget -P /opt https://archive.eclipse.org/technology/epp/downloads/release/luna/SR2/eclipse-java-luna-SR2-linux-gtk-x86_64.tar.gz
sudo tar -vxzf eclipse-java-luna-SR2-linux-gtk-x86_64.tar.gz

安装floodlight

sudo su
# 输入密码
# 一定用下面这条命令按扎安装java8
sudo apt-get install openjdk-8-jdk
# 不小心安了jdk11用以下命令卸载
# sudo apt-get autoremove openjdk-11-jre-headless
# 注意,我这里用的是镜像网站kgithub.com(2023.7--比github好用捏)
cd /opt
git clone https://kgithub.com/floodlight/floodlight.git
cd floodlight
export GIT_SUBMODULE_URL='https://kgithub.com'
git submodule init
git submodule update
# 安装 ant 
sudo wget -P /opt https://dlcdn.apache.org//ant/binaries/apache-ant-1.9.16-bin.tar.gz
cd /opt
sudo tar -vxzf apache-ant-1.9.16-bin.tar.gz
# 下面的命令将引号内的内容添加到/etc/peofile文件的最后(注意,下面第一行的路径替换为自己的,版本号别忘了改)
# 下面这条命令尽量避免反复执行 如果不小心执行错了,使用文本编辑器修改/etc/profile文件
sudo echo 'ANT_HOME=/opt/apache-ant-1.9.16
export PATH=$JAVA_HOME/bin:$PATH:$ANT_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' | sudo tee -a /etc/profile


#验证ant安装是否成功
source /etc/profile
ant -version
cd /opt/floodlight
sudo ant eclipse
sudo mkdir /var/lib/floodlight
sudo chmod 777 /var/lib/floodlight

cd /opt/eclipse
./eclipse

此处创建eclipse工作区,这个随意

在这里插入图片描述

点击左上角的file->import->General->Existing Projects into Workspace->next
在这里插入图片描述
在这里插入图片描述

select root dirctory 中选择文件夹,选择git下载的floodlight文件夹
在这里插入图片描述

(下面这张图我这里由于之前创建过这个,所以不能点finish在这里插入图片描述
此时eclipse页面可能会是welcome界面,关掉welcome界面即可
点击上方的播放按钮右侧的下向箭头,其中的Run Configurations
在这里插入图片描述

右键java Application->new
在这里插入图片描述

NameFloodlightLaunch
ProjectFloodlight
Mainnet.floodlightcontroller.core.Main
在这里插入图片描述

点击下方的apply
关闭此界面
选中左侧栏中的floodlight(单击它)
在这里插入图片描述

接着点击播放按钮右侧的向下箭头,选择Run As,选中Java Apllicationok->procees
在这里插入图片描述

选择ok在这里插入图片描述

proceed在这里插入图片描述

然后访问localhost:8080/ui/index.html
在这里插入图片描述

打不开网页的话看看是不是这里选错了
在这里插入图片描述

如果不使用 eclipse,当时的配置floodlight的命令里的ant sclipse换为ant
则在floodlight文件夹下使用命令:
java -jar target/floodlight.jar (很有可能会报错,不如eclipse,但是哪个可以用就用哪个)

# 下面这个命令里,也可能是6633端口 ip为ens33的ip(上网的网卡)
# 端口不对在页面上就不能正确显示交换机

配置 ovs交换机

进行下一步操作前确保ovs已经开启

在这里插入图片描述

启动两台kvm的嵌套虚拟机

sudo virt-manager
(我这里启动的是两台ubuntu,一台ubuntu一台win10会导致实验过程中,其中一台崩溃,ubuntu18.04-2是ubuntu18.04的复制,使用命令:virt-clone --original ubuntu18.04 --name ubuntu18.04-2 --file /home/star/VMs/ubuntu1804/ubuntu-18.04-2-desktop-amd64.iso–file选项是指定复制以后的iso文件存放处,需改为自己的

(如果实验过程中启动虚拟机时报错vnet0或者vnet1被占用什么的,则使用命令:sudo ovs-vsctl del-port ovs-br0 vnet0sudo ovs-vsctl del-port ovs-br0 vnet1

在这里插入图片描述

sudo su 
# 这个br的名称随意设置,此处为ovs-br0
sudo ovs-vsctl add-br ovs-br0
# brctl没有就apt下载
sudo brctl show
# 上面这个命令可以看到virbr0下的vnet0和vnet1
sudo brctl delif virbr0 vnet0
sudo brctl delif virbr0 vnet1
sudo ovs-vsctl add-port ovs-br0 vnet0
sudo ovs-vsctl add-port ovs-br0 vnet1
sudo ovs-vsctl set-controller ovs-br0 tcp:127.0.0.1:6653
# 6653和6633哪个可以用哪个
# sudo ovs-vsctl set-controller ovs-br0 tcp:192.168.72.141:6633

接着使用sudo ovs-vsctl show应该结果如下
在这里插入图片描述

如果如下图所示busy等字样,可能的原因是上述过程中有一台虚拟机崩溃,重启了,只需再次执行:

sudo ovs-vsctl add-port ovs-br0 vnet0
sudo ovs-vsctl add-port ovs-br0 vnet1

如果启动虚拟机报错:vnet0或者vnet1 被占用等,就使用命令:sudo ovs-vsctl del-port ovs-br0 vnet0sudo ovs-vsctl del-port ovs-br0 vnet1
带虚拟机启动后

sudo brctl delif virbr0 vnet0
sudo brctl delif virbr0 vnet1
sudo ovs-vsctl add-port ovs-br0 vnet0
sudo ovs-vsctl add-port ovs-br0 vnet1

在这里插入图片描述

注意,这里需要在两台虚拟机中设置ip在同一网段,但其实vnet0和vnet1没有ip
ifconfig:
在这里插入图片描述

ping不通可能是:
在进行上述设置后重启了其中一台虚拟机,则需要brctl show并且把重新绑定在virbr0上的vnet删除即可

在这里插入图片描述
如果虚拟机中使用ifconfig发现两台虚拟机不在同一网段,或者有的没有ipv4的ip,可以使用sudo ifconfig 网卡名 192.168.122.*来自设置
网卡号可通过ifconfig命令查看
如下图所示,ubuntu18.04(右面)虚拟机没有ipv4的ip地址,使用命令sudo ifocnfig enp7s0 192.168.122.160
在这里插入图片描述
修改后:

在这里插入图片描述
在这里插入图片描述

实验过程中,我的一台虚拟机(ubuntu18.04-2 对应 vnet0)崩溃了,此时虽然可以直接重新启动,但是:
在这里插入图片描述

使用命令:

sudo brctl delif virbr0 vnet0

在这里插入图片描述

回到网页:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
拓扑图相比于上面两个图,如果哪个host没有加载出来,就用哪个host ping一下其他host,就出来了
在这里插入图片描述

使用floodlight流表监控ddos攻击

安装wireshark

sudo apt install wireshark
# 启动wireshark要用su权限,不然看不了网络接口
sudo wireshark

http://192.168.0.100:8080/wm/core/switch/all/flow/json中可以查看所有交换机的流表信息
在这里插入图片描述
使用下面的命令可以添加floodlight流表,但需要修改几个地方

  • switch改为交换机的ID在http://192.168.72.141:8080/ui/pages/switches.html等多处都可以找到
  • name随意
  • in_port 表示数据包要进入的交换机端口,通过sudo ovs-ofctl show ovs-br查看
    (报错协议协商失败的错误的话输入命令:sudo ovs-vsctl set bridge ovs-br0 protocols=OpenFlow13 或者 ovs-ofctl -O OpenFlow13 show ovs-br0
  • action的操作为output,output表示数据包应该从交换机的端口14输出
curl -d '{"switch":"00:00:e6:d4:e1:29:37:4f","name":"ddos-detector","priority":"32769","in_port":"3","eth_type":"0x0800","ipv4_src":"192.168.122.160","active":"true","actions":"output=4"}' http://192.168.72.141:8080/wm/staticflowpusher/json

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
测试一下:
我们在ubuntu18.04(ip:192.168.122.160)发送三个ping包
在这里插入图片描述
流表中检测到了三个数据包
在这里插入图片描述
下面模拟测试检测icmp的ddos攻击:
使用hping3模拟:sudo hping3 -c 10 --icmp 192.168.122.150
补充一点
此时我想在ubuntu18.04上apt安装hping3,是连不上网的:
在这里插入图片描述

在这里插入图片描述
解决方案是在宿主机上使用命令(注意,这里是vnet0还是vnet1,取决于想要联网的虚拟机对应的vnet是哪个):


sudo ovs-vsctl del-port ovs-br0 vnet1
sudo brctl addif virbr0 vnet1

在这里插入图片描述
如果还不行看看这里,改为有线连接
在这里插入图片描述
下载完以后再改回来,改为有线连接后,网卡的ip可能会改变,ifconfig要把刚刚切换网络是被改掉的ip改为之前的。

最后主机上恢复sdn配置操作:

sudo brctl delif virbr0 vnet0
sudo brctl delif virbr0 vnet1
sudo ovs-vsctl add-port ovs-br0 vnet0
sudo ovs-vsctl add-port ovs-br0 vnet1

在实在不行就重启虚拟机1,先装好hping3

补充完毕
在这里插入图片描述
ps:这里我的vnet0、vnet1端口实验过程中中途改变了,因此下面可能有点不一样
在这里插入图片描述

在这里插入图片描述
简单的定义一个判断收到ddos攻击的依据:
收到了大量的icmp报文,因此我们直接拒绝掉所有的icmp报文:
设置ACL规则
在这里插入图片描述

记得要设置掩码
在这里插入图片描述
ACL规则通常由源IP地址、源端口、目标IP地址、目标端口等字段组成,用于确定允许或阻止通过网络的数据包。Destination Transport Port字段允许您指定要匹配的目标端口号,以便对特定的网络流量进行控制,这里可以不做设置

在这里插入图片描述

在流表中可以看到该规则

在这里插入图片描述
这里我们使用192.168.122.160向192.168.122.150模拟icmp ddos攻击:

可以发现,ping和hping的icmp包已经不能发出了,但是主机上的刘表规则中可以看到,拦截到了icmp报文:

新发的icmp包不再进入流表规则0,而是进入流表规则1,被拦截

在这里插入图片描述在这里插入图片描述
但是使用hping3发送的其他非icmp包,如TCP,仍然可以到达192.168.122.150
在这里插入图片描述

还有一种添加流表的方式:
使用哦个ovs命令:

ovs-ofctl -O Openflow13 add-flow ovs-br0 in_port=10,actions=output:9
# 当使用下述命令后,即交换机内没有任何流表,任何机器间互相不能通信:
# ovs-ofctl del-flows ovs-br0 -O OpenFlow13
# 查看所有流表
# ovs-ofctl dump-flows ovs-br0 -O OpenFlow13

ovs分析openflow流量:

打开wireshark,监听any端口
过滤器设置:tcp.port == 6653(ovs控制器的端口号)
过滤器不要设置openflow啥的,woc,真是…

在这里插入图片描述
Open vSwitch(OVS)是一种虚拟交换机,主要用于在软件定义网络(SDN)中实现网络流量的转发和管理。OpenFlow 是一种通信协议,它定义了控制器与交换机之间的通信方式,允许控制器对交换机进行远程配置和管理。

在一般情况下,OVS通过监听其所连接的交换机上的OpenFlow消息来实现控制器与交换机的通信。当交换机上发生特定事件或需要特定操作时,交换机将生成相应的OpenFlow消息,这些消息将被发送到与OVS连接的控制器。

具体来说,当OVS与交换机建立连接后,交换机将发送一个特定类型的OpenFlow消息,即Hello消息,以通知控制器其存在。随后,交换机和控制器之间将进行握手过程,以确保它们能够相互理解和协商通信参数。

在握手完成后,OVS可以通过将特定的OpenFlow消息发送给控制器来请求配置指令、获取网络状态或报告事件。这些消息可以是FlowMod(流表修改)消息,用于控制数据包的转发行为;PacketIn(数据包进入)消息,用于通知控制器某个数据包需要进一步处理;PacketOut(数据包输出)消息,用于控制器主动发送数据包等。

当OVS与交换机建立连接后,交换机将定期生成和发送OpenFlow消息给控制器,以实现交换机与控制器之间的通信和协调
关闭floodlight项目,重新启动,发现hello报文

参考文章-简书-曾悦_3b69(作者)-4.2 OpenFlow 协议
openflow报文格式:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
可以看到协议的版本是1.3
Srcport是交换机端口号,dst是controller端口号,这一点可以在网站上看到。
在这里插入图片描述
在这里插入图片描述

同样的,控制器也回复了hello报文
在这里插入图片描述
Feature request & featrue reply
控制器向交换机询问端口特征,交换机回复
在这里插入图片描述
交换机收到feature_request消息之后会回复feature_reply消息来报告自己的特性。具体来说,会有交换机自身支持的流表数量,最多能缓存的数据包数量,端口特性等。

交换机报告自身的特性之后,控制器能够更具这些特性下发指令。

datapath id 数据通道标识符,用来表示交换机的身份。在每一个控制器中独一无二。

n_buffers 一次最多缓存的数据包数量,即交换机自己的缓存能力。

n_tables 表示交换机支持的流表数量。

capabilities 交换机端口所支持的功能,有流表,端口,STP,队列,ARP等。
在这里插入图片描述

actions 该bitmask表示交换机所支持的actions,有转发和修改包头两种。

port 交换机连接的端口消息。端口MAC地址,链路数据等。
在这里插入图片描述

在这里插入图片描述

OFPT_GET_CONFIG_REQUESTOFPT_GET_CONFIG_REPLY(OFPT_GET_CONFIG_REQUEST= OFPT_SET_CONFIG

OFPT_GET_CONFIG_REQUEST
在这里插入图片描述
OFPT_GET_CONFIG_REPLY
在这里插入图片描述

ovs-虚拟机网络互联
floodlight安装
ovs安装

FLOW_MOD

在这里插入图片描述
在这里插入图片描述

GROUP_MOD
在这里插入图片描述
BARRIER_REQUEST 和reply
消息被拦截
在这里插入图片描述

ECHO
在这里插入图片描述

ovs-ofctl -O OpenFlow13 show ovs-br
sudo hping3 -c 10 -S -p 80 <目标IP>

sudo: 使用超级用户权限来执行这个命令,这是因为hping需要底层的网络访问权限。
hping3: 这是hping工具的名称,用于发起网络测试和伪造数据包。
-c 10: 这个选项指定要发送的数据包数量为10个。你可以根据需要更改此值。
-S: 这个选项指定发送TCP SYN数据包,这是TCP三次握手过程的第一步。
-p 80: 这个选项指定目标端口为80,也可以根据需要更改为其他端口号。
<目标IP>: 这里你需要替换为你要测试的目标主机的IP地址。

sudo hping3 -c 10 --icmp <目标IP>

sudo: 使用超级用户权限来执行该命令,以获取底层的网络访问权限。
hping3: hping工具的名称。
-c 10: 这个选项指定要发送的ICMP数据包的数量为10个。你可以根据需要进行调整。
--icmp: 这个选项指定发送ICMP数据包。
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值