05.neuvector网络学习与管控实现

原文链接,欢迎大家关注我的github

一、网络的策略学习

1.1.非主机模式的网络连接学习

agent进程侧:

调用taskAddContainer->taskInterceptContainer->programDP->DPCtrlAddTapPort为所有非host模式的容器向dp传送
DPAddTapPortReq对象数据.(当切换成保护模式后,都会调用DPCtrlDelTapPort),dp侧收到ctrl_add_tap_port信息后创建对应的
packet mmap对该容器的网络连接进行收集学习,
dp侧调用dp_ctrl_update_connects方法向agent传送网络连接, agent侧通过grpc的方式调用sendConnections方法将网络连接给
controller,controller侧存储在consul中 ;

相关日志如下 :

image.png

dp侧
写在前面:

dp侧收到ctrl_add_tap_port数据后,执行路径如下dp_ctrl_handler->dp_ctrl_add_tap_port->dp_data_add_tap->dp_alloc_context-
>dp_open_socket(创建AF_PACKET的socket并绑定容器的网络接口eth0)->dp_ring_v1(通过setsockopt创建的接收的环形缓冲区-)
>dp_rx_v1( 对于缓冲区中的数据,循环调用dpi_recv_packet处理)→dpi_recv_packet(核心函数)

dp侧重要函数:

1.dp_open_socket主要调用逻辑如下:

  • 创建AF_PACKET的socket:对应代码fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 作用: AF_PACKET是socket的一
    种,用于在链路层(也就是OSI的二层)接收和发送数据包;
  • 调用dp_ring_v1函数通过setsockopt创建接收的环形缓冲区 ( 通过PACKET_RX_RING套接字选项创建接受的环形缓冲区), 并调用
    dp_rx_v1方法,在dp_rx_v1中调用dpi_recv_packet循环处理缓冲区中的数据;
  • 调用dp_ring_bind将套接字绑定到对应的网络接口;

2.dpi_recv_packet中实现网络数据包的收集上报与管控, 对数据包进行解析后,形成相应的网络连接,主要调用函数如下:

  • 通过dpi_parse_ethernet 弄清楚第三层第四层网络协议方向后进行解析,以便如果数据包中存在任何威胁,可以正确记录日志;
    dpi_policy_cfg
  • 调用dpi_inspect_ethernet方法;

3.dpi_inspect_etherne主要调用函数如下:

  • dpi_session_lookup查找对应的session;
  • dpi_pkt_proto_tracker:设置tcp、udp、icmp等的跟踪器、记录相关行为并且判断部分内置威胁检测 ;
  • dpi_pkt_proto_parser:解析应用层协议;对于基于tcp的应用层协议,会在三次握手之后开始应用层协议解析,解析之后会将数据包对
    应的appid赋到session中,提供给后面进行规则匹配;
  • dpi_pkt_policy_reeval:通过dpi_policy_reeval检查是否符合对应的策略,将agent侧网络规则\dlp\waf的动作转换 ;
  • dpi_pkt_log: 最终调用回调函数connect_report(也就是dp_ctrl_connect_report)对网络连接进行更新;

4.dp_ctrl_loop:实现轮询更新威胁日志、域名转换ip、网络连接、应用的mac地址信息
5.dp_ctrl_update_connects: 在dp_ctrl_loop方法中被调用,通过send_connects方法实现向agent侧发送解析后的网络连接;
6.dp_ctrl_notify_ctrl: 通过sendto方法实现向agent侧发送相关信息(网络连接、威胁日志、域名转换等)

dp侧主要流程如下:
下图为dp侧网络连接上报到agent实现流程图

image-20231219225721479.png

1.2.主机模式的网络连接收集

通过agent/probe/socket.go/下的getNewConnections方法获取host模式的网络连接, agent侧通过grpc的方式调用sendConnections方法将网络连接给controller,controller侧存储在consul中。

二、网络的管控实现(不对host模式的容器进行管控)

写在前面:

1.当enforce容器与dp连接时agent侧会调用taskDPConnect方法用于网络规则相关信息的的初始化以及调用DPCtrlAddSrvcPort方法实现配置连接vth-neuv网络接口的packet_mmap用于后续网络管控。
2.当切换成保护模式后,都会在programDP中调用DPCtrlDelTapPort 和DPCtrlAddMAC实现对原有的context进行释放以及mac地址的更
新。

2.1非网格代理容器的管控路径

agent侧:

学习模式→保护模式后 ,agent监听到consul中网络的策略改变,主要路径networkDerivedProc->systemConfigPolicy→updateContainerPolicyMode→changeContainerWire( 调用programUpdatePairs方法为被保护的容器在
Enforcer中创建进出的Veth pair )->programBridge->FwdPortPair( 创建新的tc规则。 过滤单播数据包到vth-neuv网络接口上进行管控)

dp侧:

