文章目录

  • 项目背景
  • 项目设计
    • BPF Map 定义
    • BPF Prog 定义
    • CT 状态转换
  • 实验环境
    • 系统版本
    • Namespace 网络环境
    • 安装CT程序
    • 挂载 eBPF 程序
  • 后记

项目背景

连接跟踪(conntrack)是网络应用非常非常的基础,比如有状态防火墙 (firewall),网络地址转换(nat),负载均衡(lb)。Linux conntrack 是 基于 netfilter 实现的,如图所示,分别在 PREROUTING, POSTROUTING 位置前 和后对网络报文进行跟踪;

但是 XDP 位置在进入网络栈之前,无法利用到内核栈的 conntrack 能力, Cilium 应该遇到同样的问题, 所以 Cilium 基于 eBPF 实现了 conntrack;如 图所示,

换句话说,只要具备 Hook 能力,能拦截进出主机的每个报文,完全可以实 现一套连接跟踪功能, 这个该项目的核心思路。结果如图:

{"code":200,"traceId":"0ed9b475-eb36-454d-91eb-e3c283ed3df9","Conn":["icmp est period=0 src=172.20.56.105 dst=172.30.56.105 sport=0 dport=23362 rxbytes=4508 rxpkts=46 rxrelbytes=0 rxrelpkts=0 est period=0 src=172.30.56.105 dst=172.20.56.105 sport=23362 dport=0 txbytes=4508 txpkts=46 txrelbytes=0 txrelpkts=0"]
}

项目设计

从网络数据路径上分析, Linux XDP HOOK 只能处理入向报文,无法处理 主机主动出向报文,所以该项目只能做网络数据转发。网络报文是双向的, 为 了区分出入向流量,需要两张网络设备,如图所示:

要实现连接跟踪,首先要解析网络报文,提取 Flow 项(五元组),然后建 立连接信息数据库(conntrack table),最后拦截网络报文信息,不断更新数 据库。如图所示

将 eBPF 程序挂载到网络设备上,Parse-Match Action-Deparse 每一个网 络报文,遇到处理不了的可以送到内核栈处理,可以成为网络栈的一种延伸。

Conntrack Table ebpf map
Parer/Deparser bpf_tail_call

BPF Map 定义

  • meta : 存储元数据,每个序号都要含义,比如 Index:0 表示系统启动时 间 ktime
  • jt : Jump Table, 用于 bpf_tail_call 程序跳转
  • ctt : Conntrack Table 存储 flow
struct {__uint(type, BPF_MAP_TYPE_ARRAY);__type(key, __u32);__type(value,__u64);__uint(max_entries, 4);
} meta SEC(".maps"); //meta table
struct {__uint(type, BPF_MAP_TYPE_PROG_ARRAY);__type(key, 0x04);__type(value, 0x04);__uint(max_entries, 30);
} jt SEC(".maps"); //jump table
struct {__uint(type, BPF_MAP_TYPE_LRU_HASH);__type(key, struct ipv4_ct_tuple);__type(value, struct ipv4_ct_entry);__uint(max_entries, 1024);
} ctt SEC(".maps"); //conntrack table

BPF Prog 定义

PROG(ingress)(struct xdp_md *ctx) {// 处理入向报文
}
PROG(egress)(struct xdp_md *ctx) {// 处理出向报文
}
PROG(prs_eth)(struct xdp_md *ctx) {// 解析以太网协议
}
PROG(prs_ipv4)(struct xdp_md *ctx) {// 解析IPv4协议
}
PROG(prs_icmp)(struct xdp_md *ctx) {// 解析ICMP协议
}
PROG(prs_tcp)(struct xdp_md *ctx) {// 解析TCP协议
}
PROG(prs_udp) (struct xdp_md *ctx) {// 解析UDP协议
}
PROG(ct)(struct xdp_md *ctx) {// 处理CT
}
PROG(prs_end)(struct xdp_md *ctx) {// Deparser
}

