基于IFB对网络入口流量设置Qos策略

实验目的:Open vSwitch对入口流量的QoS只能做限速操作,本实验是为了能实现像出口流量一样的QoS
实验方法:使用Linux内核直接支持的IFB(Intermediate Functional Block device)虚拟网络设备,将所有网络接口(物理 or 虚拟)的入口流量导入IFB设备,利用TC工具(利用linux内核的提供的Traffic Control 功能)在IFB设备上设置qdisc\class\filter,对流量进行分类处理
实验环境:主机G450:运行3台虚拟主机(VirtualBox + Archlinux ) + OVS
安装虚拟机
安装Virtual Box
sudo apt-get install virtualbox
下载archlinux ISO镜像文件
http://mirrors.163.com/archlinux ... 2013.07.01-dual.iso
创建虚拟机
配置虚拟机网络连接方式:host-only
选择此方式后,会相应的在物理主机中创建一个vboxnet1虚拟网络设备,该设备与虚拟机的网卡eth0是连通的
因为本实验创建的三个虚拟机,需要所以创建三个vboxnet虚拟设备,是指如下
Virtual Box主界面 --->管理--->全局设定--->网络--->添加vboxnet2 / vboxnet3两个虚拟设备
启动虚拟机VM1 VM2 VM3
配置网络参数:
IP地址:ifconfig eth0 192.168.10.141 or ip addr add 192.68.10.141 dev eth0
VM1:192.168.10.141
VM2:192.168.10.142
VM3:192.168.10.143
主机G450:192.168.10.106(可用dhclient eth0获取)
路由表:
ip route 显示路由表
ip route add to 192.168.10.0/24 dev eth0
ip route add to default via 192.168.10.1 dev eth0
虚拟机其它配置:
更改源列表: /etc/pacman.d/mirrorslist
设置DNS: /etc/resolv.conf
安装iperf网络性能测试工具:pacman -S iperf
启动ssh server:systemctl start sshd
备份虚拟机


1.安装Open vSwitch
./configure --with-linux=/lib/modules/`uname -r`/build
make
sudo make install
sudo insmod datapath/linux/openvswitch.ko
sudo make modules_install
sudo mkdir -p /usr/local/etc/openvswitch
sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema

2.启动Open vSwitch
sudo ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,manager_options \
--private-key=db:SSL,private_key \
--certificate=db:SSL,certificate \
--bootstrap-ca-cert=db:SSL,ca_cert \
--pidfile --detach

ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach
3.配置OVS网桥和流表
ovs-vsctl add-br ovsbr
ovs-vsctl add-port ovsbr vboxnet1
ovs-vsctl add-port ovsbr vboxnet2
ovs-vsctl add-port ovsbr vboxnet3
ovs-vsctl add-port ovsbr eth0
ovs-vsctl add-port ovsbr ifb0
-------------------查看网络设备的vport号---------------------
sudo ovs-dpctl show
port 0: ovsbr (internal)
port 1: vboxnet1
port 2: vboxnet2
port 3: vboxnet3
port 4: eth0
port 5: ifb0

---------------------------------------------------------------------
添加flow规则
sudo ovs-ofctl add-flow ovsbr priority=65535,idle_timeout=0,ip,in_port=ANY,nw_src=ANY,nw_dst=192.168.10.141,actions=output:1
sudo ovs-ofctl add-flow ovsbr priority=65535,idle_timeout=0,ip,in_port=ANY,nw_src=ANY,nw_dst=192.168.10.142,actions=output:2
sudo ovs-ofctl add-flow ovsbr priority=65535,idle_timeout=0,ip,in_port=ANY,nw_src=ANY,nw_dst=192.168.10.143,actions=output:3
sudo ovs-ofctl add-flow ovsbr priority=65535,idle_timeout=0,ip,in_port=ANY,nw_src=ANY,nw_dst=192.168.10.106,actions=normal
sudo ovs-ofctl add-flow ovsbr priority=60000,idle_timeout=0,ip,in_port=ANY,nw_src=ANY,nw_dst=192.168.10.0/24,actions=output:4
sudo ovs-ofctl add-flow ovsbr priority=50000,idle_timeout=0,ip,in_port=ANY,nw_src=ANY,nw_dst=0.0.0.0/0.0.0.0,actions=output:4
4. 停止 Open vSwitch
kill `cd /usr/local/var/run/openvswitch && cat ovsdb-server.pid ovs-vswitchd.pid
5.说明
1)priority值越大,优先级越高
2)注意各条流表的优先级
3)注意不要删除了系统默认的那条流表,系统默认的那条流表能保证Open vSwitch能项普通的交换机一样工作,如果删除了该流表,只设置了上面那些流表规则,网络不能通,原因是首次与其他主机通信,主机会先发送ARP报文,上述的那些流表规则并未对ARP报文进行处理,所以无法通信。默认的流表规则能对ARP报文进行处理

加载IFB内核模块,创建ifb虚拟设备
sudo modprobe ifb numifbs=1 (numifbs: ifb数量)
将所有的入口流量导入到ifb0
eth0 vboxnet1 vboxnet2 vboxnet3
以eth0为例
1).创建入队列
tc qdisc add dev eth0 handle ffff: ingress
2).把eth0的入口流量导入ifb0
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
TC工具对ifb0设置QoS规则
tc qdisc add dev ifb0 root handle 1: htb default 20
tc class add dev ifb0 parent 1: classid 1:1 htb rate 50mbit
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 800kbit
tc class add dev ifb0 parent 1:1 classid 1:11 htb rate 5mbit

tc class add dev ifb0 parent 1:1 classid 1:12 htb rate 30mbit
tc class add dev ifb0 parent 1:1 classid 1:20 htb rate 14mbit
tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.10.141 flowid 1:10

tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.10.142 flowid 1:11
tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.10.143 flowid 1:12
----------------------------------------------------------------------------------------------------------------------
tc qdisc/class/filter add/show/del/change 添加/显示/删除/修改 相应的队列规则/分类/过滤器

实验结果:
第一组实验:
对VM1限速:10KB/s 实测平均速度:10KB/s
对VM1限速:100KB/s 实测平均速度:92.9KB/s
对VM1限速:500KB/s 实测平均速度:462.6KB/s
对VM1限速:1MB/s 实测平均速度:925.2KB/s
对VM1限速:6MB/s 实测平均速度:5.4MB/s
对VM1限速:10MB/s 实测平均速度:6.6MB/s

第二组实验:
VM1 VM2 VM3
限速: 100KB/s 625KB/s 3.75MB/s
优先级: 高 中 低
时速: 92.5KB/s 580KB/s 3.4MB/s

VM1 VM2 VM3
限速: 100KB/s 625KB/s 3.75MB/s
优先级: 低 中 高
实测速度:92.2KB/s 581KB/s 3.4MB/s

VM1(TCP) VM3(UDP)
指定速度: 9MB/s
限速: 100KB/s 3.75MB/s
优先级: 低 高
实测速度:92.4KB/s 3.65MB/s


希望以上对大家有所帮助

你可能感兴趣的:(Linux,TC)