参考博文-CSDN-九瓜(作者)-使用OpenvSwitch + KVM搭建SDN网络、完整流程
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
 
Name用FloodlightLaunch
 Project用Floodlight
 Main用net.floodlightcontroller.core.Main
 
点击下方的apply
 关闭此界面
 选中左侧栏中的floodlight(单击它)
 
接着点击播放按钮右侧的向下箭头,选择Run As,选中Java Apllication,ok->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 vnet0或sudo 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 vnet0或sudo 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_REQUEST和OFPT_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数据包。
                


















