eBPF/XDP实现Conntrack功能
文章目录
- 项目背景
- 项目设计
- 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功能相关推荐
- polycube--基于ebpf/xdp的网络套件(网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器)
1. Polycube简介 Polycube是基于Linux ebpf/xdp的开源软件框架,提供了快速,轻量级的 网络功能,例如网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器等. 可以组合 ...
- eBPF/XDP实现防火墙功能
基于eBPF/XDP实现防火墙功能 概述 环境配置 Ubuntu >= 20.10 必备工具bpftool bpffs 持久化 设计与实现 防火墙程序 安装程序 接口指南 错误码表 加载eBPF ...
- 一文读懂eBPF/XDP
目录 XDP概述 XDP数据结构 XDP与eBPF的关系 XDP操作模式 XDP操作结果码 XDP和iproute2加载器 XDP和BCC XDP概述 XDP是Linux网络路径上内核集成的数据包处理 ...
- 初识 eBPF(功能、原理、及一些应用)
非常棒的一些材料 当eBPF遇上Linux内核网络 什么是 eBPF? 待看 基于eBPF监控和排查云原生环境中的磁盘IO性能问题 深度解密基于 eBPF 的 Kubernetes 问题排查全景图 e ...
- Linux网络新技术基石 |eBPF and XDP
hi,大家好,欢迎来到极客重生的世界,今天给大家分享的是Linux 网络新技术,当前正流行网络技是什么?那就是eBPF和XDP技术,Cilium+eBPF超级火热,Google GCP也刚刚全面转过来 ...
- Linux eBPF和XDP高速处理数据包;使用EBPF编写XDP网络过滤器;高性能ACL
目录 eBPF和XDP以裸机速度处理数据包 通过网络堆栈的入口数据包流 XDP构造 在Go中编程XDP 结论 使用EBPF编写XDP网络过滤器 01.简介 02.什么是XDP 03.示例问题 04. ...
- 使用 eBPF 和 XDP 高速处理数据包
" 一个互联网技术玩家,爱聊技术的家伙.在工作和学习中不断思考,把这些思考总结出来,并分享,和大家一起交流进步." 前言 本文是一篇学习翻译文章,原文链接在文章末尾. XDP 是一 ...
- Linux网络新技术基石:eBPF and XDP
hi,大家好,欢迎来到极客重生的世界,今天给大家分享的是Linux 网络新技术,当前正流行网络技是什么?那就是eBPF和XDP技术,Cilium+eBPF超级火热,Google GCP也刚刚全面转过来 ...
- eBPF 在网易轻舟云原生的应用实践
作者 | 李阳,陈启钧 策划 | 田晓旭 首发 | InfoQ eBPF 是 Linux 内核近几年最为引人注目的特性之一,通过一个内核内置的字节码虚拟机,完成数据包过滤.调用栈跟踪.耗时统计.热点分 ...
最新文章
- mysql 3/17/2016
- python怎么样才算入门编程-新手如何快速入门Python编程?听过来人说经验!
- 十分简洁的手机浏览器 lydiabox
- Visual C#之核心语言
- RHEL部署ipa红帽身份验证
- 前端学习(1185):数据响应式
- [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
- 【OpenCV 例程200篇】25. 图像的平移
- php计算器等号没反应,为什么按等号没有反应?
- 恭喜您被选为CSDN插件内测用户:点此领取福利
- Python图像纹理分割
- vscode插件(安装路径),压缩js文件解压,方便查看
- 自然语言处理(3)——形式语言与自动机
- 淘汰安卓机废物利用(三) 网站服务器,安卓手机当服务器的方法,完成废物利用...
- OpenLayers汇总目录
- Java学习:从入门到精通week3
- 秒 毫秒 微秒 纳秒 Hz KHz MHz GHz
- 阿里实时计算平台的演进和运维
- 桌面每日一句--桌面翻译工具(有道翻译,微软翻译,Google翻译)
- FIDL:Flutter与原生通讯的新姿势,不局限于基础数据类型