编辑
2023-08-13
Linux
00

iptables一直不懂,对它的一些概念望而生畏,写一篇文档记录。iptables最直观的作用就是防火墙,在内核里边设置一些包过滤规则,内核会基于这些规则来实现各种各样的功能 NAT 转发,包的丢弃,IP包转发过程中的TTL的修改等。

编辑
2023-08-13
Linux
00

namespace 与 cgroup 是容器的两个基本技术,namespace的作用是保证资源的隔离,不同进程之间所看到的资源是完全独立的,譬如说一台物理机可以实现多个绑定在80端口的web服务,这是容器常见的一种应用。而cgroup的作用是资源的限定,可以对某一组进程限定它们可使用的 CPU 而避免CPU被独占。cgroup的简介可以参考wiki-cgroup

编辑
2023-08-13
eBPF
00

之所以学习 tc-bpf 是之前想编写一个流量监控的组件,使用的方案是分别在流量的出入口使用kprobe挂载 eBPF 程序,挂载点选取的是__dev_queue_xmit(往外发送流量),在当时遇到的问题是接受流量的挂载点没有找到合适的,参考了这篇文章以后选取了几个挂载点都无效(实际上该问题还是因为挂载点的选取问题),在stackoverflow 上提问有好心人提示可以用 tc-bpf来实现。

对于 tc-bpf描述较为完善的文档只有这篇博客,本文的大部分内容也是参考该文并且实现了一个demo项目,目的是用tc-bpf监控网卡上出入流量的字节数。学习tc-bpf最好先对tc 有基本认识,否则很难理解相关概念

编辑
2023-08-13
Linux
00

tc(traffic control)是用于流量控制的,不过其命令相当复杂,涉及到的名词和概念不少,无奈也没看到特别好的文章。带着问题去学习。假设我们是内核的开发者,会以什么样的数据结构去设计流量控制。首先想到的想法应该是用队列,进一步的考虑队列应该有优先级,优先级高的队列内的packet先出去,比如说ssh的实时交互性数据应该比wget下载大文件的优先级更高。还需要实现限流,这主要是避免发送太多的流量导致链路被冲垮,也避免网卡流量被某一进程独占其他进程无法分配到网络带宽。当然tc所支持的功能更加复杂, 下面是 tc 的基本功能,来源-man page:

编辑
2023-07-10
eBPF
00

在最近这一段时间,我们使用 eBPF 实现了一些监控组件,在这过程中因为 eBPF 的一些兼容性遇到不少问题。包括头文件的引入、低版本内核使用 BTF 等,同时我们没用使用 bcc 来作为 eBPF 前端,而是使用了cilium/ebpf(下文简称ebpf-go),它提供了一层 Go 的接口来操作 eBPF 程序,不过因为该项目和 repo 内示例程序较为简单,在实际开发中还是遇到了一些编程上的问题。本篇的主要是围绕着 BPF CO-RE的相关介绍,并且将我们在实际开发中使用 BPF CO-RE 和 ebpf-go相关的问题以及解决办法分享出来。

限于篇幅,本篇文章并不是 eBPF 的入门文章,为了能够彻底理解文章的内容,读者最好有 eBPF、bcc、ebpf-go 的基本使用经验。