首页 > 其他分享 >eBPF指定网口丢弃icmp报文

eBPF指定网口丢弃icmp报文

时间:2024-04-14 12:45:35浏览次数:29  
标签:hdr eBPF void bpf 网口 icmp data tc

安装eBPF依赖

# 安装编译工具
apt install -y llvm clang

# 确认内核具有BTF支持,路径存在,内核没有BTF支持,使用vmlinux.h无法通过编译
ls /sys/kernel/btf

# 生成vmlinux.h
# apt install -y linux-tools-generic
apt install -y linux-tools-6.5.0-26-generic
bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h

eBPF丢弃icmp报文

拷贝github.com/cilium/ebpf/examples/headers目录,里面放入vmlinux.h。

代码结构

icmp/drop-icmp.c

#include "../headers/vmlinux.h"
#include "../headers/bpf_endian.h"
#include "../headers/bpf_helpers.h"

#define TC_ACT_SHOT 2
#define TC_ACT_OK 0

#define ETH_P_IP 0x0800

char __license[] SEC("license") = "Dual MIT/GPL";

SEC("tc")
int tc_deny_icmp(struct __sk_buff *skb) {
    void *data_end = (void *)(long)skb->data_end;
    void *data = (void *)(long)skb->data;

    struct ethhdr *eth_hdr = data;
    if ((void *)eth_hdr + sizeof(*eth_hdr) > data_end || eth_hdr->h_proto != bpf_htons(ETH_P_IP)) {
        return TC_ACT_OK;
    }

    struct iphdr *ip_hdr = (void *)eth_hdr + sizeof(*eth_hdr);
    if ((void *)ip_hdr + sizeof(*ip_hdr) > data_end) {
        return TC_ACT_OK;
    }

    if (ip_hdr->protocol == IPPROTO_ICMP) {
        return TC_ACT_SHOT;
    }

    return TC_ACT_OK;
}

编译eBPF程序并加载

# 加-c允许没有main函数,加-target bpf生成ELF,编译优化级别-O2,加-g生成BTF
clang -c icmp/drop-icmp.c -o icmp/drop-icmp.o -target bpf -O2 -g

tc qdisc add dev ens33 clsact
tc filter add dev ens33 egress bpf da obj icmp/drop-icmp.o sec tc
tc filter add dev ens33 ingress bpf da obj icmp/drop-icmp.o sec tc

加载eBPF后无法ping通。

标签:hdr,eBPF,void,bpf,网口,icmp,data,tc
From: https://www.cnblogs.com/WJQ2017/p/18134002

相关文章

  • CH9120网口配置协商及说明
     目录(1)结构体定义(2)通信流程详解1.通信方式2.通信结构体3.通信过程①搜索②获取配置③配置模块④恢复出厂设置(3)说明文档连接 CH9120上位机搜索配置协议(1)结构体定义1#defineMAX_DEVICE_CNT20......
  • [转帖][译] 使用 Linux tracepoint、perf 和 eBPF 跟踪数据包 (2017)
    http://arthurchiao.art/blog/trace-packet-with-tracepoint-perf-ebpf-zh/ 译者序本文翻译自2017年的一篇英文博客 Tracingapacket’sjourneyusingLinuxtracepoints,perfandeBPF ,并添加了章节号以方便阅读。由于译者水平有限,本文不免存在遗漏或错误之处。如......
  • 转载 ebpf sockmap/redirection 提升 socket 性能(2020)
    利用ebpfsockmap/redirection提升socket性能(2020)转自:https://arthurchiao.art/blog/socket-acceleration-with-ebpf-zh/译者序本文翻译自2020年的一篇英文博客 HowtouseeBPFforacceleratingCloudNativeapplications。原文标题非常宽泛,但内容其实很技术:展示了......
  • 大会预告|乘云数字 Databuff 邀请您参加「第二届 eBPF 开发者大会」
    冬去春来,草长莺飞,「第二届 eBPF开发者大会」即将到来。本次大会将于 2024年4月13 日,在陕西省西安市线下举办,由西安邮电大学主办,在西安邮电大学(东区)逸夫教学楼召开。会议介绍大会以「发挥eBPF 技术力量,提升计算机系统可观测性和性能」为主题,议题涵盖eBPF技术及发展......
  • 【Learning eBPF-3】一个 eBPF 程序的深入剖析
    从这一章开始,我们先放下BCC框架,来看仅通过C语言如何实现一个eBPF。如此一来,你会更加理解BCC所做的底层工作。在这一章中,我们会讨论一个eBPF程序被执行的完整流程,如下图所示。一个eBPF程序实际上是一组eBPF字节码指令。因此你可以直接使用这种特定的字节码来编写e......
  • 以太网UDP:心跳包、ICMP与ARP
    参考:https://juejin.cn/post/6844903951452602375心跳包UDP:用户数据报协议:主要用在实时性要求比较高的以及对质量相对较弱的地方.但是面对现在高质量的线路不会容易丢包,除非是一些拥塞条件下,如流媒体TCP:传输控制协议:是面连接的那么运行环境必然要求其可靠性不可丢包,......
  • 3.5 ICMPv6 报文和报文类型
    目录3.5ICMPv6报文和报文类型1.ICMPv6报头2.ICMPv6报文类型3.5ICMPv6报文和报文类型1.ICMPv6报头ICMPv6的报头由type(8bit)\code(8bit)\checksum(16bit)和可变数据组成,由于可变数据太多,这里暂不罗列,由具体协议展开。structicmp6hdr{ __u8 icmp6_type;......
  • 3.6 ICMPv6 报文接收和发送
    3.6ICMPv6报文接收和发送1.ICMPv6数据包接收流程当有IP报头协议是58的数据包到来之后,会调用icmpv6_rcv()进行处理。数据包的处理流程在上面的流程图中说明的非常清楚,下面就来看一下代码是怎么实现的。staticinticmpv6_rcv(structsk_buff*skb){ structnet*net=de......
  • 3.7 ICMPv6 数据包处理
    目录3.7ICMPv6数据包处理1.echo请求和应答2.错误报文处理3.发送错误报文3.1超时差错3.2目的地不可达差错3.3需要分段差错3.4参数异常差错3.7ICMPv6数据包处理1.echo请求和应答处理echo请求:icmpv6_echo_reply()处理echo回应:ping_rcv()staticvoidicmpv6_ec......
  • 3.2 ICMPv4 报文和报文类型
    目录3.2ICMPv4报文和报文类型1.ICMPv4报头2.ICMPv4报文类型3.附录3.2ICMPv4报文和报文类型1.ICMPv4报头ICMPv4是基于IP协议的。所以在ICMPv4的报文外面,还有一层IP报文格式。ICMPv4报头structicmphdr由类型(8位)、代码(8位)、校验和(16位)和可变部分(32位)......