Open vSwitch中的报文跟踪

Open vSwitch (OVS)是一种可编程的软件交换机,可以在每个报文级别执行操作。本文档介绍如何使用跟踪工具了解数据包在通过数据平面时发生了哪些处理。

ovs-vswitchd(8)手册页描述了ofproto/trace命令,在Open vSwitch中跟踪的基本用法。对于能够在OVN 逻辑交换机中跟踪数据包,类似于ofproto/trace的工具,请参见ovn-trace(8)_。

报文追踪

为了理解该工具,让我们使用以下流flow作为例子:

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)

:
如果无法使用"真实"的OVS环境,可以使用ovs-sandbox,如官方文档:/tutorials/ovs-advanced中所述,它也提供了额外的跟踪示例。

第一行在table 3中添加了一个规则,该规则在匹配目标端口为80(HTTP)的TCP/IP报文。如果报文匹配,则动作是将报文输出到OpenFlow 端口2上。

第二行类似,但是匹配的目的地端口为22(SSH)。如果报文匹配,动作是将报文输出到OpenFlow 端口1。

接下来的两行与源IP地址匹配。如果匹配,则报文被重新提交到指定的表table,其由动作中的resubmit的参数确定。

现在,让我们看看来自IP地址192.0.2.2,目的端口号为22的报文是否真正转到OpenFlow 端口1:

    $ 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

第一行是trace命令。br0是报文所要经过的网桥。以下参数描述报文本身。例如,nw_src字段与IP源地址匹配。所有的报文字段都很好描述在ovs-fields(7)_手册页中。

第二行显示由之前命令行描述的报文中抽象出来的流。未指定的报文字段归零。

接下来的几行显示了报文通过br0网桥的旅程。我们看到了,在table 0 中,字段匹配的OpenFlow流flow,及其优先级,然后是它的动作。在当前的情况下,我们看到与此报文匹配的流flow将报文重新提交到table 2中。"resubmit"动作导致在OpenFlow表 table 2中进行第二次查找,即以下以"2"开头的几行。在第二次查找中,我们看到与报文匹配的流flow将报文输出到OpenFlow的端口 #1。

总之,跟踪流flow条目及其动作直到最后的决定是可能的。最后,跟踪工具显示Megaflow信息,其包含了所有相关的匹配字段,以及最后的数据路径动作。

让我们看看以上的报文但是TCP目的端口修改为80之后会发生什么情况:

    $ 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中的任何规则。当报文与流表中的任何规则都不匹配,称为表未命中。Openvswitch交换机的未命中行为可配置,这取决于正在使用的OpenFlow版本。在此示例中,默认动作是丢弃此报文。

猜你喜欢

转载自blog.csdn.net/sinat_20184565/article/details/94590422
今日推荐