Parser 逐层解析报文,例如,解析以太网、解析 IPv4、解析 ICMP/TCP/UDP 报文。每个 Prog eBPF 程序入参是 struct xdp_md *ctx,是如何在 PROG(prs_ipv4) 中避免重复解析 eth。 基于 bpf_xdp_adjust_meta 函 数在报文前扩展内置协议。此项目,扩展内置协议是 struct flow 存储 Flow 需要 的参数。

struct xdp_buff {void *data;void *data_end;void *data_meta;void *data_hard_start;struct xdp_rxq_info *rxq;
};
struct flow {__be32 sip;__be32 dip;__be32 sport:16,dport:16;__u32 proto:8,delta:8,bytes:16;__u32 urg:1,ack:1,psh:1,rst:1,syn:1,fin:1,rel:1,dir:1,reserved:24;
} __attribute__((packed));

CT 状态转换

CT 状态转换跟踪 flow 信息,像 UDP,ICMP 等无状态相对 TCP 更简单,TCP 本身面向连接且有状态转换相对复杂。UDP 报文需要注意related 报文。每个conntrack状态需要设置过期时间。TCP 的连接跟踪状态转换图如下:

实验环境

系统版本

ubuntu 21.10

Namespace 网络环境

#创建 namespace
ip netns del ns1
ip netns del ns2
ip netns add ns1
ip netns add ns2
8
#创建veth 虚拟网络设备
ip link add ns1-wan type veth peer name ns1-lan
ip link add ns2-wan type veth peer name ns2-lan
ip link set ns1-lan up
ip link set ns1-wan up
ip link set ns2-lan up
ip link set ns2-wan up
ip link set ns1-wan netns ns1
ip link set ns2-wan netns ns2
ip netns exec ns1 ip link set dev ns1-wan up
ip netns exec ns2 ip link set dev ns2-wan up
ip addr add 172.20.56.1/24 brd 172.20.56.255 dev ns1-lan
ip addr add 172.30.56.1/24 brd 172.30.56.255 dev ns2-lan
sysctl -w net.ipv4.conf.all.forwarding=1
sysctl -w net.ipv6.conf.all.forwarding=1
ip netns exec ns1 ip addr add 172.20.56.105/24 brd 172.20.56.255 dev ns1-wan
ip netns exec ns1 ip route add default via 172.20.56.1 dev ns1-wan
ip netns exec ns2 ip addr add 172.30.56.105/24 brd 172.30.56.255 dev ns2-wan
ip netns exec ns2 ip route add default via 172.30.56.1 dev ns2-wan

安装CT程序

dpkg -i ct-0.0.1-0-x86_64.deb
systemctl start ct

挂载 eBPF 程序

ip link set dev ns1-lan xdp pinned /sys/fs/bpf/prog/xdp_0
ip link set dev ns2-lan xdp pinned /sys/fs/bpf/prog/xdp_1

后记

购买文档 免费送源代码
购买文档 免费送源代码
购买文档 免费送源代码

加vx, 免费一次答疑

