OVS上实现端口镜像的基本流程如下:

  • 创建 mirror ,在 mirror 中指定镜像数据源及镜像目的地
  • 将创建的 mirror 应用到 bridge 中

镜像数据源可以通过下面几个选项来指定:

  • select_all : 布尔值,设置为 true 时,进出该 mirror 所生效的 bridge 上的每个数据包都将被镜像
  • select_dst_port : 从该 port 离开虚拟交换机的数据包将会被镜像,从Guest角度看是Guest网络接口的流入方向
  • select_src_port : 从该 port 进入虚拟交换机的数据包将会被镜像,从Guest角度看是Guest网络接口的流出方向
  • select_vlan : 指定特定VLAN做为数据源,整个VLAN的数据包都会镜像到目的地

镜像目的地可以用下面选项来指定:

  • output_port : 将数据包镜像到特定的 port
  • output_vlan : 将数据包镜像到指定VLAN, 原始数据的VLAN tag会被剥掉。若镜像多个VLAN到同一个VLAN,没有办法区分镜像后的数据包来源于哪个VLAN。

下面我们通过实例来说明OVS上的镜像机制。我们的第一个实验拓朴结构如下图,我们将流入 tap1 网络接口的数据包镜像到 tap3 中:

首先构造环境:

ovs-vsctl add-br br0
ovs-vsctl add-port br0 tap1 -- set interface tap1 type=internal
ovs-vsctl add-port br0 tap2 -- set interface tap2 type=internal
ovs-vsctl add-port br0 tap3 -- set interface tap3 type=internal
ip netns add ns1
ip netns add ns2
ip netns add ns3
ip link set dev tap1 netns ns1
ip link set dev tap2 netns ns2
ip link set dev tap3 netns ns3
ip netns exec ns1 ip addr add 10.10.10.11/24 dev tap1
ip netns exec ns1 ip link set up tap1
ip netns exec ns2 ip addr add 10.10.10.12/24 dev tap2
ip netns exec ns2 ip link set up tap2
ip netns exec ns3 ip link set up tap3

  

我们从 ns1 中PING ns2 的IP:

[root@centos3 vagrant]# ip netns exec ns1 ping 10.10.10.12 -c 2
PING 10.10.10.12 (10.10.10.12) 56(84) bytes of data.
64 bytes from 10.10.10.12: icmp_seq=1 ttl=64 time=0.060 ms
64 bytes from 10.10.10.12: icmp_seq=2 ttl=64 time=0.106 ms --- 10.10.10.12 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.060/0.083/0.106/0.023 ms

  

在 ns3 中运行 tcpdump 观察是否能收到数据包, 可以看到此时 ns3 的 tap3 并不会收到 tap1 访问 tap2 的数据包:

[root@centos3 vagrant]# ip netns exec ns3 tcpdump -i tap3 -e -nn icmp or arp
tcpdump: WARNING: tap3: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap3, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel

  

接下来我们创建了相应的 mirror , 并将其应用到 br0 上:

ovs-vsctl -- --id=@tap1 get port tap1  \
-- --id=@tap3 get port tap3 \
-- --id=@m create mirror name=m0 select_dst_port=@tap1 output_port=@tap3 \
-- set bridge br0 mirrors=@m

  

此时查看 OVS 上的 mirror :

[root@centos3 vagrant]# ovs-vsctl list mirror
_uuid : 98b89127-cf94-4926-8d5f-76145154b03c
external_ids : {}
name : "m0"
output_port : 1dcde312-e33d-439f-b646-9db92416a586
output_vlan : []
select_all : false
select_dst_port : [16db4055-5b5b-411d-8e98-87813ba14eff]
select_src_port : []
select_vlan : []
statistics : {tx_bytes=0, tx_packets=0}

  

再次进行PING实验:

[root@centos3 vagrant]# ip netns exec ns1 ping 10.10.10.12 -c 2
PING 10.10.10.12 (10.10.10.12) 56(84) bytes of data.
64 bytes from 10.10.10.12: icmp_seq=1 ttl=64 time=0.274 ms
64 bytes from 10.10.10.12: icmp_seq=2 ttl=64 time=0.341 ms --- 10.10.10.12 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.274/0.307/0.341/0.037 ms

  

在 ns3 上抓包可以看到成功获得 tap2 回应 tap1 的ICMP响应数据包:

