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

news2025/5/25 23:24:49

原文链接,欢迎大家关注我的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.coloradmin.cn/o/1381675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenGL 网格拾取坐标(Qt)

文章目录 一、简介二、代码实现三、实现效果参考资料一、简介 有时候我们希望通过鼠标来拾取某个网格中的坐标,这就涉及到一个很有趣的场景:光线投射,也就是求取一条射线与网格的交点,这里如果我们采用普通遍历网格中的每个面片的方式,当网格的面片数据量很大时计算效率就…

版本控制神器之Git深入介绍

Git简介 Git(全局信息追踪器)。 Git是一个分布式版本控制工具,Git的使用中央仓库不是必须的,用户本地就是一个完整的版本仓库,代码的前进、回退、删除等等操作都可以直接在本地进行,不需要中央仓库。但是…

Java多线程:初识多线程!左手画方,右手画圆

👑专栏内容:Java⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、线程与进程二、创建线程方法1、继承Thread类2、实现Runnable接口3、两者区别4、举个栗子5、简洁写法Ⅰ、Thread匿名内部类写…

vue开发H5 实现滑动图片获取验证码

<template><div><van-button type"primary" click"sendVerification">获取验证码</van-button><van-popupv-model"captchaVisible"closeableposition"bottom"class"login-captcha":close-on-cli…

基于JAVA+SSM框架开发的志愿者服务管理系统设计与实现【附源码】

&#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f4dd; &#x1f680;&#x1f680;&#x1f6…

强化学习(一)简介

强化学习这一概念在历史上来源于行为心理学&#xff0c;来描述生物为了趋利避害而改变自己行为的学习过程。人类学习的过程其实就是为达到某种目的不断地与环境进行互动试错&#xff0c;比如婴儿学习走路。强化学习算法探索了一种从交互中学习的计算方法。 1、强化学习 强化学…

31 树的存储结构一

无法直接用数组表示树的逻辑结构&#xff0c;但是可以设计结构体数组对节点间的关系进行描述&#xff1a;【如表】 这样做的问题&#xff1a; 可以利用 组织链表 parent指针&#xff1a; 注意&#xff1a;树结点在 组织链表 中的位置不代表树的任何逻辑关系 树的架构图&#xf…

DNS 在互联网中的作用是什么?

互联网的运作离不开DNS&#xff0c;那么DNS到底是什么&#xff1f;它在互联网中发挥着怎样的作用呢&#xff1f; DNS&#xff0c;全称为Domain Name System&#xff0c;即域名系统&#xff0c;是互联网的一项基础设施。它负责将人们易于记忆的域名&#xff08;如www.example.…

MySQL 从零开始:06 数据检索

文章目录 1、数据准备2、限制结果3、完全限定名4、排序检索 所谓数据检索&#xff0c;就是前面所讲的”增删改查“的”查“。 注&#xff1a;本文使用的“行”指数据表中的“记录”&#xff0c;“列”指数据表中的“字段”。 在第四节《表的增删改查》中已经介绍了 select 查询…

C# Cad2016二次开发api(三)

直线 Line 属性中文数据类型作用Length长度double直线的长度Angle角度double直线的弧度&#xff0c;0~2πDelta增量Vector3d起点到终点的向量Normal法向向量Vector3d直线所在平面的法向单位向量Thickness厚度doubleEndPoint终点Point3d直线的终点StartPoint起点Point3d直线的起…

Memory Wall in Neural Network Inference

Memory Wall in Neural Network Inference 神经网络推理的瓶颈在于访存带宽&#xff0c;通常无法发挥出加速器的全部算力。本文总结了目前常用的推理加速器及其设计&#xff0c;并分析了常用神经网络的访存瓶颈。文章大部分内容参考自Computer Architecture: A Quantitative A…

JavaScript基础(26)_dom增删改练习

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><title>DOM增删改练习</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>table {borde…

软件测试|Selenium StaleElementException异常的原因与方法

简介 在使用Selenium进行Web自动化测试时&#xff0c;我们可能会遇到StaleElementException异常。这个异常通常在我们操作一个之前已经找到的元素时抛出&#xff0c;但该元素已经不再处于DOM树中&#xff0c;导致元素过时&#xff08;stale&#xff09;。本文将介绍StaleEleme…

C++11 左右值引用、移动语义

右值引用和移动语义 什么是左值&#xff1f;什么是左值引用&#xff1f; 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以获取它的地址可以对它赋值&#xff0c;左值可以出现赋值符号的左边&#xff0c;右值不能出现在赋值符号左边。定义时const修饰…

SpringSecurity入门demo(二)表单认证

上一篇博客集成 Spring Security&#xff0c;使用其默认生效的 HTTP 基本认证保护 URL 资源&#xff0c;下面使用表单认证来保护 URL 资源。 一、默认表单认证&#xff1a; 代码改动&#xff1a;自定义WebSecurityConfig配置类 package com.security.demo.config; import or…

基于python的基金分析可视化系统

项目背景&#xff1a; 随着金融市场的发展和人们对财富管理的重视&#xff0c;越来越多的人开始参与基金投资。然而&#xff0c;由于市场上基金产品众多且复杂&#xff0c;投资者往往难以快速准确地获取基金信息和进行分析&#xff0c;从而导致投资决策不够科学和有效。为了解决…

PyCharm安装使用教程2024

简介 PyCharm是一种PythonIDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单…

三棋先手必胜证明

目录 创作原因 游戏规则 初始状态图 证明过程 先手必胜的证明 失败的博弈树&#xff08;三个多小时的成果&#xff09; 创作原因 这个棋不是网上流行的成三棋&#xff0c;我也不知道这个棋叫什么。由于这个棋是&#xff08;横竖斜&#xff09;连成三个就获胜&#xff0c;…

Vulnhub-HACKSUDO: PROXIMACENTAURI渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、端口敲门三、web密码爆破四、getShell五、获取新用户六、提权 一、前言 由于在做靶机的时候&#xff0c;涉及到的渗透思路是非常的广泛&#xff0c;所以在写文章的时候都是挑重点来写&#xff0…

【同济子豪兄斯坦福CS224W中文精讲】NetworkX代码学习笔记

文章目录 安装配置创建图可视化图图数据挖掘参考资料 安装配置 matplotlib中文字体设置 import networkx as nx import matplotlib.pyplot as plt # 魔法指令&#xff0c;设置后在jupyter notebook中绘制的图形会显示在输出单元格中&#xff0c;而不是弹出一个新窗口 %matplo…