利用openvswitch对广播报文限速

利用openvswitch对广播报文限速

1. 准备环境

CentOS7(1511)

Docker(1.11.2)

OpenVswitch(2.4.0-1)

Iperf(2.0.8-2)

2. 网络拓扑

                        单宿主机OpenVswitch网络拓扑 
                                                
                                 +---+
                                 |em1|
                        +--------+---+-------+                          
                        |        br-em1      |
                        +----+----------+----+
                             |phy-br-int|
                             +----------+
                                  |
                                  |
                             +----------+                          
                             |int-br-em1|                             
                   +---------+----------+-----------+
                   |            br-int              | 
                   +--+------+------------+------+--+  
                      |qbi-xx|            |qbi-yy|                         
                      +------+            +------+
                         |                   |
                         |                   |
                      +------+            +------+
                      |qbv-xx|            |qbv-yy|
                   +--+------+--+      +--+------+--+
                   |   qbr-xx   |      |   qbr-yy   |
                   +--+------+--+      +--+------+--+
                      |qvb-xx|            |qvb-yy|
                      +------+            +------+
                         |                    |
                         |                    |
                      +------+            +------+
                      |qvo-xx|            |qvo-yy|
                   +--+------+--+      +--+------+--+
                   |   容器xx    |      |   容器yy   |
                   +------------+      +------------+    

3. 构建网络

3.1 创建容器

docker run -itd --name=magine1 --net=none 0.0.20.56:5000/centos /bin/bash
ddfb7c3015f34f178d7efc112e6d9350b1553c07aaed4164a861c339346dba7e

docker run -itd --name=magine2 --net=none 0.0.20.56:5000/centos /bin/bash
67fe66ff23896010e5590dc8f841a82a957fd5b8694ef2d9b04b316a110854dc

3.2 创建虚拟网卡

容器ddfb7c30
ip link add qbi-ddfb7c30 type veth peer name qbv-ddfb7c30
ip link add qvb-ddfb7c30 type veth peer name qvo-ddfb7c30

容器f52ebaa9
ip link add qbi-f52ebaa9 type veth peer name qbv-f52ebaa9
ip link add pvb-f52ebaa9 type veth peer name qvo-f52ebaa9

3.3 创建ovs拓扑

基础网桥
ovs-vsctl add-br br-int
ovs-vsctl add-br br-em1
ovs-vsctl add-port br-em1 em1

容器ddfb7c30
ovs-vsctl add-br qbr-ddfb7c30
ovs-vsctl add-port br-int qbi-ddfb7c30
ovs-vsctl add-port qbr-ddfb7c30 qbv-ddfb7c30
ovs-vsctl add-port qbr-ddfb7c30 qvb-ddfb7c30

容器f52ebaa9
ovs-vsctl add-br qbr-f52ebaa9
ovs-vsctl add-port br-int qbi-f52ebaa9
ovs-vsctl add-port qbr-f52ebaa9 qbv-f52ebaa9
ovs-vsctl add-port qbr-f52ebaa9 qvb-f52ebaa9

3.4 构建容器NameSpace

容器ddfb7c30
docker inspect -f  '{{ .State.Pid }}' ddfb7c3015f3
32687

关联系统namespace路径
ln -s /proc/32687/ns/net /run/netns/ddfb7c3015f3

查看容器ns
ip netns
ddfb7c3015f3

容器分入网卡
ip link set qvo-ddfb7c30 netns ddfb7c3015f3

配置IP
ip netns exec ddfb7c3015f3 ip addr 10.1.1.2/24 dev qvo-ddfb7c30

激活网卡
ip netns exec ddfb7c3015f3 ip link set qvo-ddfb7c30 up
ip link set qvb-ddfb7c30 up
ip link set qbi-ddfb7c30 up
ip link set qbv0ddfb7c30 up

容器f52ebaa9
以上操作

3.5 ovs创建队列和流表

容器ddfb7c30

在qbv-ddfb7c30上创建1条qos,2条队列,其中队列0最高1Gbit,最低500Mbit,队列1最高1Mbit,最低1Mbit
$ ovs-vsctl set port qbv-ddfb7c30 qos=@newqos -- --id=@newqos create qos type=linux-htb other-config:max-rate=1000000000 queues=0=@q0,1=@q1 -- --id=@q0 create queue other-config:min-rate=500000000 other-config:max-rate=1000000000 -- --id=@q1 create queue other-config:min-rate=1000000 other-config:max-rate=1000000

c5c8d139-7443-49f7-81d5-d92c8754e5de
ea91d271-618d-442f-b88c-6ab0bfc377ba
b6f63f0d-193d-4e9d-95c8-2af7e3aac247

查看qbr-ddfb7c30端口信息
$ ovs-ofctl show qbr-ddfb7c30
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000aaee33131e41
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 2(qvb-ddfb7c30): addr:96:60:70:41:70:0c
     config:     0
     state:      0
     current:    10GB-FD COPPER
     speed: 10000 Mbps now, 0 Mbps max
 3(qbv-ddfb7c30): addr:66:19:ab:4e:7e:09
     config:     0
     state:      0
     current:    10GB-FD COPPER
     speed: 10000 Mbps now, 0 Mbps max
 LOCAL(qbr-ddfb7c30): addr:aa:ee:33:13:1e:41
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0

在qbr-ddfb7c30上创建两条流表,用于匹配广播地址和单播地址
$ ovs-ofctl add-flow qbr-ddfb7c30 "table=1, in_port=2, dl_src=00:00:00:00:00:00/01:00:00:00:00:00, actions=enqueue:3:0"

