网络隔离场景下访问 Pod 网络

接着上文 VPC网络架构下的网络上数据采集

介绍

        考虑一个监控系统,它的数据采集 Agent 是以 daemonset 形式运行在物理机上的,它需要采集 Pod 的各种监控信息。现在很流行的一个监控信息是通过 Prometheus 提供指标信息。

        一般来说,daemonset Agent 会使用物理机网络(就算有自己的网络也没关系),它需要通过 ICMP、TCP、HTTP 等协议访问目标 Pod。这在一般的 k8s 场景下是没问题的,因为此时 daemonset Agent 与 目标 Pod 之间的网络是通的,没有隔离。

        而在一些公有云或多租户环境下, 一个物理机上实际分给了好几个租户,此时网络安全管理员往往会限制物理机网络与 Pod 网络是隔离的。这么一搞我们原本的整套链路都不工作了。当然,网络安全管理员这么做是师出有名,并且确实是必要的。但这种方案确实没有给监控场景留一条活路,我们也很难受。

        本文分享几种方案从不同角度突破了这种隔离,当然它们并不一定通用,更多的是为监控场景服务。

可能涉及到的技术或概念

  • Input / Output Stream
  • command exec
  • Linux namespace 、nsenter
  • docker exec / docker SDK
  • unix domain socket / abstract unix domain socket, 以下简称 uds 或 abstract uds
  • socat

基于 Linux namespace 的方案

        如果你使用的是标准的 docker/containerd/runc 或 containerd/runc 的组合,并且对 docker、runc 的实现原理有一些了解,那么你应该听说过 Linux namespace。本文不再介绍 Linux namespace 与 docker、runc 的关系。

        Agent 想与 pod:ip 建立 TCP 连接,只需要将当前线程 network namespace 切换到目标 pod 的 network namespace,这样对于当前线程来说它就进入了目标 pod 的网络,此时你再执行 `net.Dial` 那就能连接上了.

        可以参考下面链接的代码.

https://github.com/traas-stack/holoinsight-agent/blob/main/pkg/cri/cricore/nsenter_linux.go#L52

        linux 有个命令叫 nsenter 本质它就是直接切换的 namespace 然后执行命令, 感兴趣的可以看一下.        

基于 docker sdk exec 的方案

        这里的 docker sdk exec 指的是通过 docker sdk 执行 exec 命令, 而非命令行里的 docker exec. 这样做效率更高一些.

       基于 Linux namespace 的方案只能适用于 runc 容器运行时. 遇到其他容器运行时就不工作了.

但无论怎么变,底层的 CRI 实现总是会提供类似 docker exec、containerd exec 的功能。

        我们可以想办法往目标容器里放一个辅助流量转发的 binary,这个 bianry 从 stdin 读数据,然后写到目标 pod:port, 从目标 pod:port 读数据, 然后写到 stdout. 通过 docker exec 执行该 binary 让其转发流量.

        可以参考如下链接的代码

https://github.com/traas-stack/holoinsight-agent/blob/main/pkg/cri/criutils/tcpproxy.go#L31

        如果直接用 docker sdk exec 方案的话,它对代码的修改比较大。需要配合基于 HTTP 代理 或 socks5 代理才能减少对代码的侵入性。

        docker sdk exec 提供了一种通用的方式用于请求转发, 在我遇到的所有场景里, 它都可以工作. 当然由于它是基于命令行执行的, 因此执行效率会低一些, 使用的时候要考虑这一点.

        考虑到 k8s 提出了自己的 CRI 规范, 而不再强依赖 docker/containerd 的实现API. 因此我们之后应该直接面向 CRI 编程.

        但是 CRI 也有一些缺点:

  • CRI 的初始化步骤比较麻烦, 不像 docker 只需要指定其 unix domain sock 地址就行了.
  • CRI 的 exec 无法指定 user/workdir/env

某些特定容器运行时有建立 proxy 的功能

        在实践中,某些以安全为特点的容器运行时也考虑到了网络隔离问题,因此它们往往具备建立 Proxy 的能力。

        以某个基于 VM 的容器运行时为例。

        它会有 2个 netns: VM 有一个,Pod 有一个。

        VM 的 netns 我们可以从 docker inspect 的信息中看到,而 Pod 的 netns 我们无法看到(也无法访问,不在一个 Linux 内核里)。

        该容器运行时提供了一个命令,它可以连接 VM netns 和 Pod netns 里的 2 个 abstract uds。甚至可以做到连接 2 个 netns 里的 ip:port (其实就是做一层转发).

        Agent 可以通过 setns 的方式进入 VM 的 netns,再利用上述命令即可打通 Agent 到 目标 Pod 的 ip:port。

        创建 proxy 时需要选择方向:

  • VM 主动建连 Pod,需要在 Pod 上 Listen
  • Pod 主动建连 VM,需要在 VM 上 Listen