写在前面:
1.agent侧连接dp时会在taskDPConnect方法中调用DPCtrlAddSrvcPort方法实现配置连接vth-neuv网络接口的packet_mmap;
2.保护模式会调用DPCtrlDelTapPort方法 ,流量数据包会经过vth-neuv网络接口,dp侧通过vth-neuv网络接口的packet mmap用于对数据
包进行管控,该packet mmap会设置用于传输的的环形缓冲区(PACKET_TX_RING)实现发包的功能;
dp侧主要流程如下:

image-20231219225721479.png

主要函数

dpi_policy_reeval函数详细逻辑:
通过session中的policy同数据包进行规则匹配确定数据包action执行相应操作。
核心在于packet中的网络规则通过g_ep_map传入(即(dpi_policy_hdl_t *)p->ep→policy_hdl),通过解析packet得到(sip,dip,dport,proto,
app)组成key(dpi_rule_key_t)。
将key同hdl中的policy_map和range_policy_map进行匹配,如果匹配到得到相应的action,如果匹配不到使用hdl中默认的action。
拿到action后针对不同类型的action进行拒绝和通过,udp拒绝直接丢包,tcp拒绝需要发送双向重置包到tx缓冲区,通过的请求会转发到tx缓冲区。

1 对于Tcp协议的主要管控路径:dpi_recv_packet-》dpi_parse_ethernet( 弄清第三层第四层网络协议方向后进行解析, 以便如果数据包中
存在任何威胁,可以正确记录日志)-》dpi_inspect_ethernet-》dpi_session_lookup(查找对应的session)-》dpi_pkt_proto_tracker(关
于tcp、udp、icmp等的跟踪器、记录相关行为并且判断部分内置威胁检测)-》dpi_pkt_proto_parser(协议解析)-》
dpi_pkt_policy_reeval-》存在不匹配的规则或者不知名的IP地址并且动作为deny以及tcp传输协议则调用dpi_inject_reset-》 dpi_inject_rese
t_by_session( 将tcp的标志设置为RST tcph->th_flags = TH_RST,通过双向fake tcp rst包重置目标连接双方的网络连接 ) --》send_packet
==dp_send_packet -》 ctx->ring.tx(ctx, pkt, len, context->large_frame):发送数据包到传输的环形的缓冲区 -》传输的缓冲区将数据包
通过tc发送给容器或者主机

2 对于Udp、Icmp协议的主要管控路径: dpi_recv_packet-》 dpi_parse_ethernet( 弄清第三层第四层网络协议方向后进行解析, 以便如果数
据包中存在任何威胁,可以正确记录日志)-》 dpi_inspect_ethernet-》dpi_session_lookup(查找对应的session)-》
dpi_pkt_proto_tracker(关于tcp、udp、icmp等的跟踪器、记录相关行为并且判断部分内置威胁检测)-》dpi_pkt_proto_parser(协议解
析)-》dpi_pkt_policy_reeval-》动作设置DPI_ACTION_BLOCK-》动作为DROP、BLOCK、RESET时不会调用send_packet则默认阻塞

2.2通过服务网格代理的容器的管控路径( pod与外部通信的网络管控与非网格代理的容器一样,下面介绍的是代理容器与应用容器之间的网络管控)

agent侧:

学习模式→保护模式后 ,agent监听到consul中网络的策略改变,调用networkDerivedProc->systemConfigPolicy-
>updateContainerPolicyMode→changeContainerWire->programProxyMeshDP(网格代理的容器tapProxymesh为true)
与非服务网格代理的容器相同,都会通过Enforceer做代理创建对应veth pair以及tc规则,这里不重复介绍。
在programProxyMeshDP方法中实现在容器的命名空间中使用NFQUEUE设置iptable规则,dp侧创建nfq句柄(nfq_open)

流程实现图如下:

image-20231226230358047

三、总结

网络这一部分涉及到的知识比较多,这里主要说一下主要流程和主要函数,如果大家感兴趣欢迎私聊;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/317427.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

成就动机测试

成就动机测试广泛应用在职业发展领域,如:企业Hr人力资源管理部门,用于评估分析员工的潜能和价值,适用场景有人才招聘,岗位晋升,绩效考评等等。在大学生做职业规划,求职应聘中,应用成…

数据结构与算法(十一) 排序算法一