eBPF/XDP实现Conntrack功能相关推荐

  1. polycube--基于ebpf/xdp的网络套件(网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器)

    1. Polycube简介 Polycube是基于Linux ebpf/xdp的开源软件框架,提供了快速,轻量级的 网络功能,例如网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器等. 可以组合 ...

  2. eBPF/XDP实现防火墙功能

    基于eBPF/XDP实现防火墙功能 概述 环境配置 Ubuntu >= 20.10 必备工具bpftool bpffs 持久化 设计与实现 防火墙程序 安装程序 接口指南 错误码表 加载eBPF ...

  3. 一文读懂eBPF/XDP

    目录 XDP概述 XDP数据结构 XDP与eBPF的关系 XDP操作模式 XDP操作结果码 XDP和iproute2加载器 XDP和BCC XDP概述 XDP是Linux网络路径上内核集成的数据包处理 ...

  4. 初识 eBPF(功能、原理、及一些应用)

    非常棒的一些材料 当eBPF遇上Linux内核网络 什么是 eBPF? 待看 基于eBPF监控和排查云原生环境中的磁盘IO性能问题 深度解密基于 eBPF 的 Kubernetes 问题排查全景图 e ...

  5. Linux网络新技术基石 |​eBPF and XDP

    hi,大家好,欢迎来到极客重生的世界,今天给大家分享的是Linux 网络新技术,当前正流行网络技是什么?那就是eBPF和XDP技术,Cilium+eBPF超级火热,Google GCP也刚刚全面转过来 ...

  6. Linux eBPF和XDP高速处理数据包;使用EBPF编写XDP网络过滤器;高性能ACL

    目录 eBPF和XDP以裸机速度处理数据包 通过网络堆栈的入口数据包流 XDP构造 在Go中编程XDP 结论 使用EBPF编写XDP网络过滤器 01.简介 02.什么是XDP 03.示例问题 04. ...

  7. 使用 eBPF 和 XDP 高速处理数据包

    " 一个互联网技术玩家,爱聊技术的家伙.在工作和学习中不断思考,把这些思考总结出来,并分享,和大家一起交流进步." 前言 本文是一篇学习翻译文章,原文链接在文章末尾. XDP 是一 ...

  8. Linux网络新技术基石:eBPF and XDP

    hi,大家好,欢迎来到极客重生的世界,今天给大家分享的是Linux 网络新技术,当前正流行网络技是什么?那就是eBPF和XDP技术,Cilium+eBPF超级火热,Google GCP也刚刚全面转过来 ...

  9. eBPF 在网易轻舟云原生的应用实践

    作者 | 李阳,陈启钧 策划 | 田晓旭 首发 | InfoQ eBPF 是 Linux 内核近几年最为引人注目的特性之一,通过一个内核内置的字节码虚拟机,完成数据包过滤.调用栈跟踪.耗时统计.热点分 ...

最新文章

  1. mysql 3/17/2016
  2. python怎么样才算入门编程-新手如何快速入门Python编程?听过来人说经验!
  3. 十分简洁的手机浏览器 lydiabox
  4. Visual C#之核心语言
  5. RHEL部署ipa红帽身份验证
  6. 前端学习(1185):数据响应式
  7. [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
  8. 【OpenCV 例程200篇】25. 图像的平移
  9. php计算器等号没反应,为什么按等号没有反应?
  10. 恭喜您被选为CSDN插件内测用户:点此领取福利
  11. Python图像纹理分割
  12. vscode插件(安装路径),压缩js文件解压,方便查看
  13. 自然语言处理(3)——形式语言与自动机
  14. 淘汰安卓机废物利用(三) 网站服务器,安卓手机当服务器的方法,完成废物利用...
  15. OpenLayers汇总目录
  16. Java学习:从入门到精通week3
  17. 秒 毫秒 微秒 纳秒 Hz KHz MHz GHz
  18. 阿里实时计算平台的演进和运维
  19. 桌面每日一句--桌面翻译工具(有道翻译,微软翻译,Google翻译)
  20. FIDL:Flutter与原生通讯的新姿势,不局限于基础数据类型

热门文章

  1. 前端js、功能性工具插件网站(持续更新,欢迎分享)
  2. 好用的短链接生成器,活码生成器
  3. [nk] 糟糕的打谱员 线性DP
  4. 【玩转ESP32】17、PWM调光
  5. linux安装浏览器 linux本地浏览器进行访问
  6. c语言税务信息申报系统,四川税务网上申报系统
  7. h5+(mui) 截图分享微信
  8. 不用升级 普通MP4也能看PDF ---PDFtoJPG
  9. 2021招商银行信用卡Mgeeker竞赛
  10. 最新流量卡官网介绍单页源码