使用ebpf 监控linux内核中的nat转换

1.简介

Linux NAT(Network Address Translation)转换是一种网络技术,用于将一个或多个私有网络内的IP地址转换为一个公共的IP地址,以便与互联网通信。

在k8s业务场景中,业务组件之间的关系十分复杂.

由于 Kubernetes 的网络模型假设Pod之间访问时使用的是对方Pod 的实际地址,所以一个Pod内部的应用程序看到的自己的IP地址和端口与集群内其他Pod看到的一样 。它们都是Pod实际分配的IP地址 。 将IP地址和端口在Pod内部和外部都保待一致,也就不需要使用 NAT 进行地址转换了。

一些场景如cilium 并没有使用Netfilter的NAT转换.

2.linux中的NAT转换

linux的NAT转换是基于 Netfilter 网络框架实现的。

Netfilter 是 Linux 内核中一个对数据 包进行控制、修改和过滤(manipulation and filtering)的框架。它在内核协议 栈中设置了若干hook 点,以此对数据包进行拦截、过滤或其他处理。 Netfilter 是最古老的内核框架之一,1998 年开始开发,2000 年合并到 2.4.x 内 核主线版本 [5]。

Netfilter 官方文档:

 

https://www.netfilter.org/documentation/index.html

netfilter是Linux内核的包过滤框架,它提供了一系列的钩子(Hook)供其他模块控制包的流动。这些钩子包括

NF_IP_PRE_ROUTING:刚刚通过数据链路层解包进入网络层的数据包通过此钩子,它在路由之前处理

NF_IP_LOCAL_IN:经过路由查找后,送往本机(目的地址在本地)的包会通过此钩子

NF_IP_FORWARD:不是本地产生的并且目的地不是本地的包(即转发的包)会通过此钩子

NF_IP_LOCAL_OUT:所有本地生成的发往其他机器的包会通过该钩子

NF_IP_POST_ROUTING:在包就要离开本机之前会通过该钩子,它在路由之后处理。

3.使用conntrack读取nat转换

conntrack 是 netfilter一个模块。

NAT是在连接跟踪的基础上实现的,所以conntrack肯定是在NAT之前建立的。

conntrack注册的优先级:

 
enum nf_ip_hook_priorities {NF_IP_PRI_FIRST = INT_MIN,NF_IP_PRI_RAW_BEFORE_DEFRAG = -450,NF_IP_PRI_CONNTRACK_DEFRAG = -400,NF_IP_PRI_RAW = -300,NF_IP_PRI_SELINUX_FIRST = -225,NF_IP_PRI_CONNTRACK = -200,NF_IP_PRI_MANGLE = -150,NF_IP_PRI_NAT_DST = -100,NF_IP_PRI_FILTER = 0,NF_IP_PRI_SECURITY = 50,NF_IP_PRI_NAT_SRC = 100,NF_IP_PRI_SELINUX_LAST = 225,NF_IP_PRI_CONNTRACK_HELPER = 300,NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX,NF_IP_PRI_LAST = INT_MAX,
};

我们可以看到,NAT是在连接跟踪的基础上实现的,所以连接跟踪肯定是在NAT之前建立的。在上面的优先级中,优先级越小,越容易被先调用。

使用conntrack 查看当前节点NAT 转换情况

sudo conntrack -L -j

 
tcp 6 82 SYN_SENT src=172.19.0.2 dst=192.168.101.98 sport=55628 dport=443 [UNREPLIED] src=192.168.101.98 dst=192.168.1.3 sport=443 dport=55628 mark=0 use=1 conntrack v1.4.6 (conntrack-tools): 1 flow entries have been shown.

所以我们使用ebpf hook conntrack 就可以查看当前节点NAT 转换情况。

4. 使用ebpf hook conntrack

使用ebpf 拦截conntrack,我们主要拦截:


SEC("kprobe/__nf_conntrack_hash_insert")SEC("kprobe/ctnetlink_fill_info")

实现主流程 

hook住 __nf_conntrack_hash_insert:

SEC("kprobe/__nf_conntrack_hash_insert")
int BPF_KPROBE(kprobe___nf_conntrack_hash_insert, struct nf_conn *ct,unsigned int hash, unsigned int reply_hash) {u32 status = ct_status(ct);__maybe_unused possible_net_t p_net = BPF_CORE_READ(ct, ct_net);if (!(status&IPS_CONFIRMED)) {log_debug("kprobe/__nf_conntrack_hash_insert include IPS_CONFIRMED: netns: %u, status: %x\n", get_netns(&p_net), status);return 0;}if (!(status&IPS_NAT_MASK)) {return 0;}if (!(status&IPS_CONFIRMED) || !(status&IPS_NAT_MASK)) {log_debug("kprobe/filter: netns: %u, status: %x\n", get_netns(&p_net), status);return 0;}conntrack_tuple_t orig = {}, reply = {};if (nf_conn_to_conntrack_tuples(ct, &orig, &reply) != 0) {return 0;}bpf_map_update_with_telemetry(conntrack, &orig, &reply, BPF_ANY);bpf_map_update_with_telemetry(conntrack, &reply, &orig, BPF_ANY);increment_telemetry_registers_count();return 0;
}

hook住ctnetlink_fill_info:

SEC("kprobe/ctnetlink_fill_info")
int BPF_KPROBE(kprobe_ctnetlink_fill_info, struct nf_conn *ct) {proc_t proc = {};bpf_get_current_comm(&proc.comm, sizeof(proc.comm));if (!proc_t_comm_prefix_equals("system-probe", 12, proc)) {log_debug("skipping kprobe/ctnetlink_fill_info invocation from non-system-probe process\n");return 0;}u32 status = ct_status(ct);if (!(status&IPS_CONFIRMED) || !(status&IPS_NAT_MASK)) {return 0;}__maybe_unused possible_net_t c_net = BPF_CORE_READ(ct, ct_net);log_debug("kprobe/ctnetlink_fill_info: netns: %u, status: %x\n", get_netns(&c_net), status);conntrack_tuple_t orig = {}, reply = {};if (nf_conn_to_conntrack_tuples(ct, &orig, &reply) != 0) {return 0;}bpf_map_update_with_telemetry(conntrack, &orig, &reply, BPF_ANY);bpf_map_update_with_telemetry(conntrack, &reply, &orig, BPF_ANY);increment_telemetry_registers_count();return 0;
}

自此将kernel中的nat 的sock 五元组采集到了ebpf的map中,上报到用户空间。

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

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

相关文章

tortoiseSVN树冲突解决方案

方案一: 手动导出 trunk 上的文件(夹),把本地目录文件(夹)删了并替换成 trunk上的,再点击测试合并方案二: 如果执行了方案一还是冲突,确认本地和trunk文件一致后,可以跳过冲突的revision

【数据结构】初探时间与空间复杂度:算法评估与优化的基础

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章主要了解算法的时间复杂度与空间复杂度等相关知识。 目录: 🌏 时间复杂度&#x1f52d…

目标检测算法改进系列之Backbone替换为FocalNet

FocalNet 近些年,Transformers在自然语言处理、图像分类、目标检测和图像分割上均取得了较大的成功,归根结底是自注意力(SA :self-attention)起到了关键性的作用,因此能够支持输入信息的全局交互。但是由于…

计算机网络——计算机网络的性能指标(上)-速率、带宽、吞吐量、时延

目录 速率 比特 速率 例1 带宽 带宽在模拟信号系统中的意义 带宽在计算机网络中的意义 吞吐量 时延 发送时延 传播时延 处理时延 例2 例3 速率 了解速率之前,先详细了解一下比特: 比特 计算机中数据量的单位,也是信息论中信…

剑指offer——JZ26 树的子结构 解题思路与具体代码【C++】

一、题目描述与要求 树的子结构_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2}&…

cad图纸如何防止盗图(一个的制造设计型企业如何保护设计图纸文件)

在现代企业中,设计图纸是公司的重要知识产权,关系到公司的核心竞争力。然而,随着技术的发展,员工获取和传播设计图纸的途径越来越多样化,如何有效地防止员工复制设计图纸成为了企业管理的一大挑战。本文将从技术、管理…

计算机竞赛 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于pyt…

NEFU数字图像处理(1)绪论

一、简介 1.1什么是数字图像 图像是三维场景在二维平面上的影像。根据其存储方式和表现形式,可以将图像分为模拟图像和数字图像两大类 图像处理方法:光学方法、电子学方法 模拟图像:连续的图像数字图像:通过对时间上和数值上连续…