[root@centos3 vagrant]# ip netns exec ns3 tcpdump -i tap3 -e -nn icmp or arp
tcpdump: WARNING: tap3: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap3, link-type EN10MB (Ethernet), capture size 65535 bytes
23:22:11.919448 26:1e:74:67:6c:cc > 16:fe:12:ad:f0:4f, ethertype IPv4 (0x0800), length 98: 10.10.10.12 > 10.10.10.11: ICMP echo reply, id 4411, seq 1, length 64
23:22:12.919823 26:1e:74:67:6c:cc > 16:fe:12:ad:f0:4f, ethertype IPv4 (0x0800), length 98: 10.10.10.12 > 10.10.10.11: ICMP echo reply, id 4411, seq 2, length 64
23:22:16.929503 26:1e:74:67:6c:cc > 16:fe:12:ad:f0:4f, ethertype ARP (0x0806), length 42: Request who-has 10.10.10.11 tell 10.10.10.12, length 28
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel

  

这种方式对应了 Cisco 的 SPAN 方式, 下面我们来实验 RSPAN 方式。我们将拓朴修改为如下图所示,我们首先在 br0 上将 tap1 的数据包镜像到物定VLAN: 111 , 在 br1 上再从VLAN: 111 中将数据包镜像到 tap4 :

准备拓朴:

ip link add p0 type veth peer name p1
ovs-vsctl add-port br0 p0
ovs-vsctl add-port br1 p1
ovs-vsctl add-port br1 tap4 -- set interface tap4 type=internal
ip netns add ns4
ip link set tap4 netns ns4
ip netns exec ns4 ip link set up tap4

  

关闭VLAN: 111 的MAC学习功能,避免影响正常网络转发:

ovs-vsctl set bridge br0 flood_vlans=111
ovs-vsctl set bridge br1 flood_vlans=111

  

首先创建一个 mirror 将 tap1 的数据包镜像到VLAN: 111 :

ovs-vsctl -- --id=@tap1 get port tap1  \
-- --id=@m create mirror name=m1 select_src_port=@tap1 output_vlan=111 \
-- set bridge br0 mirrors=@m

  

查看 OVS 上的 mirror :

[root@centos3 vagrant]# ovs-vsctl list mirror
_uuid : fd39fdb2-ab69-47c1-bde9-01b7b40dd4d3
external_ids : {}
name : "m1"
output_port : []
output_vlan : 111
select_all : false
select_dst_port : []
select_src_port : [16db4055-5b5b-411d-8e98-87813ba14eff]
select_vlan : []
statistics : {tx_bytes=13426, tx_packets=157}

  

再次从 tap1 发送PING包到 tap2 , 我们在 tap4 上抓包, 可以看到 tap4 上可以收到镜像的数据包:

[root@centos3 vagrant]# ip netns exec ns4 tcpdump -i tap4 -e -nn icmp or arp
tcpdump: WARNING: tap4: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap4, link-type EN10MB (Ethernet), capture size 65535 bytes
14:45:58.762260 16:fe:12:ad:f0:4f > 26:1e:74:67:6c:cc, ethertype 802.1Q (0x8100), length 102: vlan 111, p 0, ethertype IPv4, 10.10.10.11 > 10.10.10.12: ICMP echo request, id 9722, seq 1, length 64
14:45:59.806203 16:fe:12:ad:f0:4f > 26:1e:74:67:6c:cc, ethertype 802.1Q (0x8100), length 102: vlan 111, p 0, ethertype IPv4, 10.10.10.11 > 10.10.10.12: ICMP echo request, id 9722, seq 2, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel

  

此时, tap4 为 trunk 模式,所有VLAN的数据包都可以收到。我们将 tap4 的 tag 设置为 111 :

ovs-vsctl set port tap4 tap=111
此时,再次重复PING访问, tap4 上依然可以收到镜像的数据包, 只不过VLAN TAG已经被剥除:
[root@centos3 vagrant]# ip netns exec ns4 tcpdump -i tap4 -e -nn icmp or arp
tcpdump: WARNING: tap4: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap4, link-type EN10MB (Ethernet), capture size 65535 bytes
14:47:24.060144 16:fe:12:ad:f0:4f > 26:1e:74:67:6c:cc, ethertype IPv4 (0x0800), length 98: 10.10.10.11 > 10.10.10.12: ICMP echo request, id 9816, seq 1, length 64
14:47:25.117508 16:fe:12:ad:f0:4f > 26:1e:74:67:6c:cc, ethertype IPv4 (0x0800), length 98: 10.10.10.11 > 10.10.10.12: ICMP echo request, id 9816, seq 2, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel

  

我们再次将 tag 设置为 110 ,再次从 tap4 抓包则收不到数据包。

我们可以添加另一个镜像规则,将镜像VLAN的数据包镜像到 tap4 :

ovs-vsctl -- --id=@tap4 get port tap4  \
-- --id=@m create mirror name=m2 select_vlan=111 select_all=true output_port=@tap4 \
-- add bridge br1 mirrors @m

  

