OVN系列3 -- Debug & OVS Trace

报文跟踪

我们知道linuxbridge,是纯粹的根据MAC转发,桥内的转发问题通常我们看看fdb表项正确,ebtables、iptables是否做了拦截就能解决大部分问题了。而ovs使用openflow 流表转发报文,情况就复杂的多,特别在使用多个datapath bridge、多级流表的情况下,通过肉眼看流表还是很费力的。
把Trace放到前面是为了方便在实验出问题的时候,能够使用这些工具,更方便的去定位解决问题。

使用OVN做报文追踪有两种方式,第一种使用ovs的trace命令行,第二种使用ovn的trace命令行。

  • ovs-appctl ofproto/trace
  • ovn-trace

当然输出可以相互转化的:

ovs-appctl ofproto/trace "xxxx" > tmp
ovn-detrace < tmp

两者的区别:

ovs-appctl ofproto/trace 可以在非Centrial节点执行,而且可以跟踪非OVN托管的datapath,但显示内容更加抽象,可读性差;
ovn-trace 只能用于ovn,在Centrial节点执行,跟踪OVN托管的datapath,显示内容和ovn逻辑配置对应,可读性好。

两者共同点:

无论是ovs trace还是ovn trace,本质上都是通过查询ovs流表整理出路径,并非构造真实报文。

所有后面我们会发现,需要依赖外部模块时,可能就无法使用。比如,如果pipeline 中用到ct,是无法真正进入ct模块做报文修改,如nat修改,就会造成trace失效,所以使用起来还是有一定限制的,但如果没这些情况,还是很准确的。

测试

下面列了一个并不怎么准确的例子(不准确的原因是我发现trace无法处理ct)但却误打误撞解决了问题。

测试中出现一个问题,不知做了什么,配置EIP后,vm ping 公网不通了,我们分别使用上面的命令行定位一下。

使用 ovs-appctl ofproto/trace

1)从构造icmp包从vm nic进入 br-int,期望从br-ex的公网口发出。

ovs-appctl ofproto/trace br-int in_port="sw-400-port-vm2",icmp,dl_src=fa:10:dd:1b:40:02,dl_dst=02:d4:1d:8c:40:01,nw_src=40.1.1.12,nw_dst=77.1.1.1,nw_ttl=64

发现和期望一致,出公网口(metadata=0x8,OUTPUT=3)。这里的报文虽然从公网口发出去了,但报文未做nat,因为ct模块无法工作。

2)构造ICMP包,从 br-ex 的公网口入,期望进入b-int,由 vm nic发出。

ovs-appctl ofproto/trace br-ex in_port="veth-topub-o",icmp,dl_src=2e:bb:8d:e4:2d:bd,dl_dst=0a:10:dd:1b:40:02,nw_src=77.1.1.1,nw_dst=192.168.77.42,nw_ttl=64

和期望不一致.

原因分析: 报文还在公网出口交换机中(metadata=0x8)就被丢弃了,没有进入路由器。最后一条,在table34 drop。原因是在table24、33将流量当成未知单播处理了,设置reg15=0xfffe。

[root@172-26-201-7 ~]# ovs-appctl ofproto/trace br-ex in_port="veth-topub-o",icmp,dl_src=2e:bb:8d:e4:2d:bd,dl_dst=0a:10:dd:1b:40:02,nw_src=77.1.1.1,nw_dst=192.168.77.42,nw_ttl=64
Flow: icmp,in_port=2,vlan_tci=0x0000,dl_src=2e:bb:8d:e4:2d:bd,dl_dst=0a:10:dd:1b:40:02,nw_src=77.1.1.1,nw_dst=192.168.77.42,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=0,icmp_code=0

bridge("br-ex")
---------------
0. priority 0
NORMAL
-> no learned MAC for destination, flooding

