數據報文去哪兒了

背景

? ? ? ? 今天遇到一個詭異的現象,當接口附加一個IP時,主IP業務正常,附加IP死活不行,tcpdump抓包確可以正常抓到到業務的報文,但是在PREROUTING raw添加規則確沒有命中,說明報文沒有到netfilter框架內,Scapy打流測試,通過bpftrace 跟蹤kfree_skb,沒有捕獲大量的kfree_skb 調用,才引發今天的問題,數據報文去哪兒了?

結論

? ? ? ? 由于上層設備發送報文時,將附加IP的MAC地址填錯導致,但是tcpdump可以明確報文已經到了主機,但是為什么卻沒有往netfilter框架遞送,bpftrace 為什么沒有捕獲大量的kfree_skb?? 簡單的講錯誤的MAC地址,正確的IP 是否可以正常通信?為什么?

內核源碼分析

? ? ? ? 本文使用內核版本 5.10, 網卡驅動 e1000e

? ? ? ? 我們知道當網卡工作在直接模式(Direct Model)時,網卡只接收自己MAC地址的幀,此模式下通過scapy打流不匹配的目的mac地址時,數據幀直接被網卡層面丟棄,bpftrace 此時無法捕獲kfree_skb事件。

? ? ? ? 當使用tcpdump工具時會將網卡設置為混雜模式(Promiscuous Model),不匹配自己的MAC地址也會接收交給網卡驅動處理。

/*** e1000_receive_skb - helper function to handle Rx indications* @adapter: board private structure* @netdev: pointer to netdev struct* @staterr: descriptor extended error and status field as written by hardware* @vlan: descriptor vlan field as written by hardware (no le/be conversion)* @skb: pointer to sk_buff to be indicated to stack**/
static void e1000_receive_skb(struct e1000_adapter *adapter,struct net_device *netdev, struct sk_buff *skb,u32 staterr, __le16 vlan)
{u16 tag = le16_to_cpu(vlan);e1000e_rx_hwtstamp(adapter, staterr, skb);skb->protocol = eth_type_trans(skb, netdev);if (staterr & E1000_RXD_STAT_VP)__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), tag);napi_gro_receive(&adapter->napi, skb);
}

這里e1000e網卡驅動接收報文,此處注意eth_type_trans(skb, netdev)方法

/*** eth_type_trans - determine the packet's protocol ID.* @skb: received socket data* @dev: receiving network device** The rule here is that we* assume 802.3 if the type field is short enough to be a length.* This is normal practice and works for any 'now in use' protocol.*/
__be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
{unsigned short _service_access_point;const unsigned short *sap;const struct ethhdr *eth;skb->dev = dev;skb_reset_mac_header(skb);eth = (struct ethhdr *)skb->data;skb_pull_inline(skb, ETH_HLEN);/* 此處目的MAC不是設備DEV地址時,命中條件 */if (unlikely(!ether_addr_equal_64bits(eth->h_dest,dev->dev_addr))) {/* 檢測目的MAC是否為多播或者組播 */if (unlikely(is_multicast_ether_addr_64bits(eth->h_dest))) {if (ether_addr_equal_64bits(eth->h_dest, dev->broadcast))skb->pkt_type = PACKET_BROADCAST;elseskb->pkt_type = PACKET_MULTICAST;} else {skb->pkt_type = PACKET_OTHERHOST;}}if (likely(eth_proto_is_802_3(eth->h_proto)))return eth->h_proto;.....
}

當我們的目的MAC地址與自身dev地址不匹配時,會將pkt_type =?PACKET_OTHERHOST 然后返回eth->proto, 這里我們使用的IP報文,也就是將來會使用ip_rcv()處理。

然后通過NAPI接口,__netif_receive_skb_core,等一系列調用最終調用到ip_rcv_core()

/** 	Main IP Receive routine.*/
static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
{const struct iphdr *iph;u32 len;/* When the interface is in promisc. mode, drop all the crap* that it receives, do not try to analyse it.*/if (skb->pkt_type == PACKET_OTHERHOST)goto drop;......drop:kfree_skb(skb);
out:return NULL;
}

這里有明確的注釋說明,混雜模式的報文即pkt_type為PACKET_OTHERHOST值,直接丟棄,并且此處的drop,內核協議棧層面并沒有做任何的丟包統計。

總結

經過分析我們可以總結我們遇到的問題,

1,通過scapy打流測試,為什么bpftrace沒有捕獲到大量的kfree_skb事件?

