Skip to content

nevermosby/linux-bpf-learning

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 

Repository files navigation

学习Linux BPF XDP编程

相关博文参考

环境准备

  • Linux操作系统,推荐使用最新稳定内核版本.

    本人自己的实验环境是Ubuntu 18.04标准版vagrant虚拟机,内核版本为4.15.0。可以从这里下载该vagrant虚拟机环境,已安装bcc工具集合:

    下载链接: https://pan.baidu.com/s/11dsEU6Yk6KGDGNor-fbsgQ 提取码: qvhc

    以下命令如无特殊说明,均在Ubuntu环境下测试执行。

  • 预装clang、LLVM、iproute2、libelf-dev

    # for ubuntu
    apt install clang llvm libelf-dev
    # test clang
    clang -v
    # test llvm
    llc --version
    # test iproute2
    ip link

运行第一个XDP程序

  1. 编写代码,文件名xdp_drop_all.c
     #include <linux/bpf.h>
     int main() {
       # 意思是无论什么网络数据包都drop丢弃掉
       return XDP_DROP;
     }
  2. 编译代码,生成obj文件
    clang -O2 -target bpf -c xdp_drop_all.c -o xdp_drop_all.o
  3. attach xdp 程序到主机网卡上
    # 通过ip link查询主机上的可用网卡设备名称,一般可以选取本机对外可以访问的IP所在的网卡设备
    ip link set dev [network-device-name] xdp obj xdp_drop_all.o sec .text
  4. 测试
    • 使用tcpdump命令监测网络数据包传输情况
    • 使用ping命令创造测试网络数据包
  5. 从主机网卡上detach xdp 程序
    ip link set dev [network-device-name] xdp off

完整Demo视频

xdp-bpf-demo

基于Docker运行第二个XDP程序

#include <linux/bpf.h>

#define SEC(NAME) __attribute__((section(NAME), used))

SEC("xdp")
int xdp_drop_all(struct xdp_md *ctx)
{
	return XDP_DROP;
}

参考材料

About

learn how to use BPF/eBPF

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published