「93」ebpf之XDP
一转眼就2023了,好多文章都在2022没有发出来,成为了Drafts…
最近在搞Linux(瞎搞)的iptables防火墙,有一次被tcp attack了,当时想着iptables怎么都够了,结果没有想到的是:
CPU近乎满载(后模拟了下,是cpu软中断占用过高).
还有一次被dns udp投毒了恶心到了,
开门见山吧,cpu 软中断问题,是这次致命的,用替代的方案ebpf可以比较好的解决(不能完全避免).
¶iptables分析
¶优势:
- 简洁
- 易用
- 规则可查
- 可随处google/baidu
¶短板
(如果你是iptables的raw/bpf级别的用户,就别往下看了,你已经巅峰[疯]了).
- 更新规则需要重新reload ALL,更新后加载成本太高过高(尤其是过w的规则).
- 匹配效率O(n),线性的.
¶ebpf 替代 iptables
¶介绍(不翻译,自己食用—>ebpf官网):
简单的说,code被JIT编译成字节码,通过挂载的方式,挂到内核指定区域.
结构图:
¶优势:
- 性能好
- 安全+方便
- 可编程/定制化
- 可追踪能力(probe).
¶前期卡点:
- 需要开发者有一定的编程能力
- 对内核需要一定了解(推荐两个著作)
¶开发流程
¶开发语言:
支持ebpf的即可[rust/go/c/c++等], 这里用的是rust实现.
¶推荐库
随便哪一个皆可.
¶开发模版:
按教程版来,一个简单的bpf程序没什么问题,开发过程就不讲了,完全看理解了(网络模型/linux内核/IO模型/三态).
https://aya-rs.dev/book/
¶性能对比(终态)
这次实现功能比较多:
- 防ddos
- 防syn flood
- 禁用icmp
- white ip
- disable udp/tcp/arp等
- 开放指定端口
- dns防投毒
- mac地址可校验
- 指纹学习匹配,防sliding window attack(需要跑一段时间学习指纹)
- 等等(还在继续添加中)
这里通过: 1、开启iptables 2、开启ebpf 3、关闭所有防护(没意义,裸奔挨打的状态)
主要比较前两种.
¶测试方法
- 开启iptables,关闭ebpf,两个服务器(A、B)对C服务器进行hping3模拟.
- 关闭iptables,开启ebpf,两个服务器(A、B)对C服务器进行hping3模拟.
主要观察cpu各个状态.
¶开启iptables,关闭ebpf
左上用mpstat显示的cpu和IO等信息.
右上是iptables仅开放2022(ssh端口),其余所有都drop掉.
右中是nload显示的实时带宽信息.
-
单个tcp模拟攻击:
-
两个tcp模拟攻击
重要的两个信息:
attack/percent | cpu 软中断 | idle(闲置) | cpu占用 |
---|---|---|---|
单个 | 5.9% | 78% | 19% |
两个 | 14% | 68% | 32% |
¶关闭iptables,开启ebpf
-
单个tcp模拟攻击:
-
两个tcp模拟攻击
模拟攻击个数/百分比 | cpu 软中断 | idle(闲置) | cpu占用 |
---|---|---|---|
单个 | 1.08% | 87% | 15% |
两个 | 1.16% | 88% | 17% |
¶结论
可以看到随着模拟攻击server越来越多,被攻击的服务器cpu占用越来越高,中断占用也越来越高,
最后肯定会崩了.
当然ebpf还有很多用处,可以参考学习bpf进阶笔记和ebpf官网例子.
路漫漫其修远兮,