自基于Netfilter的iptables取代ipchains之后,Linux防火墙技术貌似一直停留在iptables,虽然近年来nftables被宣称有取代iptables之势,但事实上并无起色。

无论是晚期ipchains,还是iptables,或者nftables,其底层基础均是Netfilter,一个精心设计的五点HOOKs框架,在软件意义上,这个设计非常棒,但是涉及到单机性能问题,总是退让三分。

这让人不得开心颜,于是很多人花大量的时间精力投入到了防火墙优化中,当然,包括我自己在内。


如今,新一代的Linux防火墙技术出现了!是的,它就是基于eBPF的bpfilter!

eBPF是一个非常古老但最近才大行其道的技术,Linux内核中被埋下了越来越多的eBPF调用点,bpfilter正是基于这些非固定的,不断增多的HOOK点来其作用的,这和Netfilter固定的HOOK非常不同。

比如,XDP就是一个eBPF调用点。它位于网络协议栈的最底层,网卡层面,这里做数据包过滤非常高效,并且可以依托硬件特性将数据包过滤行为offload到硬件中,很棒的主意。

看起来非常令人遗憾的是,BPF(伯克利包过滤器)从名字上看虽然本身就是一个包过滤器,但是对于Linux系统而言,在包过滤领域,BPF除了用于抓包之外,在其它方面很少其关键作用。

不过,现在它的时代来了。事情正在起变化。

目前Linux内核中,XDP,TC,Socket是TCP/IP网络协议栈中三个关键的eBPF程序的调用点,可以想象,这种eBPF调用点会越来越多,它不像Netfilter那样是固定的5个或者说几个HOOK点。

所谓的eBPF调用点理解起来非常简单,就是在这些点上,内核会调用通过用户态灌进来的eBPF字节码,目前在网络协议栈领域最常用的eBPF调用点就是XDP了。

好了,大致框架就是以上这些,下面是试一试的时间。

为了让这一切run起来,我们要解决几个问题:

  • 如何编写eBPF过滤程序。
  • 如何编译eBPF过滤程序。
  • 如何将编译好的eBPF字节码灌进XDP。

目前,bpfilter的POC已经完美回到了上面的问题,详见:
https://lwn.net/Articles/747504/
https://www.netronome.com/blog/bpf-ebpf-xdp-and-bpfilter-what-are-these-things-and-what-do-they-mean-enterprise/
很棒的一个点就是,为了让iptables平滑过渡,bpfilter准备了一个非常trick的机制,可以将配置下发下来的iptables规则JIT编译成eBPF字节码到XDP。

然而这些都是宏观的东西,下面我来演示一下Step by Step的微观细节,我要解决一个实际问题,即:

  • 禁止enp0s3所有数据包。

如何编写eBPF程序呢?很容易,下面的C代码便是:

#include <linux/bpf.h>#define __section(NAME)  \__attribute__((section(NAME), used))__section("prog")
int drop_all(struct xdp_md *ctx)
{return XDP_DROP;
}char __license[] __section("license") = "GPL";

如何编译它呢?

root@zhaoya-VirtualBox:~/xdp# clang -Wall -target bpf -c simple.c -o simple.o

如何使能它到enp0s3呢?

root@zhaoya-VirtualBox:~/xdp# ip link set dev enp0s3 xdp obj simple.o

作为骨灰级的Netfilter,iproute2玩家,我是一直跟随着最新进展,iproute2真的牛X到不行。

很多年前我玩Cisco ACL就知道,Cisco的做法是将ACL规则优化编译加载到网卡,如今Linux的eBPF字节码在XDP运行,也是一样的路子。

循序渐进,下面的例子稍微有点难度,需要自己来解析数据包,禁止所有的TCP数据包:

#include <linux/bpf.h>
#include <linux/in.h>
#include <linux/if_ether.h>
#include <linux/ip.h>#define __section(NAME) __attribute__((section(NAME), used))__section("prog")
int drop_tcp(struct xdp_md *ctx)
{int ipsize = 0;void *data = (void *)(long)ctx->data;struct iphdr *ip;ip = data + sizeof(struct ethhdr);if (ip->protocol == IPPROTO_TCP) {return XDP_DROP;}return XDP_PASS;
}char _license[] __section("license") = "GPL";

难道我们为了编写一条数据包过滤规则都要写个C程序吗?很多人并不具备编程能力,或者仅仅是不精通C,看起来根本没有必要必须写一个C程序。

好在有很多的前端可以帮我们生成字节码。

事实上我们常用的tcpdump就有这样的功能,当我们用-d,-dd执行tcpdump时,打印出来的就是过滤程序:

root@zhaoya-VirtualBox:~/xdp# tcpdump -i enp0s3 dst 11.22.33.44 -d
(000) ldh      [12]
(001) jeq      #0x800           jt 2    jf 4
(002) ld       [30]
(003) jeq      #0xb16212c       jt 8    jf 9
(004) jeq      #0x806           jt 6    jf 5
(005) jeq      #0x8035          jt 6    jf 9
(006) ld       [38]
(007) jeq      #0xb16212c       jt 8    jf 9
(008) ret      #262144
(009) ret      #0
root@zhaoya-VirtualBox:~/xdp# tcpdump -i enp0s3 dst 11.22.33.44 -dd
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 2, 0x00000800 },
{ 0x20, 0, 0, 0x0000001e },
{ 0x15, 4, 5, 0x0b16212c },
{ 0x15, 1, 0, 0x00000806 },
{ 0x15, 0, 3, 0x00008035 },
{ 0x20, 0, 0, 0x00000026 },
{ 0x15, 0, 1, 0x0b16212c },
{ 0x6, 0, 0, 0x00040000 },
{ 0x6, 0, 0, 0x00000000 },
root@zhaoya-VirtualBox:~/xdp#