查看OVS上的 mirror :

[root@centos3 vagrant]# ovs-vsctl list mirror
_uuid : e758d8ae-408d-4e4f-a1c4-eaa8dd99bce5
external_ids : {}
name : "m2"
output_port : e6a7d9b6-1032-4f9a-84f1-54b69f6db315
output_vlan : []
select_all : true
select_dst_port : []
select_src_port : []
select_vlan : [111]
statistics : {tx_bytes=0, tx_packets=0} _uuid : fd39fdb2-ab69-47c1-bde9-01b7b40dd4d3
external_ids : {}
name : "m1"
output_port : []
output_vlan : 111
select_all : false
select_dst_port : []
select_src_port : [16db4055-5b5b-411d-8e98-87813ba14eff]
select_vlan : []
statistics : {tx_bytes=14378, tx_packets=169}

  

在 tap4 上抓包, 得到的数据包已经被剥掉VLAN TAG:

[root@centos3 vagrant]# ip netns exec ns4 tcpdump -i tap4 -e -nn icmp or arp
tcpdump: WARNING: tap4: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap4, link-type EN10MB (Ethernet), capture size 65535 bytes
14:50:37.842958 16:fe:12:ad:f0:4f > 26:1e:74:67:6c:cc, ethertype IPv4 (0x0800), length 98: 10.10.10.11 > 10.10.10.12: ICMP echo request, id 10044, seq 1, length 64
14:50:38.904391 16:fe:12:ad:f0:4f > 26:1e:74:67:6c:cc, ethertype IPv4 (0x0800), length 98: 10.10.10.11 > 10.10.10.12: ICMP echo request, id 10044, seq 2, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel

  

使用镜像到物定VLAN的方式会导致原始的VLAN TAG信息丢失,如果要镜像多个VLAN的数据到同一目的地则会造成混乱。这种场景下,最好将数据包镜像到一个GRE port,基于这种方式可以实现 ERSPAN 模式。

清除 mirror 设置:

ovs-vsctl clear bridge br0 mirrors
ovs-vsctl clear bridge br1 mirrors

  

添加一个GRE端口:

ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:key=0x1000 options:remote_ip=10.95.30.43

  

创建 mirror 将 tap1 的数据包镜像至GRE端口:
ovs-vsctl -- --id=@tap1 get port tap1  \
-- --id=@gre0 get port gre0 \
-- --id=@m create mirror name=m3 select_src_port=@tap1 output_port=@gre0 \
-- set bridge br0 mirrors=@m

  

查看 mirror :

[root@centos3 vagrant]# ovs-vsctl list mirror
_uuid : 3c63e590-d42c-454a-a7f9-baa3e0ebb77f
external_ids : {}
name : "m3"
output_port : e71af801-289f-466b-9f66-d1e5cf396233
output_vlan : []
select_all : false
select_dst_port : []
select_src_port : [16db4055-5b5b-411d-8e98-87813ba14eff]
select_vlan : []
statistics : {tx_bytes=0, tx_packets=0}

  

我们在外网出口 eth0 上抓包,可以看到,GRE数据包已经发送:

[root@centos3 vagrant]# tcpdump -ieth0 -nn -e proto gre
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
15:46:50.236791 08:00:27:6b:57:88 > 52:54:00:12:35:02, ethertype IPv4 (0x0800), length 140: 10.0.2.15 > 10.95.30.43: GREv0, key=0x1111, proto TEB (0x6558), length 106: 86:5e:7a:ba:4a:5f > e2:ee:06:10:cb:70, ethertype IPv4 (0x0800), length 98: 10.10.10.11 > 10.10.10.12: ICMP echo request, id 1941, seq 1, length 64
15:46:51.237935 08:00:27:6b:57:88 > 52:54:00:12:35:02, ethertype IPv4 (0x0800), length 140: 10.0.2.15 > 10.95.30.43: GREv0, key=0x1111, proto TEB (0x6558), length 106: 86:5e:7a:ba:4a:5f > e2:ee:06:10:cb:70, ethertype IPv4 (0x0800), length 98: 10.10.10.11 > 10.10.10.12: ICMP echo request, id 1941, seq 2, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel

  

