参考博文-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数据包。