阿里云ECS和轻量服务器有什么区别?

阿里云服务器ECS和轻量应用服务器有什么区别?轻量和ECS优缺点对比,云服务器ECS是明星级云产品,适合企业专业级的使用场景,轻量应用服务器是在ECS的基础上推出的轻量级云服务器,适合个人开发者单机应用访问量不高的网站…

二叉树的初步认识

二叉树是这么一种树状结构:每个节点最多有两个孩子,左孩子和右孩子 重要的二叉树结构 完全二叉树(complete binary tree)是一种二叉树结构,除最后一层以外,每一层都必须填满,填充时要遵从先左后…

[Spring] @Bean 修饰方法时如何注入参数

目录 一、Bean 的简单使用 1、正常情况 2、问题提出 二、解决方案 1、Qualifier 2、直接写方法名 三、特殊情况 1、DataSource 一、Bean 的简单使用 在开发中,基于 XML 文件配置 Bean 对象的做法非常繁琐且不好维护,因此绝大部分情况下都是使用…

【新的小主机】向日葵远程控制ubuntu

向日葵远程控制ubuntu 一、简介二、问题及解决方法2.1 向日葵远程连接Ubuntu22主机黑屏?2.2 Ubuntu如何向日葵开机自启?2.3 无显示器情况下,windows远程桌面连接Ubuntu? 三、美化桌面3.1 安装/解压3.2 设置3.3 右上角显示实时网速 四、安装d…

运营人必备这个微信运营工具

微信管理系统CRM在各行各业都有应用的场景---IT互联网、制造业、商业服务、金融投资、教育培训、房产家装、电商、政务等20行业领域均得到广泛应用。 微信CRM管理系统的主要功能: 多个微信号聚合聊天:解决多个微信来回切换,换着手着手机的麻烦…

Spring MVC程序开发(JavaEE进阶系列3)

目录 前言: 1.什么是Spring MVC 1.1MVC的定义 1.2MVC和Spring MVC的关系 1.3为什么要学习Spring MVC 2.Spring MVC项目的创建 3.Spring MVC框架的使用 3.1连接的功能 3.1.1RequestMapping 3.1.2GetMapping 3.1.3PostMapping 3.2获取参数的功能 3.2.1获…

高通camx开源部分学习简介

camera整体框架 sensor 上电,通过 MIPI协议传输,得到RAW图像数据。RAW图像数据经过ISP处理,得到YUV图像数据。YUV图像数据再经过DMA传输到DDR内存中,DDR内存也就是上图中标识的HOST。每个厂家的 ISP原理和功能大致相同&#xff0c…

【亲测有效】C盘容量满了,给C盘扩容!!!

前言 相信有很多小伙伴用自己电脑的时候明明不往C盘装东西,但是C盘还是慢慢的变红了,我也是因为C盘满了而备受困扰。又不知道如何解决或者怕自己鼓捣着磁盘数据没了。闲来无事,我查了一些资料,终于将我的C盘容量扩充了且数据保存…

Hive 【Hive(七)窗口函数练习】

窗口函数案例 数据准备 1)建表语句 create table order_info (order_id string, --订单iduser_id string, -- 用户iduser_name string, -- 用户姓名order_date string, -- 下单日期order_amount int -- 订单金额 ); 2)装载语句 i…

一文搞懂APT攻击

APT攻击 1. 基本概念2. APT的攻击阶段3. APT的典型案例参考 1. 基本概念 高级持续性威胁(APT,Advanced Persistent Threat),又叫高级长期威胁,是一种复杂的、持续的网络攻击,包含高级、长期、威胁三个要素…

超声波气象站——环境监测领域强大助手

超声波气象站是环境监测领域的一位强大助手,超声波气象站是一种综合型的气象设备,精巧而全面,满足人们对环境状况的深入了解和精准把握。 首先,超声波气象站的传感器部分,是它的核心组成部分,这位“感知者”…

PHP 行事准则:allow_url_fopen 与 allow_url_include

文章目录 参考环境allow_url_fopenallow_url_fopen 配置项操作远程文件file 协议 allow_url_includeallow_url_include 配置项 allow_url_include 与 allow_url_fopen区别联系默认配置配置项关闭所导致异常运行时配置ini_set()限制 参考 项目描述搜索引擎Bing、GoogleAI 大模型…