ovs中debug数据包流向
ovs是一个可编程软件交换机,因此它可以在数据包级别做动作。本文主要介绍了如何使用trace工具来跟踪数据包在datapath中的流动路径。
数据包跟踪
为了更好地理解该工具,使用下述流表来举例:
1
2
3
4
|
table=3,ip,tcp,tcp_dst=80,action=output:2
table=2,ip,tcp,tcp_dst=22,action=output:1
table=0,in_port=3,ip,nw_src=192.0.2.0/24,action=resubmit(,2)
table=0,in_port=3,ip,nw_src=198.51.100.0/24,action=resubmit(,3)
|
第一行定义了在table=3中的,tcp目的端口为80的匹配,如果能匹配成功,则转发到端口2。
第二行定义了在table=2中的,tcp目的端口为22的匹配,如果匹配成功,则转发到端口1。
其余两行定义了源IP的匹配规则,如果能匹配成功,则通过resubmit转发到对应的table上。
现在来看下,假如一个数据包的源IP为192.0.2.1,目的端口为22,从端口1流入,该怎么通过上述流表:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ ovs-appctl ofproto/trace br0 in_port=3,tcp,nw_src=192.0.2.2,tcp_dst=22
Flow: tcp,in_port=3,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=00:00:00:00:00:00,nw_src=192.0.2.2,nw_dst=0.0.0.0,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=0,tp_dst=22,tcp_flags=0
bridge("br0")
-------------
0. ip,in_port=3,nw_src=192.0.2.0/24, priority 32768
resubmit(,2)
2. tcp,tp_dst=22, priority 32768
output:1
Final flow: unchanged
Megaflow: recirc_id=0,tcp,in_port=3,nw_src=192.0.2.0/24,nw_frag=no,tp_dst=22
Datapath actions: 1
|
第一行是跟踪的命令。br0是数据包要通过的网桥。剩下的参数就是描述数据包本身。比如说,nw_src
匹配数据包的源IP。所有的参数可参见文档ovs-fields。
第二行是从第一行提取出来的流。未指定的参数都设置为0。
第二部分就是数据包在br0中流通的过程。可以看到,在表0中,匹配到了对应的数据包,并且给出了对应的action(resubmit到了表2中)。然后以数字2开头的,表示数据包在表2中的流向过程,由于匹配到了目的端口为22,因此将数据包转发到端口1里。
总的来说,可以跟踪数据包整个的流向直到最后从某个端口转发出去或者drop掉。最后,跟踪工具给出了Megafkow,来匹配数据包的所有的字段。
下面来看同样的数据包但是目的端口不同,是如何转发的。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ ovs-appctl ofproto/trace br0 in_port=3,tcp,nw_src=192.0.2.2,tcp_dst=80
Flow: tcp,in_port=3,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=00:00:00:00:00:00,nw_src=192.0.2.2,nw_dst=0.0.0.0,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=0,tp_dst=80,tcp_flags=0
bridge("br0")
-------------
0. ip,in_port=3,nw_src=192.0.2.0/24, priority 32768
resubmit(,2)
2. No match.
drop
Final flow: unchanged
Megaflow: recirc_id=0,tcp,in_port=3,nw_src=192.0.2.0/24,nw_frag=no,tp_dst=0x40/0xffc0
Datapath actions: drop
|
在数据匹配那一部分可以看到,数据包在table=0匹配到,是因为源IP匹配,因此转发给table=2 。在table=2中没有匹配到一条规则。这种情况称之为table miss。根据使用的ovs的版本不一样,出现table miss的时候的action也不一样。上述例子中,默认动作为drop。