唉,又要搬家,这种日子持续了将近5年,终于快要结束了。作于两趟搬运之间的间隙,腰酸背痛!


浙江温江皮鞋湿,下雨进水不会胖。

eBPF用于Linux防火墙数据包过滤相关推荐

  1. linux重新分区丢失数据恢复,用于Linux上数据及被删除分区恢复的5个最佳数据恢复工具...

    ------ 什么是数据恢复(Data Recovery)? 数据恢复是当数据不能正常访问时,从损坏/报错/讹误或不可访问的磁盘介质上进行数据拯救的一个过程. 被拯救的数据通常存放在存储介质如内部或外 ...

  2. linux 防火墙配置规则

    基础知识 Linux系统内核内建了netfilter防火墙机制.Netfilter(数据包过滤机制),所谓的数据包过滤,就是分析进入主机的网络数据包,将数据包的头部数据提取出来进行分析,以决该连接为放 ...

  3. 基于Linux系统的包过滤防火墙

    第1 章.基于路由器的包过滤防火墙 1.1 包过滤防火墙的一般概念 1.1.1 什么是包过滤防火墙 包过滤防火墙是用一个软件查看所流经的数据包的包头(header),由此决定整个包的命运.它可能会决定 ...

  4. 《Linux防火墙(第4版)》——2.3 对一个数据包的驳回(Rejecting)VS拒绝(Denying)...

    本节书摘来自异步社区<Linux防火墙(第4版)>一书中的第2章,第2.3节,作者:[美]Steve Suehring(史蒂夫 苏哈林)著,更多章节内容可以访问云栖社区"异步社区 ...

  5. linux防火墙为空文件夹,如何记录Linux IPTables防火墙丢弃的数据包到日志文件-linux防火墙设置...

    如果您的IPTables规则无法正常工作,则可能需要记录IPTables丢弃的数据包以进行故障排除.本文解释如何记录传入和传出丢弃的firewal数据包. 记录所有丢弃的输入数据包 首先,我们需要了解 ...

  6. linux查找数据包contr,基于Linux防火墙的P2P报文识别研究-计算机技术专业论文.docx...

    基于Linux防火墙的P2P报文识别研究-计算机技术专业论文 掣哪炒I掣j!:|l哕必磐 掣哪炒I掣j!:|l哕必磐Y1 9 1 7709 原创性声明 本人声明,所呈交的学位论文是本人在导师指导下进行 ...

  7. 防火墙关于安全域和数据包过滤策略

    根据视频学习,视频链接:https://www.ixigua.com/6809663667013943822?id=6804365091614491149&logTag=50ea4eaeb3d ...

  8. linux修改redis的访问ip不生效,linux系统中 redis 保存数据的5种形式 linux后端模式启动 jedis无法通过IP地址和端口号访问如何修改linux防火墙...

    vim修改redis.conf配置文件(我的已经复制到虚拟机的/usr/local/redis/bin目录下)为daemonize yes, 以后端模式启动 ./redis-server redis. ...

  9. Linux防火墙与iptables命令

    Linux防火墙与iptables命令 防火墙概念 一.Firewalld与iptables简介 1.1Firewalld 1.2Firewalld.iptables 二.iptables 2.1四表 ...

最新文章

  1. 使用FgSegNet进行前景图像分割
  2. mysql表连接_mysql表连接
  3. Libcurl的介绍
  4. 千橡CEO给应聘者的信
  5. pytorch 中的数据类型,tensor的创建
  6. sob攻略超详细攻略_2020成都超详细旅游,美食攻略
  7. 【089】◀▶ Microsoft Office 技巧
  8. linux mysql端口启动失败怎么办,Linux下apache mysql等服务修改默认端口后无法正常启动解决办法...
  9. 第二次冲刺阶段第三天
  10. Vissim安装及配置详解
  11. linux如何搭建sftp服务器
  12. 使用Bus Hound抓USB转串口数据包,助力问题分析
  13. 毕业设计-基于 MATLAB 的图像分割算法研究及实现
  14. 如何在不同的窗口中打开多个Excel
  15. 农场元宇宙Plato Farm,乌托邦式田园生活
  16. iOS流布局UICollectionView系列七——三维中的球型布局
  17. linux ls ',Linux ls命令 - Linux 教程 - 自强学堂
  18. 计算机听不到音乐怎么回事,电脑显示有声音,可是一直听不到声音怎么办
  19. 新手程序员想兼职却没有渠道?来看资深程序员在哪接单!
  20. 【Android-音乐类】音友 免费下载、试听、全网最全的音乐 还不快来白嫖~

热门文章

  1. 用python输出斐波那契数列的前20项_python输出斐波那契数列
  2. OSI七层模型和TCPIP五层模型
  3. 10【matplotlib常用统计图】02绘制条形图
  4. 简单理解:人工智能、数据挖掘、模式识别、机器学习、深度学习
  5. 周志华、贾扬清入选!2022中国高被引学者榜单揭晓,计算机界214人上榜
  6. 网页密码查看器+原代码+windows密码查看
  7. rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+;
  8. 2018年吉林大学软件学院软件工程学硕复试笔试题回忆
  9. (转)2018pycharm破解
  10. 55. Jump Game(跳跃游戏)