编写ringBuff过程中遇到的一次bug

问题描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    最近在隧道项目的开发过程中遇到了一个奇怪的bug,如上图,在网关C InBound模块中收到了D主机发送给主机A的数据包(解密成功后查出),按照代码逻辑C InBound中收到的所有包都是网关B OutBound模块转发而来的,这些包肯定是B发过来的。设计中网关用户侧使用的是af_packet抓的包,之后进入OutBound转发给目标主机所在的网关,进入其InBound模块进行解封装、解密与转发,而且所有网关部署了转发策略(依据五元组),网关B的策略只允许A->D的包出去,网关C的策略只允许D->A的包出去,进来的包不受限。所以网关C解密得到D->A的包很奇怪。网关两侧都使用了我自己编写的RingBuff,由于开发语言使用的go,配合channel很容易实现RingBuff。

问题分析

    通过抓包发现,网关B的OutBound模块之所以转发D->A的数据包是因为网关B用户侧的af_packet不仅仅抓取了用户A的数据包还抓了网关B发往用户A的包,所以会出现这种现象,解决的办法是,设置BPF,控制af_packet抓包的方向,只抓取InBound的包。策略失效的原因是因为RingBuff空间被无用包侵吞。在设计RingBuff的时候,定义RingBuff的长度为(channelLen + 1) * threadNum * frameSize,OutBound抓取一个包就轮询的分配给worker线程,但当出现杂包之后这个空间明显就不够用了。所以得严格按照生产一个包消费一个包来编写代码,对于杂包要约束其固定在一个buff里,待出现有用包之后再移动buffIndex。RingBuff空间被侵占的后果就是数据包的空间可能会出现错乱,新包会覆盖旧包。


    自然怜幽草,人间爱晚晴。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要出家当道士

打赏是不可能,这辈子都不可能

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值