int nArray[] { 8,5,3,2,7 };如下一个数组,现对其进行从小到大排序 选择排序 选择排序:将小的依次放在前面 具象化如下: void swap(int *nSValue,int *nDValue) 交换函数 { int nTempValue 0; nTempValue *nSValue; *nSVal…

Spring Boot 整合支付宝实现在线支付方案(沙箱环境)

文章目录 1.理解沙箱环境2.沙箱环境接入准备2.1 访问开发者控制台2.2 获取重要信息2.3 处理秘钥 3.接入支付宝支付的流程4.实现支付4.1 添加 SDK 依赖4.2 创建配置类4.3 支付宝订单管理接口实现流程4.4 支付宝支付接口实现流程 5.支付宝支付功能演示7.总结 TIP:对于…

分享一个好用的免费在线扣图网址

具体效果 附地址 https://cutout.aiwave.cc/

【python】基础知识类的语法功能讲解

Python代码定义了一个名为Calculation的类,用于执行基础的数学运算(加法、减法、乘法、除法和取模)。下面我将详细解释各个部分的功能,并以列表形式总结: 类定义: class Calculation: 定义了一个名为Cal…

iOS Universal Links(通用链接)详细教程

一:Universal Links是用来做什么的? iOS9.0推出的用于应用之间跳转的一种机, 通过一个https的链接启动app。如果手机有安装需要启动的app,可实现无缝跳转。如果没有安装,会打开网页。 实现场景:微信链接无…

Flink窗口(2)—— Window API

目录 窗口分配器 时间窗口 计数窗口 全局窗口 窗口函数 增量聚合函数 全窗口函数(full window functions) 增量聚合和全窗口函数的结合使用 Window API 主要由两部分构成:窗口分配器(Window Assigners)和窗口函…

Memcache简介与运维

开源、高性能、高并发的分布式内存缓存系统。 作用 缓存关系型数据库的结果,减少数据库自身访问的次数。 常见内存缓存服务软件对比 memcache 纯内存 redis、memcachedb 可持久化存储,同时会使用磁盘存 …

Typora使用及Markdow学习笔记1

编程如画,我是panda! 最近有在学习Markdown,所以这次分享一下我的Markdown学习笔记 目录 前言 一、标题 二、段落 1.换行 2.分割线 三、文字显示 1.字体 2.上下标 四、列表 1.无序列表 2.有序列表 3.任务列表 五、区块 六、代…

外包干了5个月,感觉技术退步明显......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四…

深入理解Spring IOC

1. IOC 理论 IOC 全称控制反转,英文名为 Inversion of Control,它还有一个别名为 DI(Dependency Injection),即依赖注入。 在我们刚接触Spring的时候,我们就听说了IOC,但是对于IOC的理解,貌似…

ubuntu 20.04下 Tesla P100加速卡使用

1.系统环境:系统ubuntu 20.04, python 3.8 2.查看cuDNN/CUDA与tensorflow的版本关系如下: Build from source | TensorFlow 从上图可以看出,python3.8 对应的tensorflow/cuDNN/CUDA版本。 3.安装tensorflow #pip3 install tensorflow 新版…

ZooKeeper初探:分布式世界的守护者

欢迎来到我的博客,代码的世界里,每一行都是一个故事 ZooKeeper初探:分布式世界的守护者 前言Zookeeper的概述分布式系统中的角色和作用: Zookeeper的数据模型Znode的概念和层次结构:Znode的类型和应用场景:…

如何给AI下达精准的指令,哪些提示词对于AI是有效的?

刚上手那会,我倾向于将 prompt 翻译为“指令”,但这并不精确。“指令”通常对应instructions,属于 prompt 中的纯指令部分,通常是一个动宾结构(做什么)。剩下的部分更多是描述(describe&#xf…

【从零开始学习微服务 | 第一篇】什么是微服务

目录 前言: 架构风格: 单体架构: 分布式架构: 微服务: 总结: 前言: 在当今快速发展的软件开发领域,构建大型应用程序已经成为一项巨大的挑战。传统的单体应用架构往往难以满足…

Shiro框架:Shiro内置过滤器源码解析

目录 1. 常见项目中过滤器配置 2.Url访问控制配置解析为内置过滤器 2.1 DefaultFilterChainManager构造并注册内置过滤器 2.2 构造过滤器链 3. Shiro内置过滤器解析 3.1 内置过滤器概览 3.2 公共继承类解析 3.2.1 顶层Filter接口 3.2.2 AbstractFilter 3.2.3 Nameab…

Github上传代码/删除仓库/新建分支的操作流程记录

首先先安装git,安装完git后,看如下操作指令: 输入自己的用户名和邮箱(为注册GITHUB账号时的用户名和邮箱): git config --global user.name "HJX-exoskeleton" git config --global user.email …

扫码看图怎么做轮播效果?多组图片用扫码查看的方法

图片通过二维码来做展示现在是很常见的一种方式,用这种方式可以用于多种图片格式。那么当我们需要将图片做成多个分组的轮播图样式展示时,有什么好的方法能够做成这个效果呢?下面就来教大家使用二维码生成器制作图片二维码的操作方法&#xf…

Halcon边缘滤波器edges_image 算子

Halcon边缘滤波器edges_image 算子 基于Sobel滤波器的边缘滤波方法是比较经典的边缘检测方法。除此之外,Halcon也提供了一些新式的边缘滤波器,如edges_image算子。它使用递归实现的滤波器(如Deriche、Lanser和Shen)检测边缘&…

xtu oj 1475 冰墩墩和冰壶

题目描述 冰壶是被誉为“冰面上的国际象棋”,其计分规则是各自投壶,最后在大本营内,你有几个壶离圆心比对方所有壶离圆心都近就得到几分。 比如红方有两个壶,分别在坐标(1,1),(−2,1);黄方也有两个壶,分别…