? ? ?這是因為網卡工作在直接模式(Direct Model)網卡將目的MAC不是自己的直接丟棄,驗證這個想象,可以直接使用tcpdump 工具抓包,此時bpftrace 可以捕獲大量的kfree_skb事件。

2,tcpdump 捕獲到去往自己IP的報文,為什么沒有到netfilter框架?

? ? ? ?這是因為tcpdump將網卡設置為混雜模式(Promiscuous Model)網卡驅動接收報文并將報文類型置為PACKET_OTHERHOST,當ip_rcv_core()接收后直接丟棄,并且沒有在任何地方做丟包統計的動作。

感受

? ? 工作中遇到的每個小問題,背后都蘊藏著大量知識,只有平時多積累總結,才能游刃有余解決所面對的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163544.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163544.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163544.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RTL8762D SDK

0 Preface/Foreword SDK: Software Development kit 1、硬件介紹 1.1 General Description A624RO基本信息: ultra-low-powerBluetooth 5.1 low energy applicationsa leading RF transceiverlow-power ARM Cortex-M4FIR transceiver 1.1.1 MCU platform MCU…

openssl加解密-干貨分享

0.需要包含的頭文件和預定義常量 #include <openssl/rand.h>#include <fstream>#include <openssl/aes.h>#include <openssl/rand.h>// 加密密鑰和初始化向量&#xff08;IV&#xff09;長度#define AES_KEY_LENGTH 32#define AES_IV_LENGTH 16 1.密…

競賽選題 題目:垃圾郵件(短信)分類 算法實現 機器學習 深度學習 開題

文章目錄 1 前言2 垃圾短信/郵件 分類算法 原理2.1 常用的分類器 - 貝葉斯分類器 3 數據集介紹4 數據預處理5 特征提取6 訓練分類器7 綜合測試結果8 其他模型方法9 最后 1 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 基于機器學習的垃圾郵件分類 該項目…

3分鐘使用 WebSocket 搭建屬于自己的聊天室(WebSocket 原理、應用解析)

文章目錄 WebSocket 的由來WebSocket 是什么WebSocket 優缺點優點缺點 WebSocket 適用場景主流瀏覽器對 WebSocket 的兼容性WebSocket 通信過程以及原理建立連接具體過程示例Sec-WebSocket-KeySec-WebSocket-Extensions 數據通信數據幀幀頭&#xff08;Frame Header&#xff09…

組合數學學習

指數生成函數可以與排列結合在一起&#xff0c;而冪級數和 組合結合在一起 如果要進行計算的值不是一個具體的值&#xff0c;那么就要考慮生成函數

Windows如何使用key登錄Linux服務器

場景&#xff1a;因為需要回收root管理員權限&#xff0c;禁止root用戶遠程登錄&#xff0c;辦公環境只允許普通用戶遠程登錄&#xff0c;且不允許使用密碼登錄。 一、生成與配置ssh-key 1.使用root管理員權限登錄到目標系統。 2.創建一個新的普通用戶&#xff0c;和設置密碼用…

Java,File類與IO流,File類與IO流的概述

File的概述&#xff1a; File定義在java.io包下。 一個File對象代表硬盤或網絡中可能存在的一個文件或者文件目錄&#xff08;俗稱文件夾&#xff09;&#xff0c;與平臺無關。 File能新建、刪除、重命名文件和目錄&#xff0c;但File不能訪問文件內容本身。如果需要訪問文件…

用uniapp在微信小程序實現畫板(電子簽名)功能

目錄 一、效果展示 二、插件推薦與引入 三、代碼具體應用 四、h5端將base64轉換為url 一、效果展示 二、插件推薦與引入 手寫板、簽字板&#xff1b;<zwp-draw-pad /> - DCloud 插件市場 這個在微信小程序引入時內容簡單&#xff0c;且涉及的方法很多&#xff0c;…

【C/C++】排序算法代碼實現

這里&#xff0c;匯總了常見的排序算法具體代碼實現。使用C語言編寫。 排序算法實現 插入排序冒泡排序選擇排序快速排序希爾排序歸并排序 插入排序 #include <stdio.h> #include <stdlib.h>void InsertSort(int arr[],int n){int i,j,temp;for(i 1;i < n;i){ …

Pinia狀態持久化——插件pinia-plugin-persistedstate