$ ovs-ofctl add-flow qbr-ddfb7c30 "table=0, in_port=2, dl_src=01:00:00:00:00:00/01:00:00:00:00:00, actions=enqueue:3:1"

查看流表
$ ovs-ofctl dump-flows qbr-ddfb7c30
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=264250.612s, table=0, n_packets=1465040, n_bytes=31895512642, idle_age=5938, hard_age=65534, priority=0 actions=NORMAL
 cookie=0x0, duration=2.382s, table=0, n_packets=0, n_bytes=0, idle_age=2, in_port=2,dl_src=01:00:00:00:00:00/01:00:00:00:00:00 actions=enqueue:3:1
 cookie=0x0, duration=11.006s, table=1, n_packets=0, n_bytes=0, idle_age=11, in_port=2,dl_src=00:00:00:00:00:00/01:00:00:00:00:00 actions=enqueue:3:0
 
 
容器f52ebaa9
以上操作

4. 测试

由于没有测试广播风暴的工具,就以iperf测试单播为准

4.1 iperf server

宿主机
iperf -s
--------------------------------------
Server listening on TCP port 5001

TCP window size: 85.3 KByte (default)
--------------------------------------

4.2 容器 iperf Client

不配置qos

[root@docker1 ~]# ip netns exec ddfb7c3015f3 iperf -c 10.1.1.1 -i 1 -t 10
------------------------------------------------------------
Client connecting to 10.1.1.1, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 10.1.1.2 port 38143 connected with 10.1.1.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 1.0 sec  3.05 GBytes  26.2 Gbits/sec
[  3]  1.0- 2.0 sec  3.24 GBytes  27.9 Gbits/sec
[  3]  2.0- 3.0 sec  3.24 GBytes  27.8 Gbits/sec
[  3]  3.0- 4.0 sec  3.29 GBytes  28.3 Gbits/sec
[  3]  4.0- 5.0 sec  3.35 GBytes  28.8 Gbits/sec
[  3]  5.0- 6.0 sec  3.31 GBytes  28.4 Gbits/sec
[  3]  6.0- 7.0 sec  3.29 GBytes  28.2 Gbits/sec
[  3]  7.0- 8.0 sec  3.32 GBytes  28.5 Gbits/sec
[  3]  8.0- 9.0 sec  3.28 GBytes  28.2 Gbits/sec
[  3]  9.0-10.0 sec  3.26 GBytes  28.0 Gbits/sec
[  3]  0.0-10.0 sec  32.6 GBytes  28.0 Gbits/sec

配置qos,单播走队列0(正常队列。限速1Gbit)

$ ovs-ofctl add-flow qbr-ddfb7c30 "table=0, in_port=2, dl_src=00:00:00:00:00:00/01:00:00:00:00:00, actions=enqueue:3:0"
[root@docker1 ~]# ip netns exec ddfb7c3015f3 iperf -c 10.1.1.1 -i 1 -t 10
------------------------------------------------------------
Client connecting to 10.1.1.1, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 10.1.1.2 port 38157 connected with 10.1.1.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 1.0 sec   117 MBytes   980 Mbits/sec
[  3]  1.0- 2.0 sec   115 MBytes   965 Mbits/sec
[  3]  2.0- 3.0 sec   114 MBytes   952 Mbits/sec
[  3]  3.0- 4.0 sec   114 MBytes   955 Mbits/sec
[  3]  4.0- 5.0 sec   114 MBytes   955 Mbits/sec
[  3]  5.0- 6.0 sec   114 MBytes   954 Mbits/sec
[  3]  6.0- 7.0 sec   114 MBytes   954 Mbits/sec
[  3]  7.0- 8.0 sec   115 MBytes   967 Mbits/sec
[  3]  8.0- 9.0 sec   114 MBytes   954 Mbits/sec
[  3]  9.0-10.0 sec   114 MBytes   955 Mbits/sec
[  3]  0.0-10.0 sec  1.12 GBytes   958 Mbits/sec

配置qos,单播走队列1(广播队列。限速1Mbit)

$ ovs-ofctl add-flow qbr-ddfb7c30 "table=0, in_port=2, dl_src=00:00:00:00:00:00/01:00:00:00:00:00, actions=enqueue:3:0"
[root@docker1 ~]# ip netns exec ddfb7c3015f3 iperf -c 10.1.1.1 -i 1 -t 10
------------------------------------------------------------
Client connecting to 10.1.1.1, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 10.1.1.2 port 38177 connected with 10.1.1.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 1.0 sec  83.4 KBytes   683 Kbits/sec
[  3]  1.0- 2.0 sec  12.7 KBytes   104 Kbits/sec
[  3]  2.0- 3.0 sec   276 KBytes  2.26 Mbits/sec
[  3]  3.0- 4.0 sec   136 KBytes  1.11 Mbits/sec
[  3]  4.0- 5.0 sec   127 KBytes  1.04 Mbits/sec
[  3]  5.0- 6.0 sec   191 KBytes  1.56 Mbits/sec
[  3]  6.0- 7.0 sec   191 KBytes  1.56 Mbits/sec
[  3]  7.0- 8.0 sec   255 KBytes  2.09 Mbits/sec
[  3]  8.0- 9.0 sec   382 KBytes  3.13 Mbits/sec
[  3]  9.0-10.0 sec   382 KBytes  3.13 Mbits/sec
[  3]  0.0-10.2 sec  1.99 MBytes  1.64 Mbits/sec
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容