基于 HTTP 代理的方案

        假设 Agent 访问 Pod 用的是 HTTP 协议。

        我们在 Agent 上实现一个 HTTP 代理服务器,Agent 访问 Pod 时配置 HTTP proxy,这样流量就会发到 HTTP 代理服务器上。在该代理服务器的实现里,我们读取请求序列化为 []byte,通过 docker exec 将该请求序列化的 []byte 作为 stdin 传入调用容器内部的辅助程序。辅助程序启动后从 stdin 读数据并反序列化出 HTTP 请求,辅助程序在容器内部访问 http://pod:port 是一定可以通的。辅助程序将 http://pod:port 的返回结果写到 stdout 里。HTTP 代理服务器实现读 docker exec 的 output 转成对应的 http.Response 即可。

        可以参考下面链接的代码.

https://github.com/traas-stack/holoinsight-agent/blob/main/pkg/cri/impl/netproxy/proxy_http.go#L118

基于 socks5 代理的方案

        比 HTTP 更通用的场景是 TCP 级的代理,常见的是 socks5 代理。

比如你想要通过 mysql 命令连到隔离的目标容器里,mysql 讲的显然是它自己的协议不是 HTTP,此时 TCP 级别的代理就派上用场了。我们只需要在 mysql 建连的地方设置 socks5 proxy 就行。

        刚好有一个开源软件 socat 可以从 标准流 双向拷贝到一个 TCP 流, 所以我上面的图用的是 socat. 但实际情况中, 目标容器里并不一定有 socat. 所以实际情况中我们会复制一个辅助 binary 到容器内部, 该 binary 实现了类似的功能.

        可以参考下面链接的代码.https://github.com/traas-stack/holoinsight-agent/blob/main/pkg/cri/impl/netproxy/proxy_socks5.go

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

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

相关文章

低功耗蓝牙(BLE) 和 经典蓝牙(SPP) 的区别

低功耗蓝牙(BLE) vs 经典蓝牙(SPP) 区别项低功耗蓝牙(BLE)经典蓝牙(SPP 串行端口协议)蓝牙版本蓝牙版本 > 4.0,又称蓝牙低功耗、蓝牙智能经典蓝牙2.0 或更早版本,经典配对模式在两台蓝牙设备之间建立虚拟串口数据连接,提供一种简单而直接…

06.VLAN、Trunk和Hybrid配置

