Linux 从网卡到TCP IP协议栈数据流跟踪与审计
前沿
在学代码审计,然后最近做Linux协议栈的审计,发现Linux不愧是一个久经考验的系统,本来以为可以找到个DoS的,结果发现其在TCP/IP协议栈的链路层实现,利用了各种技术,用来提高性能与安全性。
工具
在跟踪数据从网卡到TCP/IP协议栈的过程中,使用4.10.0内核,利用understand查看代码,以及flawfinder来配合进行安全性的检查。以intel e1000 驱动为列。
分析
NAPI
首先,为了效率,Linux使用了NAPI机制。所谓NAPI机制,其就是当数据到来时,采用中断加轮询的方式,接受数据包。
如果Linux使用中断的方式,接受数据包的话,每次数据包的到来,就会产生中断,这样,当有大量数据包到来的话,其中断开销就比较大,如果CPU是单核,且频率较低的话,就有可能够造成DoS攻击。
如果只是使用轮询的话,那么当没有数据包到来时,会造成CPU浪费在无用功上。
所有Linux内核黑客发明了NAPI机制,中断与轮询相互结合的方式。
当数据到来时,会产生中断,设备首先会关闭自身中断,然后将该网卡设备,加入到轮询表中,然后进而触发软中断,使用轮询接受数据包,然后当该设备上没有数据时,打开该设备的中断。
其内核实现路径为:
数据到来,触发中断,调用网卡中断函数e1000_intr(/drivers/net/ethernet/intel/e1000/e1000_main.c),其会将该设备加入到轮询表中(struct softnet_data中的poll_list,其中softnet_data是每个CPU所独有的),然后触发软中断NET_RX_SOFTIRQ。软中断会进一步回调设备注册的轮询函数,e1000设备驱动是e1000_clean。然后调用e1000_clean_rx_irq轮询接受数据包。
GRO
GRO,其实就是Generic receive offload。通过在进入到Linux 内核TCP IP协议栈处理之前,将多个数据流合并成一个,减少内核协议栈处理,提高系统性能。
感觉这玩意涉及到数据包的合并,必然涉及到很多内存上面的操作,容易发生一些漏洞什么的,,但是通过结合flawfinder,加人工审计,并没有发现。也可能由于我对skb_buff结构不是很了解,它已经看到了我,我没有看到它。这块到跟进协议栈后,熟悉skb_buff结构体之后,回过来再次看一看。
其实现函数为:napi_gro_receive.就是从底层跟踪到高层协议,查看是否能合并,比如mac 地址相同,就看ip地址是否相同,。。。。
分析发现,其会将不能合并的加入到一个链表中,然后我就想,我是否可以够造恶意数据,让耗尽其内存,然后分析发现too young,too simple。其实现中,会限制链表大小,当超过限制,会强制发送到协议栈中。
RPS RFS
如果没有NAPI机制的话,就有可能耗尽多核中的一个CPU的运算量,但是RPS的出现,让其变得不可能。
RPS RFS 其全称分别是:Receive Packet Steering 与 Receive Flow Steering。顾名思义,其就是让数据处理均衡到每个CPU上。
RPS:用户通过 /sys/class/net/eth0/queues/rx-0/rps_cpus 设置参加负载均衡的CPU。当数据包到来时,会根据相关字段,如ip建立一个hash,然后用来选择一个CPU。
RFS:RFS其实是,RPS的补丁,想象一下,当用户进程等待在另一个CPU上,准备接受数据包时,但是RPS给其分配到了一个不相同的CPU上,这时,当数据包处理完后,该数据包到用户进程所在CPU进一步处理,这样会造成缓存失效,从而降低系统性能。RFS的出现就是为了解决该问题的。
内核函数:get_rps_cpu 选择一个CPU,然后enqueue_to_backlog加入到一个CPU的等待队列
Linux 从网卡到TCP IP协议栈数据流跟踪与审计的更多相关文章
- Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论
我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处 ...
- [转载]Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论
Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论 转载至:https://www.sdnlab.com/17530.html 我们使用Linux作为服务器操作系统时,为了达到高并发处理 ...
- [转帖]Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点
Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点 http://network.51cto.com/art/201909/603780.htm 可以毫不夸张的说现如今的互联网是基于TC ...
- linux OSI七层模型、TCP/IP协议栈及每层结构大揭秘
学习Linux,就算是像小编我这样的小萌新,也知道OSI模型.什么?!你不知道!!! 好吧,这篇秘籍拿走,不谢~~~ 一.两个协议 (1)OSI 协议模型(7层)国际协议 PDU:协议数据单元对 ...
- 用virtualbox+模拟串口+CDT调试linux内核 TCP/IP协议栈-起步
经常有人问一台机器如何将hello经网络发送给另一台机器,我确实是不知道,只能看代码了. 说明:本人对内核的研究学习也是刚刚起步,有很多不了解的,所以文中可能会有一些"一本正经的胡扯&quo ...
- TCP/IP协议栈在Linux内核中的运行时序分析
网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...
- UNIX/Linux网络编程基础:图解TCP/IP协议栈
目录 1.主机到网络层协议:以太网协议 2.IP协议 3.网际控制报文协议(ICMP) 4.传输控制协议(TCP) 5.用户数据报文协议(UDP) 6.流控制传输协议(SCTP) 7.地址解析协议(A ...
- TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现
题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...
- 计算机网络基础之TCP/IP 协议栈
计算机网络基础之TCP/IP 协议栈 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.TCP/IP 协议栈概述 1>.什么是TCP/IP协议栈 Transmission C ...
随机推荐
- 使用git push命令如何忽略不想提交的文件夹或者文件
如下场景是在window下的操作. 在使用node的时候有个node_modules文件夹很大,一般情况下不想提交,忽略的办法如: 方法一(来自评论区):直接在仓库根目录:执行命令echo 'node ...
- C#多线程——同步
多个线程(不仅仅局限于相同进程)如果需要访问相同的可变资源的话就可能需要考虑到线程同步的手段.CPU的线程和进程管控我这里就不去说了,计算机组成原理里面的东西 那么既然要让线程的步调一致,那么我们首先 ...
- Design--源自生活美学的色彩搭配网站(design-seeds)
All the flowers of all the tomorrows are in the seeds of today. 色彩搭配网站--design-seeds.com // 所有的颜色值都是 ...
- [简记] github 上的 GraphQL v4 API
突发奇想,想用github做一个支持rss的blog体系,或者就是知识管理体系,简单看了下,把测试用的暂存起来 # Type queries into this side of the screen, ...
- TortoiseSVN 1.9.5安装 与 Eclipse4.4.2及以上版本中安装SVN插件
引自: http://blog.csdn.net/chenchunlin526/article/details/54631458 TortoiseSVN 1.9.5安装 与 Eclipse4.4.2及 ...
- 从输入url到页面展示到底发生了什么
阅读目录 1.输入地址 2.浏览器查找域名的 IP 地址 3.浏览器向 web 服务器发送一个 HTTP 请求 4.服务器的永久重定向响应 5.浏览器跟踪重定向地址 6.服务器处理请求 7.服务器返回 ...
- WebGL学习笔记(一)
作者:朱金灿 来源:http://blog.csdn.net/clever101 (一)WebGL是什么? WebGL是一门在网页上显示三维图形的技术,你可以把它理解为把OpenGL从C/S端搬到了B ...
- Angular 2基础(一) 环境搭建
Angular2是一款开源JavaScript库,由Google维护,用来创建页面应用程序.正式发布于2016年9月,基于ES6开发. 一.准备工作 使用Angular2开发,需要预先做一些配置上的配 ...
- Android spinner默认样式不支持换行和修改字体样式的解决方法
在spinner中显示的数据过多,需要换行,而Android自身提供的android.R.layout.simple_spinner_dropdown_item样式不支持换行,因此参考android提 ...
- vue权威指南笔记01——样式的设置
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...