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的等待队列

原文地址:https://www.cnblogs.com/r1ng0/p/9787406.html

时间: 2024-10-14 13:08:27

Linux 从网卡到TCP IP协议栈数据流跟踪与审计的相关文章

Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论

我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处理过程,结合Linux内核参数说明和TCP/IP协议栈相关的理论,介绍一些常见的丢包故障定位方法和解决思路. 问题现象 本次故障的反馈现象是:从办公网访问公网服务器不稳定,服务器某些端口访问经常超时,但Ping测试显示客户端与服务器的链路始终是稳定低延迟的. 通过在服务器端抓包,发现还有几个特点:

[转帖]Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点

Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点 http://network.51cto.com/art/201909/603780.htm 可以毫不夸张的说现如今的互联网是基于TCP/IP构建起来的网络.弄懂协议栈的原理,无论对调试网络IO性能还是解决网络问题都是有很大帮助的.本片文章就带领大家来看看内核是如何控制网络数据流的. 作者:底层软件架构来源:今日头条|2019-09-30 09:28 收藏 分享 可以毫不夸张的说现如今的互联网是基于TCP/IP构建起来的网络.弄懂

Linux下TCP/IP协议栈的简单脉络分析

最近在写网络编程方面的一些东西,然后遇到了关于传输上的小问题.由于之前有简单的看过一些TCP/IP详解的一些东西,所以索性就找了本<追踪LinuxTCP/IP代码运行>的书看了一上午,结果发现初次接触这些内核方面的东西,收获甚微.于是又在网上找相关类的大神博客,拿来拜读,虽然依然看的不是太明白,吸收的也不够好,但是我想以博客的形式把它记录下来,也希望能为我以后学这些东西开个好头吧 1.linux的网络协议栈的主要结构 (1)socket层 这层主要处理socket相关的东西,例如其各种结构的初

linux OSI七层模型、TCP/IP协议栈及每层结构大揭秘

学习Linux,就算是像小编我这样的小萌新,也知道OSI模型.什么?!你不知道!!! 好吧,这篇秘籍拿走,不谢~~~ 一.两个协议 (1)OSI 协议模型(7层)国际协议    PDU:协议数据单元对等层次之间传递的数据单位 OSI协议(7层) 国际协议 PDU 单位 功能 实例 7   应用层 application message 为应用程序进程(例:mail.终端防伪)提供网络服务:提供用户访问界面 提供用户身份验证 HTTP Telnet 6   表示层 presention messa

用qemu与gdb调试linux kernel tcp/ip协议栈

description 用gdb debug linux kernel容易吗?其实要走到这步真的不容易啊,其实也难道是不难,就是要知道的东西太多了.用gdb debug linux kernel 可以有2中方式:UML和qemu方式,这里主要说qemu,从源码编译安装qemu很费劲. 准备环境 linux OS: Debian7.5-i386(当时最新的Wheezy,装在VMware10上,我用的在线安装,安装后以text方式跑起来,我的笔记本配置资源有限!) root fs:Debian-Wh

12-1 TCP/IP协议栈

TCP/IP协议栈 有限状态机FSM:Finite State Machine CLOSED 没有任何连接状态 LISTEN 侦听状态,等待来自远方TCP端口的连接请求 SYN-SENT 在发送连接请求后,等待对方确认 SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认 ESTABLISHED 代表传输连接建立,双方进入数据传送状态 FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认 FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关

linux网络编程之TCP/IP基础篇(一)

从今天起,将会接触到网络编程,平台是linux,实现语言C语言,最后将会实现一个简易的miniftp服务器. 主要的内容安排为:linux网络编程之TCP/IP基础篇,SOCKET编程篇,进程间通信篇,线程篇,实战ftp篇. 1.ISO/OSI参考模型:open system interconnection开放系统互联模型是由OSI(international organization for standardization )国际标准化组织定义的网络分层模型,共七层. 各层的具体含义: 物理层

深入浅出TCP/IP协议栈

TCP/IP协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输.TCP/IP协议采用4层结构,分别是应用层.传输层.网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求.由于我们大部分时间都工作在应用层,下层的事情不用我们操心:其次网络协议体系本身就很复杂庞大,入门门槛高,因此很难搞清楚TCP/IP的工作原理,通俗一点讲就是,一个主机的数据要经过哪些过程才能发送到对方的主机上. 那我们就来探索一下这个过程: 0.物

TCP/IP协议栈概述及各层包头分析

一.摘要 对之前几篇博文涉及到的网络通信协议进行分析,概述出TCP/IP的协议栈模型,最后根据实例对各层包头进行分析. 二.标准TCP/IP协议栈模型 标准TCP/IP协议是用于计算机通信的一组协议,通常被称为TCP/IP协议栈,以它为基础组建的互联网是目前国际上规模最大的计算机网络.正因为互联网的广泛应用,使得TCP/IP成为了事实上的网络标准. 1.OSI模型和TCP/IP协议模型 图1是OSI模型和TCP/IP协议模型的对比. 图1 OSI模型和TCP/IP协议模型 2.TCP/IP协议模