文章目录 一. 初识VLAN1.1. VLAN概述1.2. VLAN的优势1.3. VLAN的帧格式1.4. 接口链路类型1.5. 默认VLAN1.6. VLAN划分方式 二. 实验题2.1. 实验1:划分VLAN2.1.1. 实验目的2.1.2. 实验拓扑图2.1.3. 实验步骤(1)配置PC机的IP地址(2&…

stable diffusion学习笔记——文生图(二)

LORA和Embeddings都可以对画面内容进行调整。目前LORA主要用来定义画面特征,如具体的人物,衣物,画风等。Embeddings目前主要用于反面提示词中,用来避免错误的画面表现。 LORA lora的全称为:低秩适应模型。lora的基本…

05. 交换机的基本配置

文章目录 一. 初识交换机1.1. 交换机的概述1.2. Ethernet_ll格式1.3. MAC分类1.4. 冲突域1.5. 广播域1.6. 交换机的原理1.7. 交换机的3种转发行为 二. 初识ARP2.1. ARP概述2.2. ARP报文格式2.3. ARP的分类2.4. 免费ARP的作用 三. 实验专题3.1. 实验1:交换机的基本原…

常用芯片学习——AMS1117芯片

AMS1117 1A 低压差线性稳压器 使用说明 AMS1117 是一款低压差线性稳压电路,该电路输出电流能力为1A。该系列电路包含固定输出电压版本和可调输出电压版本,其输出电压精度为士1.5%。为了保证芯片和电源系统的稳定性,XBLWAMS1117 内置热保护和…

Nulls: Nothing to Worry About

本文是文章Nulls: Nothing to Worry About的翻译笔记。 避免三值逻辑出现问题。 ISO SQL 标准中的NULL可以是任何东西,但不是一个值。 NULL是指示完全缺乏值的标记。 它们会导致三值逻辑,使用起来很混乱,而且这种混乱常常导致粗心的人编写返…

20240126收获

el-table比较常见的需要跳转column的场景,目前遇到三种,一种是前面列变成序号,用的是typeindex和:index来设置索引,第二种是变成多选,用的是typeselect和在table上加上select-change事件,第三种…

指针操作一维字符型数组和及回调函数------努力学习嵌入式的第十四天!今天的内容让人脑瓜子嗡嗡的 着重复习

总结 1.快速排序 注意: 第二三步并不能反过来 要想降序排列只需要加将比较的符号换一下 2.指针操作一维字符型数组 (const) char *s "hello"; *sH; //错误 char s[]"hello"; s[0] B char *strncpy(char *d…

掌握 Android JNI 基础

写在前面 最近在看一些底层源码,发现 JNI 这块还是有必要系统的看一下,索性就写一写博客,加深加深印象🍻 本文重点聊一聊一些干货,避免长篇大论 JNI 概述 JNI 是什么? 定义:Java Native In…

全国网络安全行业职业技能大赛WP

word_sercet 文档被加密 查看图片的属性 在备注可以看到解压密码 解密成功 在选项里面把隐藏的文本显示出来 可以看到ffag easy_encode 得到一个bmp二维码 使用qr research 得到的密文直接放瑞士军刀 base32解码base64解码hex解码 dir_pcap 直接搜索flag 发现flag…

C++ 程序使用 OpenCV 可视化和分析两个图像之间特征点的对应关系

文章目录 代码功能源码文件编译文件 代码功能 创建图像和生成随机特征点: 程序首先创建两个灰度图像(m_image_Left_BGR 和 m_image_Right_BGR),并将它们转换为彩色图像。然后,生成两组随机特征点(mvKeys 和…

线段树分治总结

线段树分治总结 概念例题二分图 /【模板】线段树分治[HAOI2017] 八纵八横[FJOI2015] 火星商店问题EnvyExtending Set of PointsForced Online Queries Problem「雅礼集训 2018 Day10」贪玩蓝月BZOJ4184-shallot[bzoj4644]经典**题 概念 \qquad 线段树分治一般用来解决带有如下两…

强敌环伺:金融业信息安全威胁分析——整体态势

从早期的Zeus和其他以银行为目标的特洛伊木马程序,到现在的大规模分布式拒绝服务(DDoS)攻击,再到新颖的钓鱼攻击和勒索软件,金融服务业已成为遭遇网络犯罪威胁最严重的行业之一。金融服务业的重要性不言而喻&#xff0…

浙政钉(专有钉钉)

专有钉钉是浙政钉的测试版本,可在正式发布之前进行业务开发。 专有钉钉 原名政务钉钉 是高安全、强管控、灵活开放的面向大型组织专有独享的协同办公平台。支持专有云、混合云等多种方式灵活部署,以满足客户特定场景所需为目标,最大化以“平…

Docker 搭建MySQL主从复制-读写分离

一. 介绍 MySQL主从复制是一种常用的数据库高可用性解决方案,通过在主数据库上记录的数据变更,同步到一个或多个从数据库,实现数据的冗余备份和读写分离。在Docker环境下搭建MySQL主从复制和读写分离,不仅方便管理,还…

【干货】【常用电子元器件介绍】【电容】(二)--电容器的主要参数、测量、选择与应用

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 一、 电容器的主要参数 1.1 耐压 耐压(Voltage Rating)是指电容器在电路中长期有效地工作而不被击穿所能承受的最大直流电压。对于结构、介质、容量相同的…

Linux--redhat9创建软件仓库

1.插入光盘,挂载镜像 模拟插入光盘: 点击:虚拟机-可移动设备-CD/DVD 设备状态全选,使用ISO影响文件选择当前版本镜像,点击确认。 2.输入: df -h 可以显示,默认/dev/sr0文件为光盘文件,挂载点为/run/media/root/镜像…

Linux(CentOS7)常见指令的常见用法(上)

指令功能hostname查看当前的主机名hostnamectl set-hostname修改主机名adduser添加用户passwd给用户设置密码userdel -r 删除用户ls显示某路径下的文件名ls -l ll 显示某路径下每个文件及其属性ls -la ls -al 显示某路径下所有文件包括隐藏文件及属性ls -d只看指定文件夹&…

ElementUI安装与使用指南

Element官网-安装指南 提醒一下:下面实例讲解是在Mac系统演示的; 一、开发环境配置 电脑需要先安装好node.js和vue2或者vue3 安装Node.js Node.js 中文网 安装node.js命令:brew install node node.js安装完后,输入&#xff1…

第九节HarmonyOS 常用基础组件18-checkBox

1、描述 提供多选框组件,通常用于某选项的打开或关闭。 2、接口 Checkbox(options:{name?: string, group?: string}) 3、参数 参数名 参数类型 必填 描述 name string 否 多选框名称 group string 否 多选框群组名称。(未配合使用Chec…
最新文章