Linux 网络:网卡 promiscuous 模式疑云

文章目录

  • 1. 前言
  • 2. 问题场景
  • 3. 问题定位和分析
  • 4. 参考资料

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 问题场景

调试 Marvell 88E6320 时,发现 eth0 出人意料的进入了 promiscuous(混杂) 模式:

[ 5384.145131] device eth0 entered promiscuous mode

Marvell 88E6320eth0 对应 SoCcpsw MAC 芯片的连接拓扑结构如下:
在这里插入图片描述

系统网络设备配置如下:

# ifconfig
eth0      Link encap:Ethernet  HWaddr 60:B6:E1:6E:14:F8  inet6 addr: fe80::62b6:e1ff:fe6e:14f8/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:247 errors:0 dropped:0 overruns:0 frame:0TX packets:32 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:19440 (18.9 KiB)  TX bytes:2560 (2.5 KiB)Interrupt:47lan3      Link encap:Ethernet  HWaddr 60:B6:E1:6E:14:F8  inet addr:192.168.3.5  Bcast:0.0.0.0  Mask:255.255.255.0inet6 addr: fe80::62b6:e1ff:fe6e:14f8/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:247 errors:0 dropped:0 overruns:0 frame:0TX packets:16 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:13018 (12.7 KiB)  TX bytes:1216 (1.1 KiB)lan4      Link encap:Ethernet  HWaddr 62:B6:E1:6E:14:F8  inet addr:192.168.3.8  Bcast:0.0.0.0  Mask:255.255.255.0UP BROADCAST MULTICAST  MTU:1500  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

3. 问题定位和分析

经过一番分析,最后发现,是由下列命令导致 eth0 进入 promiscuous(混杂) 模式:

ip link set dev lan4 address 62:b6:e1:6e:14:f8

这里有两个问题:

1. 操作的 lan4,为什么影响到了 eth0?
2. 不过是一条设置 MAC 的指令,怎么会导致进入 promiscuous(混杂)模式?

跟踪下指令 ip link set dev lan4 address 62:b6:e1:6e:14:f8 流程:

/* ip link 程序通过 netlink 来进行 MAC 设置 */sys_sendmsg()...netlink_unicast()rtnetlink_rcv()netlink_rcv_skb()rtnetlink_rcv_msg()rtnl_newlink()do_setlink()dev_set_mac_address()// 触发 lan4 的 MAC 设置接口ops->ndo_set_mac_address(dev, sa) = dsa_slave_set_mac_address()// 接上面流程
static int dsa_slave_set_mac_address(struct net_device *dev, void *a)
{// 这里回答了问题 1. 操作的 lan4,为什么影响到了 eth0?// @dev   : lan4// @master: eth0// 对 lan4 的操作反映到了 eth0struct net_device *master = dsa_slave_to_master(dev);...if (!ether_addr_equal(addr->sa_data, master->dev_addr)) {err = dev_uc_add(master, addr->sa_data);...}...
}int dev_uc_add(struct net_device *dev, const unsigned char *addr)
{...// 增加一条 单播过滤(unicast filtering)地址 到 eth0err = __hw_addr_add(&dev->uc, addr, dev->addr_len,NETDEV_HW_ADDR_T_UNICAST);if (!err)__dev_set_rx_mode(dev);...
}void __dev_set_rx_mode(struct net_device *dev)
{...if (!(dev->priv_flags & IFF_UNICAST_FLT)) { // 如果 eth0 不支持单播地址过滤// 如果 eth0 不支持单播地址过滤,通过将 eth0 设置为 promiscuous(混杂)// 变相的来支持 eth0 单播地址过滤。if (!netdev_uc_empty(dev) && !dev->uc_promisc) { // 场景下,触发这条执行路径__dev_set_promiscuity(dev, 1, false);dev->uc_promisc = true;}  else if (netdev_uc_empty(dev) && dev->uc_promisc) {__dev_set_promiscuity(dev, -1, false);dev->uc_promisc = false;}}// eth0 的 RX 模式 配置if (ops->ndo_set_rx_mode)ops->ndo_set_rx_mode(dev); // cpsw_ndo_set_rx_mode()
}// 设置网卡 eth0 promiscuous(混杂)模式标记 IFF_PROMISC
static int __dev_set_promiscuity(struct net_device *dev, int inc, bool notify)
{...// 这里回答了问题 2. 不过是一条设置 MAC 的指令,怎么会导致进入 promiscuous(混杂)模式?dev->flags |= IFF_PROMISC;dev->promiscuity += inc;...if (dev->flags != old_flags) {// 对应内核日志:// [ 5384.145131] device eth0 entered promiscuous modepr_info("device %s %s promiscuous mode\n",dev->name,dev->flags & IFF_PROMISC ? "entered" : "left");...dev_change_rx_flags(dev, IFF_PROMISC);}if (notify)__dev_notify_flags(dev, old_flags, IFF_PROMISC);...
}// eth0 的 rx 模式配置
static void cpsw_ndo_set_rx_mode(struct net_device *ndev)
{...if (ndev->flags & IFF_PROMISC) {/* Enable promiscuous mode */cpsw_set_promiscious(ndev, true); // 将 eth0 设为 promiscuous(混杂)模式...}  else {...}...
}

到此,真相浮出水面,原来,交换芯片 port3 (lan3)port4 (lan4),要将数据转发给 eth0。从前面的信息看到,lan3eth0 公用了 MAC ,lan4 配置了一个不同于 eth0 的 MAC,然后将 lan4 的 MAC 添加到 eth0单播过滤(unicast filtering) MAC 列表,这样使得 eth0 除了可以接收 lan3 的数据外,也可以接收 lan4 的数据,同时由于 eth0 不支持 单播过滤(unicast filtering) 功能,所以只能将 eth0 配置为 promiscuous(混杂)模式来变相的达到目的。

4. 参考资料

[1] 4.5.3.1. Unicast Frame Filtering
[2] Layerscape Software Development Kit User Guide
[3] UG10081: Layerscape Linux Distribution POC User Guide

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/35599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Ubuntu上安装Python3

安装 python3 pip sudo apt -y install python3 python3-pip升级 pip python3 -m pip install --upgrade pip验证查看版本 python3 --version

LabVIEW技术交流-控件的禁用属性与Mouse Up事件的一个坑

问题来源 我们平时对控件Mouse Up事件触发使用场景不多,可能在按钮控件上会偶尔用到。在一些场景中,我们用按钮的Mouse Up触发事件,但是又希望在某些限制条件下,按钮会被禁用而不能触发事件。 可是当我们禁用按钮时,它…

第三十一篇——大数据1:从四个特征把握大数据的本质

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 大数据的特征,如果我们没有一个清晰的边界以及明确的定位&…

grpc学习golang版( 四、多服务示例)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写Client客户端五、测试六、示例代码 一、前言 多服务,即一个rpc提供多个服务给外界调用…

大语言模型(LLM)LangChain介绍

LangChain是一个利用大语言模型的能力开发各种下游应用的开源框架,它的核心理念是为各种大语言模型应用实现通用的接口,简化大语言模型应用的开发难度,主要的模块示意图为: Index:提供了各类文档导入、文本拆分、文本向…

STM32中五个时钟源:HSI、HSE、LSI、LSE、PLL

时钟系统是处理器的核心,或者说时钟是单片机的心脏。 1.单片机内部需要储存器、累加器,这些都需要逻辑门电路。比如锁存器就是一个D触发器,而触发器的置1、清0、置数的功能都需要跳变沿。D触发器就是上升沿后存入数据,而这个上升…

SAP CO11N BAPI_PRODORDCONF_CREATE_TT连续报工异步更新导致COGI解决方案

背景: 之前上一个项目上有同事碰到一个问题,外围接口数据进入SAP,可能会对同一工单同一工序进行连续多次报工,并且工序控制码配置的是会自动货物移动的,所以正常来说,调用完BAPI完之后除了报工数量会更新之…

需求之 实现获取调试信息在h5页面,在手机端可以查看调试(二)

事实证明 chatgpt很好用,有不懂的问题可以问它 https://zhuanlan.zhihu.com/p/690118775 国内外9个免费的ChatGPT网站 我筛选出来的比较好用免费的网站 fchat.dykyzdh.cn/ 这个也可以 阿里云的 通义灵码 在vscode中安装使用 而且阿里云有一个产品,可以…

我用过最好的GPT,NewspaceGPT使用心得

记住网址:https://newspace.ai0.cn 前言 只要你能表达明白,NewspaceGPT就不会让你失望。 Gpt4o预测GPT5 IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&…

MATLAB | 怎样绘制这样的环形柱状图

Hey, 各位又是好久不见,最近忙到后台消息都有些来不及看,非常抱歉,今天带来一个环形柱状图绘制的简易小代码,绘制效果如下: 下面直接给出完整代码,替换一下数据即可,代码都有注释的: 完整代码 …

PID理解

一、背景 pid理解 前几天看了bilibili的视频,链接:更好的理解PID【通过推小车的过程】,那个人使用matlab调整pid,另外使用推小车这个假设来解释pid。我其实当时也只是听懂一些,然后后面自己又琢磨。感觉是理解了。这…

python--fasApi学习(Dash+FastAPI框架)

在学习fastApi 框架时,发现了一个好用的框架,参考: 博客参考: https://blog.csdn.net/gitblog_00002/article/details/137331157下载文档并部署: 下载代码: git clone https://gitee.com/insistence2022/…

星戈瑞Sulfo-CY7 NHS Ester结构与荧光性质

【星戈瑞stargraydye】以下数据均来自文献资料,星戈瑞暂未进行独立验证, 仅供参考! Sulfo-Cy7 NHS Ester是一种应用于生物医学领域的荧光染料,其结构特性和荧光性质使其在荧光标记、组织成像和药物追踪等方面发挥着作用。 Sulfo-Cy7 NHS Ester的结构特性…

python接口自动化测试数据和代码分离解析

common中存放的是整个项目中公共使用的封装方法 从工程目录上可以看到区分 datas中专门存放测试数据(yml文件) cases中专门集中存放测试用例 ... 数据分离的第一步先找到工程项目路径 1 2 3 4 5 6 7 8 9 10 11 12 # -*- encoding: utf-8 -*- """ __Software…

6月28日PolarDB开源社区长沙站,NineData联合创始人周振兴将带来《数据库DevOps最佳实践》主题分享

6月28日(周五),PolarDB 开源社区将来到湖南长沙,与湖南的开发者朋友们一起进行数据库技术交流!NineData 联合创始人周振兴受邀参加,并将带来《数据库 DevOps 最佳实践》的主题分享。 本次活动议程&#xff…

GEE问题——EEException:未注册 Earth Engine 或项目未注册。

问题 EEException:未注册 Earth Engine 或项目未注册。 EEException: Not signed up for Earth Engine or project is not registered. 解决方案 在谷歌社区里面这个问题已经被记录了: [Notice] Removing access for unregistered Cloud projects on 2024-06-17 查看下…

SpringBoot集成IotDB

1、引入依赖 <dependency><groupId>org.apache.iotdb</groupId><artifactId>iotdb-session</artifactId><version>0.14.0-preview1</version></dependency><dependency><groupId>cn.hutool</groupId><a…

JAVA小知识29:IO流(上)

IO流是指在计算机中进行输入和输出操作的一种方式&#xff0c;用于读取和写入数据。IO流主要用于处理数据传输&#xff0c;可以将数据从一个地方传送到另一个地方&#xff0c;例如从内存到硬盘&#xff0c;从网络到内存等。IO流在编程中非常常见&#xff0c;特别是在文件操作和…

第4章 客户端-Java客户端Jedis

1.获取Jedis maven配置加入项目中 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.2</version> </dependency>2.Jedis的基本使用 Jedis的使用方法非常简单&#xff0c;只要下面三…

首次30米空间分辨率生成中国年度耕地栅格数据1986-2021

中国1986-2021年30米分辨率年度耕地数据集 数据介绍 精确、详细且及时的耕地范围信息对于粮食安全保障和环境可持续性至关重要。然而&#xff0c;由于农业景观的复杂性和足够训练样本的缺乏&#xff0c;在大范围下进行高时空分辨率的耕地动态监测仍然具有挑战性&#xff0c;尤其…