pinia-plugin-persistedstate 旨在通過一致的 API 為 Pinia Store 提供持久化存儲。如果希望保存一個完整的 Store&#xff0c;或者需要細粒化配置 storage 和序列化的方式&#xff0c;該插件都提供了相應的功能&#xff0c;并且可以在想要持久化的 Store 上使用相同的配置。 …

Python 異常的傳遞性

實例 這里就簡單用2個function來演示一下異常的傳遞性 func1 這里num 1/0明顯是一個ZeroDivisionError錯誤&#xff0c;作為演示 def func1():print("fun1 開始執行")num 1 / 0print("func1 結束執行") func2 def func2():print("func2 開始執…

tomcat國密ssl測試

文章目錄 程序包準備部署配置訪問測試 程序包準備 下載 tomcat8.5 https://www.gmssl.cn/gmssl/index.jsp 下載 tomcat 國密組件及證書 本次測試所有的程序文件均已打包&#xff0c;可以直接 點擊下載 部署配置 自行完成 完成centos 的jdk配置。 部署tomcat,將 gmssl4t.jar…

數字孿生農村供水工程平臺:為鄉村振興注入新活力

隨著科技的不斷進步&#xff0c;數字孿生技術逐漸成為各行業創新發展的重要驅動力。在水利領域&#xff0c;數字孿生農村供水平臺以其獨特的優勢&#xff0c;為農村供水系統帶來了革命性的變革。本文將為您詳細介紹數字孿生農村供水平臺的核心特點及優勢&#xff0c;帶您領略智…

深度學習常見激活函數:ReLU,sigmoid,Tanh,softmax,Leaky ReLU,PReLU,ELU整理集合,應用場景選擇

文章目錄 1、ReLU 函數&#xff08;隱藏層中是一個常用的默認選擇&#xff09;1.1 優點1.2 缺點 2、sigmoid 函數2.1 優點2.2 缺點 3、Tanh 函數3.1 優點3.2 缺點 4、softmax 函數&#xff08;多分類任務最后一層都會使用&#xff09;5、Leaky ReLU 函數5.1 優點5.2 缺點 6、PR…

mongo DB -- aggregate分組查詢后字段展示

一、分組查詢 在mongoDB中可以使用aggregate中的$group操作對集合中的文檔進行分組,但是查詢后的數據不顯示其他字段,只顯示分組字段 aggregate進行分組示例 db.collection.aggregate([{$group: {_id: "$field"}},]) 查詢后顯示 展開只顯示兩個字段 二、顯示所有字段…

APM工具skywalking部署

一 整體架構 整個架構&#xff0c;分成上、下、左、右四部分&#xff1a; 上部分 Agent &#xff1a;負責從應用中&#xff0c;收集鏈路信息&#xff0c;發送給 SkyWalking OAP 服務器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 數據信息。而我們目前采用的是&…

Rust - cargo項目里多個二進制binary crate的編譯運行

目錄 foo - Cargo.toml - src - - main.rs - - bin - - - other-bin.rs將除默認入口文件外待作為二進制crate處理的文件放在src/bin目錄下 方法一&#xff1a; 命令行增加配置項 --bin xxx cargo run --bin foo // 注意! 這里是包名&#xff0c;不是main cargo run --bin o…

SQL基礎理論篇(九):存儲過程

文章目錄 簡介存儲過程的形式定義一個存儲過程使用delimiter定義語句結束符存儲過程中的三種參數類型流控制語句 存儲過程的優缺點參考文獻 簡介 存儲過程Stored Procedure&#xff0c;SQL中的另一個重要應用。 前面說的視圖&#xff0c;只能勉強跟編程中的函數相似&#xff…

MySQL -- JDBC

1、JDBC是什么&#xff1a; 是SUN公司制定的一套接口(interface)。接口都有調用者和實現者。面向接口調用、面向接口寫實現類&#xff0c;這都屬于面向接口編程。 2、在使用JDBC的六個步驟&#xff1a; 1.注冊驅動&#xff08;告訴Java程序&#xff0c;即將連接的是哪個品牌…

業務系統上云后,如何滿足員工移動辦公快速訪問業務系統的需求?

在企業業務上云的大趨勢下&#xff0c;SaaS應用、云端辦公協同工具等多種遠程辦公應用系統開始大規模普及&#xff0c;企業員工可以隨時隨地訪問云上業務數據。然而現實情況卻十分“打臉”&#xff0c;企業隨時隨地要訪問云上業務的需求越迫切&#xff0c;問題就越大。由于多種…