bridge("br-int")
----------------
0. in_port=3,vlan_tci=0x0000/0x1000, priority 100
set_field:0xa->reg13
set_field:0x9->reg11
set_field:0x8->reg12
set_field:0x8->metadata
set_field:0x1->reg14
resubmit(,8)
8. reg14=0x1,metadata=0x8, priority 50, cookie 0x1c211b6a
resubmit(,9)
9. metadata=0x8, priority 0, cookie 0x3ef498ab
resubmit(,10)
10. metadata=0x8, priority 0, cookie 0xbb147995
resubmit(,11)
11. metadata=0x8, priority 0, cookie 0x724fee86
resubmit(,12)
12. metadata=0x8, priority 0, cookie 0x835967af
resubmit(,13)
13. metadata=0x8, priority 0, cookie 0x4ac77a3a
resubmit(,14)
14. metadata=0x8, priority 0, cookie 0x386ad89e
resubmit(,15)
15. metadata=0x8, priority 0, cookie 0x602fe8c3
resubmit(,16)
16. metadata=0x8, priority 0, cookie 0x42d24bd4
resubmit(,17)
17. metadata=0x8, priority 0, cookie 0xda595cd3
resubmit(,18)
18. metadata=0x8, priority 0, cookie 0x886340ce
resubmit(,19)
19. reg14=0x1,metadata=0x8, priority 100, cookie 0xd37a278f
resubmit(,20)
20. metadata=0x8, priority 0, cookie 0x270b74dc
resubmit(,21)
21. metadata=0x8, priority 0, cookie 0x5f917298
resubmit(,22)
22. metadata=0x8, priority 0, cookie 0x3137956e
resubmit(,23)
23. metadata=0x8, priority 0, cookie 0x956e9bd3
resubmit(,24)
24. metadata=0x8, priority 0, cookie 0x107a5839
set_field:0xfffe->reg15
resubmit(,32)
32. priority 0
resubmit(,33)
33. reg15=0xfffe,metadata=0x8, priority 100
set_field:0xa->reg13
set_field:0x1->reg15
resubmit(,34)
34. reg10=0/0x1,reg14=0x1,reg15=0x1,metadata=0x8, priority 100
drop
set_field:0xfffe->reg15

Final flow: unchanged
Megaflow: recirc_id=0,eth,ip,in_port=2,vlan_tci=0x0000/0x1fff,dl_src=2e:bb:8d:e4:2d:bd,dl_dst=0a:10:dd:1b:40:02,nw_frag=no
Datapath actions: 4

按照正常流程,在公网出口交换机中,table24中应该将到EIP的报文设置为单播报文,转发到路由器,和其他已知mac地址一样,就想下面这种匹配了mac地址之后,将对应出接口id设置到 reg15,后续单播从对应接口发送:

cookie=0xbac6e0e1, duration=481286.062s, table=24, n_packets=27, n_bytes=2646, priority=50,metadata=0x6,dl_dst=fa:10:dd:1b:40:01 actions=load:0x1->NXM_NX_REG15[],resubmit(,32)

cookie=0xa9d9de34, duration=481286.061s, table=24, n_packets=230, n_bytes=20300, priority=50,metadata=0x6,dl_dst=fa:10:dd:1b:40:02 actions=load:0x2->NXM_NX_REG15[],resubmit(,32)
cookie=0xc613bcbf, duration=472772.977s, table=24, n_packets=816, n_bytes=77747, priority=50,metadata=0x6,dl_dst=02:d4:1d:8c:40:01 actions=load:0x3->NXM_NX_REG15[],resubmit(,32)
cookie=0x1628cdab, duration=340649.864s, table=24, n_packets=0, n_bytes=0, priority=50,metadata=0x5,dl_dst=02:d4:1d:8c:30:01 actions=load:0x3->NXM_NX_REG15[],resubmit(,32)
cookie=0x1326bb75, duration=340649.864s, table=24, n_packets=0, n_bytes=0, priority=50,metadata=0x5,dl_dst=fa:10:dd:1b:30:02 actions=load:0x2->NXM_NX_REG15[],resubmit(,32)
cookie=0x173207be, duration=156661.414s, table=24, n_packets=2, n_bytes=196, priority=50,metadata=0x5,dl_dst=c0:ff:ee:00:30:11 actions=load:0x4->NXM_NX_REG15[],resubmit(,32)
cookie=0x8b9f7063, duration=146529.114s, table=24, n_packets=293, n_bytes=27538, priority=50,metadata=0x8,dl_dst=02:d4:1d:8c:ff:01 actions=load:0x2->NXM_NX_REG15[],resubmit(,32)