OpenvSwitch端口镜像的更多相关文章

  1. [转载]抓包,端口镜像,monitor session命令(转)

    原文地址:抓包,端口镜像,monitor session命令(转)作者:浮云皓月 一.SPAN简介 SPAN技术主要是用来监控交换机上的数据流,大体分为两种类型,本地SPAN和远程SPAN. --Lo ...

  2. CentOS7 配置网卡端口镜像

    背景 最近一直在研究旁路监测,需要设置一个源端口镜像给两个目的端口(分别接两个监测设备),无奈ip-com交换机没配置明白,研究下使用软件实现暂时代替. 环境 发行版.内核.iptables版本信息如 ...

  3. S5700交换机配置端口镜像

    S5700交换机配置端口镜像 <Quidway>system-view    //进入系统视图 Enter system view, return user view with Ctrl+ ...

  4. H3c交换机配置端口镜像详情

    端口镜像 需要将G0/0/1口的全部流量镜像到G0/0/2口,即G0/0/1为源端口,G0/0/2为目的端口. 配置步骤 1.进入配置模式:system-view: 2.创建本地镜像组:mirrori ...

  5. 华为S5700配置端口镜像和华三S5120配置802.1X认证记录

    一.说明 事情的起因是我们部门有个华为的S5700交换机,想配置端口镜像抓包但让助理买的串口线很久都还没到:而昨天测试部的同事说他们那有台华三的S5120想要配802.1X认证,但只有华为交换机的文档 ...

  6. 端口镜像——配置原理篇

    镜像是指将经过指定端口(镜像端口)或者指定VLAN(镜像VLAN)的报文复制一份到另一个指定端口(观察端口),然后转发到网络监控设备,供网络管理员进行网络监控与故障管理. 看官们可以通过下面的这张图了 ...

  7. 华为S5300交换机配置基于VLAN的本地端口镜像

    配置思路 1.  将Ethernet0/0/20接口配置为观察端口(监控端口) 2.  将VLAN 1.11.12.13.14配置为镜像VLAN 配置步骤 1.  配置观察端口 <Switch& ...

  8. 华为S5300交换机配置基于接口的本地端口镜像

    配置思路 1.  将Ethernet0/0/20接口配置为观察端口(监控端口) 2.  将Ethernet0/0/1----Ethernet0/0/10接口配置为镜像端口 配置步骤 1.  配置观察端 ...

  9. H3C S3600V2 通过CONSOLE配置端口镜像

    前24口为百兆口 对应序号为 Ethernet 1/0/(0~24) 25 26为千兆口 对应序号为 GigabitEthernet 1/0/(25~26) 以下是通过25号千兆口监听1号百兆口的例子 ...

随机推荐

  1. Hadoop知识点

    1.小文件合并:如果文件有一定的规律或者是在同一个文件夹下,可以采用获取文件夹下所有的文件,通过流进行合并,然后再存到hdfs上. 2.mapreduce的优点:1.离线计算.2.高容错性,一个节点挂 ...

  2. Zxing2.1扫描取景框变形问题解决

    修改竖屏扫描的贴子,2.0之前的都很适用.可是到了2.1,有些贴子的做法可以将扫描框改为竖屏,但是取景框里扫描到的东西是变形的(扁的),本人仔细研究一番,终于解决了这个问题,下面贴出解决办法: 1.修 ...

  3. Cantor表(NOIP1999)

    题目链接:Cantor表 这道题很水,但有的人没看懂题意,这不怪大家,怪题目没说清楚. 给张图: 看到这,你应该明白题目意思了. 先看看有什么规律. 我把这个数列写出来: 1/1,1/2,2/1,3/ ...

  4. 2019.02.06 bzoj2187: fraction(类欧几里得)

    传送门 题意简述:多组询问,每次给出a,b,c,da,b,c,da,b,c,d,求满足ab<pq<cd\frac ab<\frac pq<\frac cdba​<qp​& ...

  5. 2018.11.01 NOIP训练 梭哈(模拟)

    传送门 这题貌似不考智商啊. 直接按题意写就可以了. 事实上把牌从小到大排序之后写起来很舒服的. 然后就是有些地方可以人脑减代码量和判断次数. (提示:满堂红和某几种同类型的牌的大小判断) 然后注意A ...

  6. vue的computed属性

    vue的computed属性要注意的两个地方,1,必须有return,2,使用属性不用括号 <div> <input type="text" v-model=&q ...

  7. express框架搭建服务端

    1.管理员权限全局安装express npm i -g express-generator@4 2.创建express项目 express -e projectName 3.进入项目并安装 cd pr ...

  8. (9)How to take a picture of a black hole

    https://www.ted.com/talks/katie_bouman_what_does_a_black_hole_look_like/transcript 00:13In the movie ...

  9. 03 编写URL规则

    3-1 URL编写规则 # 在每个App中设置独立的静态资源和模板文件并添加一个空白内容的urls.py文件. # 当程序收到用户请求的时候,首先在根目录的urls.py查找该URL属于哪个APP,然 ...

  10. Win7 qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库问题 网上搜了下可以简单粗暴的用 D:\Qt\Qt5.6.0\5.6\msvc2015\bin ...