使用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.xdnf.cn/news/149921.html

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

相关文章

gin 框架的 JSON Render

gin 框架的 JSON Render gin 框架默认提供了很多的渲染器,开箱即用,非常方便,特别是开发 Restful 接口。不过它提供了好多种不同的 JSON Render,那么它们的区别是什么呢? // JSON contains the given interface obje…

了解基于Elasticsearch 的站内搜索,及其替代方案

对于一家公司而言,数据量越来越多,如果快速去查找这些信息是一个很难的问题,在计算机领域有一个专门的领域IR(Information Retrival)研究如何获取信息,做信息检索。在国内的如百度这样的搜索引擎也属于这个…

oracle OCP OCM MySQL OCP认证难吗?

好多人在初次考OCP时,不知道如何选择,本文让姚远ACE老师为大家总结一下吧! 选择OCP认证时要注意的问题: 1,授课老师师资经验(非常重要) 2,课程大纲 3,试听课程 4&am…

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 大模型…

安全性算法

目录 一、安全性算法 二、基础术语 三、对称加密与非对称加密 四、数字签名 五、 哈希算法 六、哈希算法碰撞与溢出处理 一、安全性算法 安全性算法的必要性: 安全性算法的必要性是因为在现代数字化社会中,我们经常需要传输、存储和处理敏感的数据…

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

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

【C++】位图

位图 1. 位图1.1 位图的概念1.1 位图的实现1.3 位图的应用 2. 布隆过滤器2.1 概念2.2 模拟实现2.3 优点和缺点2.4 应用场景2.5 哈希切分的应用 1. 位图 1.1 位图的概念 位图,就是用二进制位来表示数据的某种状态,例如判断数据是否存在,二进…

教你拥有一个自己的QQ机器人!0基础超详细保姆级教学!基于NoneBot2 Windows端搭建QQ机器人

0.序言 原文链接:教你本地化部署一个QQ机器人本教程主要面向Windows系统用户教程从0开始全程详细指导,0基础萌新请放心食用🍕如果你遇到了问题,请仔细检查是否哪一步有遗漏。如果你确定自己的操作没问题,可以到原文链…

信看课堂-厘米GNSS定位

我们常常说GPS 定位,不过定位远不止GPS定位,通过本节课程,我们将会了解到,原来GPS只是定位的一种: GNSS概述 不同的GNSS系统使用不同的频段来传输导航信号。以下是一些主要的GNSS系统及其相应的频段,用表…

苹果系统_安装matplotlib__pygame,以pycharm导入模块

为了更便捷、连贯的进行python编程学习,尽量在开始安装python软件时,将编辑器、模块一并安装好,这样能避免以后版本冲突的问题。小白在开始安装pycharm、pip、matplotlib往往会遇到一些问题,文中列示其中部分bug,供大家…

1200*C. Challenging Cliffs(模拟构造贪心)

Problem - 1537C - Codeforces Challenging Cliffs - 洛谷 解析: 排序数组,然后找出间隔最短的两个相邻的数 a,b,c,d,e,f (假设b,c为差最小的两个数)。 然后…

Python无废话-办公自动化Excel格式美化

设置字体 在使用openpyxl 处理excel 设置格式,需要导入Font类,设置Font初始化参数,常见参数如下: 关键字参数 数据类型 描述 name 字符串 字体名称,如Calibri或Times New Roman size 整型 大小点数 bold …

【一、灵犀考试系统项目设计、框架搭建】

一、创建数据库 1、打开power designer,新建数据库模型 2、新建数据表,以及关系 【注意】 图片的类型有两种:varbinary 和 image varbinary : 二进制字节流,可以自动控制长度 image : 最大可放2G图片 3、创建数据库&#…

创新家庭办公室:打造完美工作空间的秘诀

一个精心策划的家庭办公室有很多好处,何不把临时工作区升级改造为你的专属工作区呢,还能为这些至关重要的区域注入新的活力。 创造多用途的起居室:我们大多数人都不曾拥有一个可以完全根据工作需求设计的独立家庭办公室——所以有时候要找到…

QT:鼠标画线(双画布)

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPoint> //点 #include <QMouseEvent> //鼠标事件 #include <QPaintEvent> //绘图事件class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent 0);~Wi…

【算法训练-贪心算法 一】买卖股票的最佳时机II

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【贪心算法】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

docker系列6:docker安装redis

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx Docker安装redis 通过前面4节&#xff0c;对docke…

C#中的数组探究与学习

目录 C#中的数组一般分为:一.数组定义:为什么要使用数组?什么是数组?C#一维数组for和foreach的区别C#多维数组C#锯齿数组初始化的意义:适用场景:C#中的数组一般分为: ​①.一维数组。 ②.多维数组,也叫矩形数组。 ③.锯齿数组,也叫交错数组。 一.数组定义: 数组…

Halcon 从基础到精通-02- 开发基于HALCON的应用

HALCON的应用通过HDevelop应用来构建原型。HDevelop的开发主要有3种形式。 Start from Scratch: 手动通过脚本&#xff0c;把HDevelop的代码转化为一般的编程语言。如&#xff0c;上一节提到&#xff0c;其实&#xff0c;每个operators,也许并不一样&#xff0c;需要依据HALC…

云安全之等级保护解决方案及应用场景

等保2.0解决方案背景 适应云计算、移动互联网、大数据、物联网和工业控制等新技术发展&#xff0c;在新的技术场景能够顺利开展等级保护工作;《网络安全法》2016年已正式发布&#xff0c;等级保护2.0为了更好配合《网络安全法》的实施&#xff1b;等级保护1.0&#xff0c;在适…