当前位置: 首页 > news >正文

eBPFxdp prog

// xdp_tun_nat.c - 修改版:匹配时也返回 XDP_PASS,让内核继续处理// 编译命令同上#include<linux/bpf.h>#include<linux/ip.h>#include<linux/tcp.h>#include<bpf/bpf_helpers.h>#include<bpf/bpf_endian.h>#ifndefIPPROTO_TCP#defineIPPROTO_TCP6#endif#ifndefIP_MF#defineIP_MF0x2000#endif#ifndefIP_OFFSET#defineIP_OFFSET0x1FFF#endifstatic__inline__ __be16csum_fold(__u32 csum){csum=(csum&0xffff)+(csum>>16);csum=(csum&0xffff)+(csum>>16);return(__be16)~csum;}structipv4_tuple{__be32 saddr;__be32 daddr;__be16 sport;__be16 dport;};structnat_entry{__be32 new_saddr;__be32 new_daddr;__be16 new_sport;__be16 new_dport;};struct{__uint(type,BPF_MAP_TYPE_HASH);__uint(max_entries,100000);__type(key,structipv4_tuple);__type(value,structnat_entry);}nat_tableSEC(".maps");SEC("xdp")intxdp_tun_nat(structxdp_md*ctx){void*data_end=(void*)(long)ctx->data_end;void*data=(void*)(long)ctx->data;structiphdr*ip=data;if((void*)(ip+1)>data_end)returnXDP_PASS;if(ip->version!=4)returnXDP_PASS;if(ip->protocol!=IPPROTO_TCP)returnXDP_PASS;if(ip->frag_off&bpf_htons(IP_MF|IP_OFFSET))returnXDP_PASS;unsignedintip_hdr_len=ip->ihl<<2;if(ip_hdr_len<sizeof(structiphdr))returnXDP_PASS;structtcphdr*tcp=(void*)ip+ip_hdr_len;if((void*)(tcp+1)>data_end)returnXDP_PASS;structipv4_tuplekey={.saddr=ip->saddr,.daddr=ip->daddr,.sport=tcp->source,.dport=tcp->dest,};structnat_entry*entry=bpf_map_lookup_elem(&nat_table,&key);if(!entry)returnXDP_PASS;// 无映射,交给 TUN// 记录原始值__u32 old_saddr=ip->saddr;__u32 old_daddr=ip->daddr;__u16 old_sport=tcp->source;__u16 old_dport=tcp->dest;// 修改 IPip->saddr=entry->new_saddr;ip->daddr=entry->new_daddr;// 增量 IP 校验和__wsum sum_ip=0;sum_ip=bpf_csum_diff(&old_saddr,4,&entry->new_saddr,4,sum_ip);sum_ip=bpf_csum_diff(&old_daddr,4,&entry->new_daddr,4,sum_ip);__u32 old_ip_csum=ip->check;ip->check=0;ip->check=(__be16)~csum_fold(old_ip_csum+sum_ip);// 修改 TCP 端口tcp->source=entry->new_sport;tcp->dest=entry->new_dport;// 增量 TCP 校验和__wsum sum=0;sum=bpf_csum_diff(&old_saddr,4,&entry->new_saddr,4,sum);sum=bpf_csum_diff(&old_daddr,4,&entry->new_daddr,4,sum);__be32 old_sport32=(__be32)old_sport;__be32 new_sport32=(__be32)entry->new_sport;__be32 old_dport32=(__be32)old_dport;__be32 new_dport32=(__be32)entry->new_dport;sum=bpf_csum_diff(&old_sport32,4,&new_sport32,4,sum);sum=bpf_csum_diff(&old_dport32,4,&new_dport32,4,sum);__u32 old_csum=tcp->check;tcp->check=0;__u32 new_csum=old_csum+sum;tcp->check=(__be16)~csum_fold(new_csum);// 关键修改:匹配后仍然返回 XDP_PASS,让内核继续处理returnXDP_PASS;}char_license[]SEC("license")="GPL";
http://www.jsqmd.com/news/541003/

相关文章:

  • 2026年AIGC论文检测指南:精选几个好用的网站,AIGC免费论文检测/AIGC检测,AIGC论文检测网站口碑排行
  • 如何构建多语言文件系统:libfuse国际化支持完整指南
  • OFA视觉蕴含模型保姆级教学:从环境配置到实际应用全流程
  • 2026年3月淮安搬家保洁公司最新推荐:居民搬家、企业搬厂、保洁服务等领域选择指南 - 海棠依旧大
  • 九江生发理疗哪家好?黑奥秘四大专利成分激活毛囊促生发 - 美业信息观察
  • Uvicorn源码中的中介者模式:组件解耦与通信中心
  • 2026年淮安搬家公司参考指南:淮安市万弘搬家有限公司、淮安退伍军人搬家、长短途搬家、正规搬家、企业搬、鱼缸钢琴搬运、淮安搬家保洁一站式服务 - 海棠依旧大
  • 0 元学嵌入式 GUI!保姆级 LVGL+MicroPython 教程开更,从理论到实战全搞定
  • Coze本地部署实战:从零到一构建你的AI智能体开发环境
  • 利用快马平台快速构建高清乱码生成器:编码错误可视化原型开发指南
  • MangoHud电源使用监控工具:自定义脚本终极指南
  • Windows Defender一键禁用工具:三步彻底关闭系统安全防护的完整指南
  • 车机开发中如何卸载蓝牙驱动及安装蓝牙驱动
  • 前端性能优化终极指南:使用Javalin实现静态资源压缩与智能缓存
  • 终极指南:ente/auth开发环境搭建从源码到运行的完整步骤
  • 如何用Bats自动化测试框架构建高可用性系统:验证故障转移逻辑的完整指南 [特殊字符]
  • Ubuntu上安装 WinBoat(让linux上运行windows软件)
  • 实测2-5分钟:CogVideoX-2b生成速度与画质平衡的真实体验报告
  • FLT-3L蛋白在急性髓系白血病FLT3突变研究中的意义
  • REST Client扩展终极配置迁移指南:从旧版本平滑升级到最新版本
  • pdf2htmlEX代码质量门禁实施:从设置到执行的完整流程
  • 编码规范
  • 2026年3月厦门发电机出租公司最新推荐:发电机、发电车租赁及泉州、漳州、莆田及各区域适配指南适配指南 - 海棠依旧大
  • SEO_网站SEO排名下降的常见原因及解决办法(304 )
  • 【优化求解】基于matlab粒子群算法PSO牛乳酪蛋白颗粒粒径分布反演【含Matlab源码 15228期】含参考文献
  • 2025终极发布指南|ente/auth从代码到用户的完整发布流程
  • Eclipse Mraa多平台支持:从树莓派到Intel Joule的无缝移植教程
  • Boss-Key老板键:如何用3分钟掌握一键隐藏窗口的终极技巧
  • 终极指南:如何解决markdown-preview.nvim防火墙问题并配置本地服务器端口
  • 黄冈去哪做头皮检测靠谱?黑奥秘手机查检测报告,改善变化看得见 - 美业信息观察