本篇文章参考《Linux  Observability with BPF》中第7章的例子,主要功能是借助于ip命令作为前端,对其他主机访问tcp的8000端口进行限制,这里需要使用较新版本的iproute2软件工具包.

1. 下载编译iproute2 工具包,使用最新的ip命令,支持配置xdp

git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git

在编译iproute2时,需要开启支持libbpf的选项信息,在iproute2目录下配置使用下面的配置选项信息

./configure --libbpf_force=on --LIBBPF_DIR=/usr/local/lib64

执行上面的命令,可能出现下面的错误信息,

确定libbpf的pk-config配置文件位置,/usr/local/lib64/pkgconfig/libbpf.pc  使用

export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig/ 导入libbpf的配置文件,

使用pkg-config --list-all | grep libbpf 查看是否配置libbpf

然后执行,make && make install 进行安装。

2. 编写bpf程序

本bpf程序对于访问本机的tcp的协议的8000端口进行限制,

#include <linux/bpf.h>#include <linux/if_ether.h>#include <linux/in.h>#include <linux/ip.h>#include <linux/if_packet.h>#include <bpf/bpf_helpers.h>#include <linux/if_vlan.h>#include <linux/types.h>#include <linux/tcp.h>#include <linux/udp.h>#include <bpf/bpf_helpers.h>#include <bpf/bpf_endian.h>static __always_inline int get_dport(void *trans_data, void *data_end, int protocol){struct tcphdr *th;struct udphdr *uh;switch (protocol) {case IPPROTO_TCP:th = (struct tcphdr *)trans_data;if ((void*)(th + 1) > data_end)return -1;return th->dest;case IPPROTO_UDP:uh = (struct udphdr *)trans_data;if ((void *)(uh + 1) > data_end)return -1;return uh->dest;default:return 0;}}SEC("mysection")int myprogram(struct xdp_md *ctx) {void *data = (void *)(long)ctx->data;void *data_end = (void *)(long)ctx->data_end;char fmt[] = "source = %d \n";struct iphdr *ip;int dport;int hdport;struct ethhdr *eth = data;struct iphdr *iph = data + sizeof(struct ethhdr);if ((void *)(iph + 1) > data_end) {return XDP_DROP;}dport = get_dport(iph + 1, data_end,iph->protocol);if (dport == -1 || dport == bpf_htons(8000)) {bpf_trace_printk(fmt,sizeof(fmt),bpf_ntohs(dport));return XDP_DROP;}return XDP_PASS;}char _license [] SEC ("license") = "GPL";

使用下面的命令进行编译:clang -g -c -O2 -target bpf -c program.c -o program.o

编译完成后,使用下面的ip命令对某个网卡进行价值xdp文件。

ip link set dev eth0 xdp obj program.o sec mysection

通过上面的命令加载后,在接口上出现加载的xdp的类型和ID,表明加载成功。


使用python3 -m http.server在本地主机上其中http服务器,并监听8000端口。

使用另一台主机上使用nmap命令扫描对方监听的端口。nmap -sS 10.9.4.222,扫描结果如下:

ip link set dev eth0 xdp off 关闭加载的xdp程序。再次使用nmap扫描

BPF学习笔记(六)-- 使用bpf实现xdp的例子相关推荐

  1. Ethernet/IP 学习笔记六

    Ethernet/IP 学习笔记六 EtherNet/IP defines two primary types of communications: explicit and implicit (Ta ...

  2. 吴恩达《机器学习》学习笔记六——过拟合与正则化

    吴恩达<机器学习>学习笔记六--过拟合与正则化 一. 过拟合问题 1.线性回归过拟合问题 2.逻辑回归过拟合问题 3.过拟合的解决 二. 正则化后的代价函数 1.正则化思想 2.实际使用的 ...

  3. ROS学习笔记六:理解ROS服务和参数

    ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...

  4. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  5. JS学习笔记六:js中的DOM操作

    1. JS学习笔记六:js中的DOM操作 文章目录 1. JS学习笔记六:js中的DOM操作 1.1. 获取Dom节点 1.2. 元素属性的操作方式 1.3. DOM节点的创建.插入和删除 1.4. ...

  6. Python学习笔记六——画小猪佩奇

    目录 Python学习笔记六--画小猪佩奇 画布 画笔 属性设置 操纵命令 运动命令 画笔控制命令 全局控制命令 其他命令 Python学习笔记六--画小猪佩奇 使用Python的turtle库可以绘 ...

  7. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  8. Polyworks脚本开发学习笔记(六)-比较运算、数学运算、逻辑运算及流程控制

    Polyworks脚本开发学习笔记(六)-比较运算.数学运算.逻辑运算及流程控制 前言 比较运算.逻辑运算及流程控制是编程的基本语法,Polyworks的语法规则与VB/C#/Python等并没有很大 ...

  9. 【K210】K210学习笔记六——MaixHub在线模型训练识别数字

    [K210]K210学习笔记六--MaixHub在线模型训练识别数字 前言 K210准备工作 数据的获取 MaixHub如何在线训练模型 训练模型在K210上的测试 小结 前言 本人大四学生,电赛生涯 ...

  10. Java学习笔记 六、面向对象编程中级部分

    Java学习笔记 六.面向对象编程中级部分 包 包的注意事项和使用细节 访问修饰符 访问修饰符的注意事项和使用细节 面向对象编程三大特征 封装 封装的实现步骤(三步) 继承 继承的细节问题 继承的本质 ...

最新文章

  1. 常用的数据结构-链表
  2. linux如何编辑启动项,Ubuntu 11.04 启动项的修改
  3. 帮助你更好理解javascript中easing功能的网站 - Easings.net
  4. ECharts - 地图
  5. Python3 写JSON数据到文件(多行格式化版)
  6. Flask 源代码阅读笔记
  7. 内核对象和句柄的介绍及注意事项
  8. python程序语言的提示符是什么_Python基础之语言简介
  9. pyTorch基础入门练习
  10. Unity采用Forge Networking Remastered数据的远程传输 Basic RPC Example
  11. ubuntu20.04安装simhei字体--jupyter中文显示框框的解决方案
  12. 【小白】线性表的链式存储结构的实现(C语言版)
  13. Spark编程基础-(一)大数据技术概述
  14. 基于单片机的液体点滴速度监控设计
  15. 安装了MyIM,试验后感觉还不错
  16. 华为防火墙简介及其工作原理
  17. node+ npm + yarn 安装及上手
  18. dellr740服务器智能风扇开启,dell r740服务器 BIOS设置
  19. mdb实时同步mysql_Mysql的实时同步 - 双机互备
  20. php 开源产品,PHP免费开源企业产品建站系统含手机站

热门文章

  1. 2019计算机考研试卷难度,2019考研:计算机统考408院校及难度分析
  2. P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
  3. 什么是hql,与sql的区别
  4. python--爬虫入门(七)urllib库初体验以及中文编码问题的探讨
  5. Linux 浏览器访问PHP显示源码
  6. 八.deepin V20.6安装mysql8.0.30
  7. 启之航:抖音小店的新品优化怎么做?
  8. vatic—视频标注工具安装出现error及注意事项
  9. JetsonNano国产套件成功部署YoloV5手把手图解教程
  10. 全能型终端神器!好用、免费!