那么手动加一条流表:

ovs-ofctl add-flow br-int "table=24,priority=50,metadata=0x8,dl_dst=0a:10:dd:1b:40:02 actions=load:0x2→NXM_NX_REG15[],resubmit(,32)"

再次测试,ok。。。

使用ovn-trace

这里只是展示一下,可以看到其可读性更好,和ovn的逻辑配置挂钩,在清楚ovn配置的情况下更好理解。

[root@localhost ~]# ovn-trace --summary sw-400 'inport == "sw-400-port-vm2" && eth.src == fa:10:dd:1b:40:02 && eth.dst == 02:d4:1d:8c:40:01 && ip4.src==40.1.1.12 && ip4.dst==77.1.1.1 && ip.ttl==64'
2021-12-24T03:49:15Z|00001|ovntrace|WARN|eth.dst = eth.src; eth.src = 02:d4:1d:8c:30:1; ip4.dst = 30.1.1.100; ip4.src = 30.1.1.1; udp.src = 67; udp.dst = 68; outport = inport; flags.loopback = 1; output;: parsing actions failed (Invalid numeric constant.)
2021-12-24T03:49:15Z|00002|ovntrace|WARN|outport == "sw-300-port-vm1" && eth.src == 02:d4:1d:8c:30:1 && ip4.src == 30.1.1.1 && udp && udp.src == 67 && udp.dst == 68: parsing expression failed (Invalid numeric constant.)
# ip,reg14=0x2,vlan_tci=0x0000,dl_src=fa:10:dd:1b:40:02,dl_dst=02:d4:1d:8c:40:01,nw_src=40.1.1.12,nw_dst=77.1.1.1,nw_proto=0,nw_tos=0,nw_ecn=0,nw_ttl=64
ingress(dp="sw-400", inport="sw-400-port-vm2") {
    next;
    next;
    outport = "sw-400-port";
    output;
    egress(dp="sw-400", inport="sw-400-port-vm2", outport="sw-400-port") {
        output;
        /* output to "sw-400-port", type "patch" */;
        ingress(dp="vpc-router", inport="rt-400-port") {
            next;
            ip.ttl--;
            reg0 = 192.168.77.254;
            reg1 = 192.168.77.1;
            eth.src = 02:d4:1d:8c:ff:01;
            outport = "rt-pub-port";
            flags.loopback = 1;
            next;
            get_arp(outport, reg0);
            /* MAC binding to 2e:bb:8d:e4:2d:bd. */
            next;
            next;
            output;
            egress(dp="vpc-router", inport="rt-400-port", outport="rt-pub-port") {
                eth.src = 0a:10:dd:1b:40:02;
                ct_dnat;
                ct_dnat /* assuming no un-dnat entry, so no change */ {
                    eth.src = 0a:10:dd:1b:40:02;
                    ct_snat(192.168.77.42);
                    ct_snat(ip4.src=192.168.77.42) {
                        output;
                        /* output to "rt-pub-port", type "patch" */;
                        ingress(dp="sw-pub", inport="sw-pub-port-router") {
                            next;
                            outport = "_MC_unknown";
                            output;
                            multicast(dp="sw-pub", mcgroup="_MC_unknown") {
                                egress(dp="sw-pub", inport="sw-pub-port-router", outport="sw-pub-port-out") {
                                    output;
                                    /* output to "sw-pub-port-out", type "localnet" */;
                                };
                            };
                        };
                    };
                };
            };
        };
    };
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容