「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官网例子.

路漫漫其修远兮,

Reference