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

三、总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 3 场 蓝桥杯小白入门赛 解题报告 | 珂学家 | 单调队列优化的DP + 三指针滑窗

前言 整体评价 T5, T6有点意思&#xff0c;这场小白入门场&#xff0c;好像没真正意义上的签到&#xff0c;整体感觉是这样。 A. 召唤神坤 思路: 前后缀拆解 #include <iostream> #include <algorithm> #include <vector> using namespace std;int main()…

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数 豆瓣电影网址&#xff1a;https://movie.douban.com/top250 主页截图和要抓取的内容如下图&#xff1a; 分析&#xff1a; 第一页的网址&#xff1a;https://movie.douban.com/top250?start0&filter 第二页的…

时间差异导致数据缺失,如何调整Grafana时间与Prometheus保持同步?

Grafana时间如何调快或调慢&#xff1f; 在k8s环境中&#xff0c;常使用prometheusgrafana做监控组件&#xff0c;prometheus负责采集、存储数据&#xff0c;grafana负责监控数据的可视化。 在实际的使用中&#xff0c;有时会遇到这样的问题&#xff0c;k8s集群中的时间比真实…

unity C#中使用ref、out区别和使用案例

文章目录 ref 关键字out 关键字 在Unity&#xff08;以及C#编程语言中&#xff09;&#xff0c; ref 和 out 都是用来传递参数的引用&#xff0c;这意味着它们允许函数修改实参变量&#xff0c;并且这些修改会反映到调用函数的地方。但它们之间确实存在一些关键区别和使用场景…

【数据结构 | 直接选择排序】

直接选择排序 基本思路直接插入排序SelectSort 基本思路 直接插入排序&#xff08;StraightInsertionSort&#xff09;的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的、记录数增1的有序表。 我们可以同时从数组的头部和尾部同时进行排序工作…

Jenkins集成Sonar Qube

下载插件 重启Jenkins 容器 sonarqube 使用令牌 Jenkins 配置 重新构建

智能合约笔记

前言&#xff1a; 首先了解下为什么会出现智能合约&#xff0c;打个比方现在有两个人A和B打赌明天会不会下雨&#xff0c;每个人赌注100元&#xff0c;如果第二天下雨则A拿走200元&#xff0c;否则B拿走200元&#xff0c;这样就有一个问题&#xff0c;赌注要到第二天才能见效&…

每日一题——LeetCode1189.气球的最大数量

方法一 个人方法&#xff1a; 统计text字符串中b、a、l、o、n 这几个字符出现的次数 l和n需要两个才能拼成一个balloon&#xff0c;所以碰到l和o加1&#xff0c;其他字符加2 最后求出出现次数最少的那个字符再除以2就是能拼凑成的单词数量&#xff0c;避免出现小数要使用向下…

MySQL 从零开始:04 增删改查

文章目录 1、准备工作2、insert 增加数据2.1 添加所有列的数据2.2 添加部分列2.3 一次插入多条数据 3、delete 删除记录4、update 更新记录5、select 查询记录5.1 查询所有行所有列5.2 查询指定行的所有列5.3 查询所有行的指定列5.4 查询指定行的指定列 在上一小节中介绍了 MyS…

leetcode第365题:水壶问题

有两个水壶&#xff0c;容量分别为 jug1Capacity 和 jug2Capacity 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 targetCapacity 升。 如果可以得到 targetCapacity 升水&#xff0c;最后请用以上水壶中的一或两个来盛放取得的 targetCapacity 升水。 你可以&a…

C练习——杨辉三角

题目&#xff1a; 打印近似杨辉三角&#xff0c;行数n自选 百度找的杨辉三角&#xff0c;参考一下&#xff1a; 解析&#xff1a; 把它的全部元素左对齐&#xff0c;就可以看成近似杨辉三角的样子 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 …… 每个数等于它上方两数…

第一个 OpenGL 程序:旋转的立方体(VS2022 / MFC)

文章目录 OpenGL API开发环境在 MFC 中使用 OpenGL初始化 OpenGL绘制图形重置视口大小 创建 MFC 对话框项目添加 OpenGL 头文件和库文件初始化 OpenGL画一个正方形OpenGL 坐标系改变默认颜色 重置视口大小绘制立方体使用箭头按键旋转立方体深度测试添加纹理应用纹理换一个纹理 …

随笔03 笔记整理

图源&#xff1a;文心一言 关于我的考研与信息安全类博文整理~&#x1f95d;&#x1f95d; 第1版&#xff1a;整理考研类博文~&#x1f9e9;&#x1f9e9; 第2版&#xff1a;提前列出博文链接&#xff0c;以便小伙伴查阅~&#x1f9e9;&#x1f9e9; 第3版&#xff1a;整理We…

SLF4J Spring Boot日志框架

JAVA日志框架 JAVA有好多优秀的日志框架&#xff0c;比如log4j、log4j2、logback、JUL&#xff08;java.util.logging&#xff09;、JCL&#xff08;JAVA Common Logging&#xff09;等等&#xff0c;logback是后起之秀&#xff0c;是Spring Boot默认日志框架。 今天文章的目…

快速了解——逻辑回归及模型评估方法

一、逻辑回归 应用场景&#xff1a;解决二分类问题 1、sigmoid函数 1. 公式&#xff1a; 2. 作用&#xff1a;把 (-∞&#xff0c;∞) 映射到 (0&#xff0c; 1) 3. 数学性质&#xff1a;单调递增函数&#xff0c;拐点在x0&#xff0c;y0.5的位置 4. 导函数公式&#xff1a;f…

【镜像制作】OS云主机镜像的制作——以H3C为例

一、云主机镜像简介 1&#xff0e;云主机镜像 云主机镜像不同于容器镜像&#xff0c;是一个含有引导分区、操作系统以及必要应用的单一文件&#xff0c;可以理解成是对整个系统安装光盘所有数据的克隆文件。云用户在创建和申请云主机时可通过选择不同的镜像来快速获取相应操作…

一文读懂「Prompt Engineering」提示词工程

在了解提示过程之前&#xff0c;先了解一下什么是提示prompt&#xff0c;见最后附录部分 一、什么是Prompt Engingering&#xff1f; 提示工程&#xff08;Prompt Engingering&#xff09;&#xff0c;也被称为上下文提示&#xff08;In-Context Prompting&#xff09;&#x…

Android的setContentView流程

一.Activity里面的mWindow是啥 在ActivityThread的performLaunchActivity方法里面&#xff1a; private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo r.activityInfo;if (r.packageInfo null) {r.packageInfo getP…

常见面试题之CSS

CSS3的新特性 新增选择器&#xff1a;:nth-child()、:first-of-type、:last-of-type等 弹性盒子&#xff1a;display: flex 媒体查询&#xff1a;media根据设备的特性和屏幕大小应用不同的样式规则 多列布局&#xff1a;column-count和column-with等属性可以实现将内容分为多…

SpringBoot读取配置文件中的内容

文章目录 1. 读取配置文件application.yml中内容的方法1.1 Environment1.2 Value注解1.3 ConfigurationProperties 注解1.4 PropertySources 注解&#xff0c;获取自定义配置文件中的内容&#xff0c;yml文件需要自行实现适配器1.5 YamlPropertiesFactoryBean 加载 YAML 文件1.…